-- ============================================================================ -- 开发环境初始化脚本 -- -- 执行时机:docker-entrypoint-initdb.d —— **仅在 MySQL 数据卷为空时的首次启动执行** -- 数据卷已存在时修改本文件不会生效,需要: -- docker compose -f docker/docker-compose.dev.yml down -v && up -d -- -- 内容 = V1 迁移的完整结构(额外带 DROP,开发环境允许重置) -- 与 db/migration/V1__init_rbac_and_login_logs.sql 必须保持一致, -- 由 backend/tests/integration/test_schema_sync.py 自动校验,防止两份 DDL 漂移 -- -- 结尾写入 alembic_version 记录,使 `alembic upgrade head` 在本库上成为空操作 -- ============================================================================ SET NAMES utf8mb4; -- 删除顺序遵循外键依赖:先删子表 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); -- --------------------------------------------------------------------------- -- 字典数据:角色(与 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); -- --------------------------------------------------------------------------- -- 迁移版本记录:标记 V1 已应用,使 alembic upgrade head 成为空操作 -- --------------------------------------------------------------------------- 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; INSERT INTO alembic_version (version_num) VALUES ('6165691326d4');