This commit is contained in:
2026-04-29 19:04:48 +08:00
parent 543c4d9096
commit ac6442a452
43 changed files with 1104 additions and 489 deletions
@@ -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 (6068 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%';