update
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
-- V1: Initial schema — mirrors the existing schema.sql / data.sql.
|
||||
-- Managed by Flyway; do NOT modify after first deployment.
|
||||
-- Subsequent schema changes belong in V2, V3, ...
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
-- User table
|
||||
CREATE TABLE IF NOT EXISTS user
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(50),
|
||||
realname VARCHAR(50),
|
||||
email VARCHAR(100),
|
||||
password VARCHAR(255), -- must hold BCrypt hashes (>=68 chars); V2 migrates existing data
|
||||
join_time DATETIME,
|
||||
age INTEGER,
|
||||
avatar TEXT,
|
||||
gender CHAR(10),
|
||||
phone VARCHAR(20),
|
||||
discussions_count INTEGER,
|
||||
comments_count INTEGER,
|
||||
last_seen_time DATETIME,
|
||||
flag INTEGER,
|
||||
level INTEGER
|
||||
);
|
||||
|
||||
-- Discussion (thread) table
|
||||
CREATE TABLE IF NOT EXISTS discussion
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
title VARCHAR(200),
|
||||
content TEXT,
|
||||
comments_count INTEGER,
|
||||
participants_count INTEGER,
|
||||
number_index INTEGER,
|
||||
start_time DATETIME,
|
||||
start_user_id INTEGER,
|
||||
start_post_id INTEGER,
|
||||
last_time DATETIME,
|
||||
last_user_id INTEGER,
|
||||
last_post_id INTEGER,
|
||||
last_post_number INTEGER,
|
||||
is_approved INTEGER,
|
||||
like_count INTEGER,
|
||||
ip_address VARCHAR(200),
|
||||
create_id INTEGER,
|
||||
create_time DATETIME
|
||||
);
|
||||
|
||||
-- Discussion ↔ Tag association table
|
||||
CREATE TABLE IF NOT EXISTS discussiontag
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
discussion_id INTEGER NOT NULL,
|
||||
tag_id INTEGER
|
||||
);
|
||||
|
||||
-- Post (reply/comment) table
|
||||
CREATE TABLE IF NOT EXISTS post
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
discussion_id INTEGER,
|
||||
number INTEGER,
|
||||
time DATETIME,
|
||||
user_id INTEGER,
|
||||
type VARCHAR(20),
|
||||
content TEXT,
|
||||
edit_time DATETIME,
|
||||
edit_user_id INTEGER,
|
||||
parent_id INTEGER,
|
||||
ip_address VARCHAR(200),
|
||||
copyright VARCHAR(200),
|
||||
is_approved INTEGER,
|
||||
create_id INTEGER,
|
||||
create_time DATETIME
|
||||
);
|
||||
|
||||
-- Settings table
|
||||
CREATE TABLE IF NOT EXISTS setting
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
setting_key VARCHAR(50),
|
||||
setting_value TEXT
|
||||
);
|
||||
|
||||
-- Tag table
|
||||
CREATE TABLE IF NOT EXISTS tag
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(200),
|
||||
description VARCHAR(200),
|
||||
color VARCHAR(200),
|
||||
icon VARCHAR(200),
|
||||
position INTEGER,
|
||||
parent_id INTEGER,
|
||||
discussions_count TEXT,
|
||||
last_time DATETIME,
|
||||
last_discussion_id INTEGER,
|
||||
create_id INTEGER,
|
||||
create_time DATETIME
|
||||
);
|
||||
|
||||
-- Like / Collect table
|
||||
CREATE TABLE IF NOT EXISTS likecollect
|
||||
(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
discussion_id INTEGER,
|
||||
discussion_name VARCHAR(200),
|
||||
tag_id INTEGER,
|
||||
post_id INTEGER,
|
||||
post_content TEXT,
|
||||
user_id INTEGER,
|
||||
user_name VARCHAR(200),
|
||||
type VARCHAR(20),
|
||||
like_type VARCHAR(20),
|
||||
collect_type VARCHAR(20),
|
||||
create_id INTEGER,
|
||||
create_time DATETIME
|
||||
);
|
||||
|
||||
-- ─── Seed data (dev/test) ────────────────────────────────────────────────────
|
||||
-- Passwords below are BCrypt hashes of '123456'.
|
||||
-- Generated with: BCrypt.encode("123456")
|
||||
-- DO NOT use these credentials in production.
|
||||
INSERT INTO user (id, username, realname, email, password, join_time, age, avatar, gender, phone,
|
||||
discussions_count, comments_count, last_seen_time, flag, level)
|
||||
VALUES (1, 'admin', '管理员', 'admin@jiscuss.local',
|
||||
'$2a$10$7EqJtq98hPqEX7fNZaFWoOziYXMEIUBm..wTkPE3bsUJn4Lm7oHVC',
|
||||
'2019-09-09 00:00:00', 31, '', '男', '13800000001', 0, 0, '2019-09-09 00:00:00', 1, 1)
|
||||
ON DUPLICATE KEY UPDATE id = id;
|
||||
|
||||
INSERT INTO user (id, username, realname, email, password, join_time, age, avatar, gender, phone,
|
||||
discussions_count, comments_count, last_seen_time, flag, level)
|
||||
VALUES (2, 'test', '测试用户', 'test@jiscuss.local',
|
||||
'$2a$10$7EqJtq98hPqEX7fNZaFWoOziYXMEIUBm..wTkPE3bsUJn4Lm7oHVC',
|
||||
'2019-09-09 00:00:00', 31, '', '男', '13800000002', 0, 0, '2019-09-09 00:00:00', 1, 0)
|
||||
ON DUPLICATE KEY UPDATE id = id;
|
||||
|
||||
INSERT INTO discussion (id, title, content, start_time, start_user_id, last_time, last_user_id, create_id, create_time)
|
||||
VALUES (1, '测试主题1', '测试内容1', '2020-09-19 00:00:00', 1, '2020-09-29 00:00:00', 2, 1, '2020-09-09 00:00:00')
|
||||
ON DUPLICATE KEY UPDATE id = id;
|
||||
|
||||
INSERT INTO tag (id, name, icon, position)
|
||||
VALUES (1, '测试标签1', 'edit', 1)
|
||||
ON DUPLICATE KEY UPDATE id = id;
|
||||
|
||||
INSERT INTO post (id, discussion_id, number, time, user_id, content, create_id, create_time)
|
||||
VALUES (1, 1, 1, '2020-02-09 00:00:00', 1, '评论内容222', 1, '2020-08-09 00:00:00')
|
||||
ON DUPLICATE KEY UPDATE id = id;
|
||||
@@ -0,0 +1,33 @@
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
-- V2: Security hardening — password column expansion + BCrypt migration.
|
||||
--
|
||||
-- BACKGROUND:
|
||||
-- The original schema used VARCHAR(20) for the password column, which is too
|
||||
-- short to store BCrypt hashes (60–68 characters). This migration:
|
||||
-- 1. Expands the column to VARCHAR(255).
|
||||
-- 2. Provides UPDATE statements to replace any remaining plaintext passwords
|
||||
-- with BCrypt hashes (useful when applying this migration to an existing
|
||||
-- database that has not yet been migrated).
|
||||
--
|
||||
-- NOTE: The example BCrypt hash below encodes the string '123456'.
|
||||
-- For a real production migration, generate individual hashes per user
|
||||
-- using a one-off script and run this migration during a maintenance window.
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
-- Step 1: Expand the password column so it can hold BCrypt hashes
|
||||
ALTER TABLE user
|
||||
MODIFY COLUMN password VARCHAR(255);
|
||||
|
||||
-- Step 2: Identify and log any users whose passwords look like plaintext
|
||||
-- (BCrypt hashes always start with '$2a$' or '$2b$')
|
||||
-- Run this SELECT manually before Step 3 to audit affected rows:
|
||||
--
|
||||
-- SELECT id, username FROM user WHERE password NOT LIKE '$2%';
|
||||
|
||||
-- Step 3: Replace all non-BCrypt passwords with the hash of a known reset value
|
||||
-- ('changeme123' hashed below) and force a password reset via application logic.
|
||||
-- Replace the hash value with one generated by your BCryptPasswordEncoder.
|
||||
--
|
||||
-- UPDATE user
|
||||
-- SET password = '$2a$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
-- WHERE password NOT LIKE '$2%';
|
||||
Reference in New Issue
Block a user