2026-10-09 06:46:36 -04:00
|
|
|
|
-- ============================================================================
|
|
|
|
|
|
-- 开发环境初始化脚本
|
|
|
|
|
|
--
|
|
|
|
|
|
-- 执行时机:docker-entrypoint-initdb.d —— **仅在 MySQL 数据卷为空时的首次启动执行**
|
|
|
|
|
|
-- 数据卷已存在时修改本文件不会生效,需要:
|
|
|
|
|
|
-- docker compose -f docker/docker-compose.dev.yml down -v && up -d
|
|
|
|
|
|
--
|
2026-10-09 22:44:05 -04:00
|
|
|
|
-- 内容 = db/migration/ 下**全部迁移**的最终结构(额外带 DROP,开发环境允许重置)
|
|
|
|
|
|
-- 必须与 db/migration/V*.sql 的合集保持一致,
|
2026-10-09 06:46:36 -04:00
|
|
|
|
-- 由 backend/tests/integration/test_schema_sync.py 自动校验,防止两份 DDL 漂移
|
|
|
|
|
|
--
|
2026-10-09 22:44:05 -04:00
|
|
|
|
-- 结尾写入 alembic_version 记录(**须等于当前 head**,否则开发库重建后
|
|
|
|
|
|
-- 执行 alembic upgrade head 会重复建表并报 1050 Table already exists)
|
2026-10-09 06:46:36 -04:00
|
|
|
|
-- ============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
|
|
|
|
|
|
|
|
-- 删除顺序遵循外键依赖:先删子表
|
2026-10-09 22:44:05 -04:00
|
|
|
|
DROP TABLE IF EXISTS `operation_logs`;
|
2026-10-09 06:46:36 -04:00
|
|
|
|
DROP TABLE IF EXISTS `role_permissions`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `user_roles`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `login_logs`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `permissions`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `users`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `roles`;
|
|
|
|
|
|
DROP TABLE IF EXISTS `alembic_version`;
|
|
|
|
|
|
|
|
|
|
|
|
-- 服务端字符集应为 utf8mb4 / utf8mb4_general_ci(与 compose 的启动参数一致)
|
|
|
|
|
|
SELECT @@character_set_server AS charset, @@collation_server AS collation;
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 权限表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE permissions (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
perm_code VARCHAR(128) NOT NULL COMMENT '权限编码,如 system:user:create',
|
|
|
|
|
|
perm_name VARCHAR(64) NOT NULL COMMENT '权限名称',
|
|
|
|
|
|
perm_type TINYINT NOT NULL COMMENT '类型:1菜单 2按钮 3接口' DEFAULT '1',
|
|
|
|
|
|
parent_id BIGINT UNSIGNED COMMENT '父权限ID(permissions.id),顶级为空',
|
|
|
|
|
|
sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0',
|
|
|
|
|
|
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_permissions PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT fk_permissions_parent_id FOREIGN KEY(parent_id) REFERENCES permissions (id) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT uk_permissions_perm_code UNIQUE (perm_code)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='权限表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 角色表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE roles (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
role_code VARCHAR(32) NOT NULL COMMENT '角色编码:admin系统管理员 user普通用户',
|
|
|
|
|
|
role_name VARCHAR(64) NOT NULL COMMENT '角色名称',
|
|
|
|
|
|
description VARCHAR(255) COMMENT '角色说明',
|
|
|
|
|
|
sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0',
|
|
|
|
|
|
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_roles PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT uk_roles_role_code UNIQUE (role_code)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 系统用户表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE users (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
username VARCHAR(64) NOT NULL COMMENT '登录用户名',
|
|
|
|
|
|
password VARCHAR(100) NOT NULL COMMENT '密码哈希(BCrypt,固定60字符)',
|
|
|
|
|
|
real_name VARCHAR(64) COMMENT '真实姓名',
|
|
|
|
|
|
phone VARCHAR(20) COMMENT '手机号',
|
|
|
|
|
|
email VARCHAR(128) COMMENT '邮箱',
|
|
|
|
|
|
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
|
|
|
|
|
token_version INTEGER NOT NULL COMMENT '令牌版本号:改密/禁用/强制下线时+1,使已签发Token立即失效' DEFAULT '1',
|
|
|
|
|
|
last_login_time DATETIME COMMENT '最后登录时间',
|
|
|
|
|
|
remark VARCHAR(255) COMMENT '备注',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_users PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT uk_users_username UNIQUE (username)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='系统用户表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_users_phone ON users (phone);
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 登录日志表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE login_logs (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
user_id BIGINT UNSIGNED COMMENT '用户ID(账号不存在时为空)',
|
|
|
|
|
|
username VARCHAR(64) NOT NULL COMMENT '登录用户名(原样记录)',
|
|
|
|
|
|
ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)',
|
|
|
|
|
|
user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)',
|
|
|
|
|
|
success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0',
|
|
|
|
|
|
fail_reason VARCHAR(64) COMMENT '失败原因:验证码错误/用户名或密码错误/账号锁定/账号禁用',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_login_logs PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT fk_login_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='登录日志表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_login_logs_create_time ON login_logs (create_time);
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_login_logs_username ON login_logs (username);
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 角色权限关联表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE role_permissions (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)',
|
|
|
|
|
|
permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID(permissions.id)',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_role_permissions PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT fk_role_permissions_permission_id FOREIGN KEY(permission_id) REFERENCES permissions (id) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT fk_role_permissions_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT uk_role_permissions_role_id_permission_id UNIQUE (role_id, permission_id)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色权限关联表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_role_permissions_permission_id ON role_permissions (permission_id);
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 用户角色关联表
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE user_roles (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID(users.id)',
|
|
|
|
|
|
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_user_roles PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT fk_user_roles_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT fk_user_roles_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT uk_user_roles_user_id_role_id UNIQUE (user_id, role_id)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='用户角色关联表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_user_roles_role_id ON user_roles (role_id);
|
|
|
|
|
|
|
2026-10-09 22:44:05 -04:00
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 操作日志表(V2 迁移)
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE operation_logs (
|
|
|
|
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
|
|
|
|
|
user_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)',
|
|
|
|
|
|
username VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余存储便于追溯)',
|
|
|
|
|
|
module VARCHAR(64) NOT NULL COMMENT '所属模块,如 用户管理',
|
|
|
|
|
|
action VARCHAR(32) NOT NULL COMMENT '操作类型:新增/修改/删除/导出',
|
|
|
|
|
|
summary VARCHAR(255) NOT NULL COMMENT '操作摘要(中文,供人阅读)',
|
|
|
|
|
|
method VARCHAR(8) COMMENT 'HTTP 方法',
|
|
|
|
|
|
path VARCHAR(255) COMMENT '请求路径',
|
|
|
|
|
|
ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)',
|
|
|
|
|
|
user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)',
|
|
|
|
|
|
request_data TEXT COMMENT '请求参数(已脱敏)',
|
|
|
|
|
|
success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0',
|
|
|
|
|
|
error_message VARCHAR(500) COMMENT '失败原因(写入方须截断)',
|
|
|
|
|
|
duration_ms INTEGER COMMENT '处理耗时(毫秒)',
|
|
|
|
|
|
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
CONSTRAINT pk_operation_logs PRIMARY KEY (id),
|
|
|
|
|
|
CONSTRAINT fk_operation_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='操作日志表' COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_operation_logs_create_time ON operation_logs (create_time);
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_operation_logs_module ON operation_logs (module);
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_operation_logs_user_id ON operation_logs (user_id);
|
|
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_operation_logs_username ON operation_logs (username);
|
|
|
|
|
|
|
2026-10-09 06:46:36 -04:00
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
-- 字典数据:角色(与 V1 迁移中的初始化数据一致)
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('admin', '系统管理员', '全部权限,含计提参数与系数表配置', 1);
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('user', '普通用户', '业务操作', 2);
|
|
|
|
|
|
|
|
|
|
|
|
-- ---------------------------------------------------------------------------
|
2026-10-09 22:44:05 -04:00
|
|
|
|
-- 迁移版本记录:须等于当前 head,使 alembic upgrade head 成为空操作
|
2026-10-09 06:46:36 -04:00
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE alembic_version (
|
|
|
|
|
|
version_num VARCHAR(32) NOT NULL,
|
|
|
|
|
|
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
|
|
|
|
|
)CHARSET=utf8mb4 ENGINE=InnoDB COLLATE utf8mb4_general_ci;
|
|
|
|
|
|
|
2026-10-09 22:44:05 -04:00
|
|
|
|
INSERT INTO alembic_version (version_num) VALUES ('a45a8087831b');
|