-- ============================================ -- 迁移 v6:管理员表隔离 -- 将 ADMIN/SUPER_ADMIN 从 t_user 分离到 t_admin -- ============================================ -- 1. 创建管理员表 CREATE TABLE IF NOT EXISTS `t_admin` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', `username` VARCHAR(64) NOT NULL COMMENT '用户名', `password` VARCHAR(128) NOT NULL COMMENT '密码(BCrypt加密)', `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号', `role` VARCHAR(20) NOT NULL DEFAULT 'ADMIN' COMMENT '角色:ADMIN/SUPER_ADMIN', `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-禁用 1-正常', `token_version` BIGINT DEFAULT 0 COMMENT 'Token版本号', `refresh_token_hash` VARCHAR(64) DEFAULT NULL COMMENT 'Refresh Token SHA-256哈希', `refresh_token_status` VARCHAR(10) DEFAULT NULL COMMENT 'Refresh Token状态:ACTIVE/USED', `last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间', `last_login_ip` VARCHAR(45) DEFAULT NULL COMMENT '最后登录IP', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), UNIQUE KEY `uk_phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表'; -- 2. 从 t_user 迁移现有管理员数据到 t_admin -- username 使用 nickname 作为默认值(如果没有则用 phone) INSERT INTO `t_admin` (`id`, `username`, `password`, `phone`, `role`, `status`, `token_version`, `refresh_token_hash`, `refresh_token_status`, `last_login_time`, `last_login_ip`, `create_time`, `update_time`) SELECT `id`, COALESCE(`nickname`, `phone`, CONCAT('admin_', `id`)) AS `username`, COALESCE(`password`, '') AS `password`, `phone`, `role`, `status`, COALESCE(`token_version`, 0) AS `token_version`, `refresh_token_hash`, `refresh_token_status`, `last_login_time`, `last_login_ip`, `create_time`, `update_time` FROM `t_user` WHERE `role` IN ('ADMIN', 'SUPER_ADMIN'); -- 3. 迁移后清理 t_user 中的管理员数据(保留记录但清除 role) -- 注意:不删除 t_user 中的行,因为管理员可能同时也是用户(有业务数据关联) -- 但 role 改为 USER,因为 t_user 不再区分 ADMIN/SUPER_ADMIN UPDATE `t_user` SET `role` = 'USER' WHERE `role` IN ('ADMIN', 'SUPER_ADMIN');