yuheng/rbac_system.sql
2025-03-19 18:21:25 +08:00

137 lines
9.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 核心用户体系
* 存储系统用户基础身份信息
*/
CREATE TABLE `sys_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID自增主键',
`username` VARCHAR(50) NOT NULL COMMENT '用户名(唯一标识,必须小写字母开头)',
`email` VARCHAR(100) NOT NULL COMMENT '邮箱(唯一标识,格式校验由程序控制)',
`phone` VARCHAR(20) COMMENT '手机号(国际区号+号码,例如+8613912345678',
`is_locked` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '账户锁定状态0-正常 1-锁定)',
`last_login_at` DATETIME COMMENT '最后登录时间UTC时区',
`avatar_url` VARCHAR(255) COMMENT '头像URLCDN地址格式https://域名/路径)',
`user_type` VARCHAR(20) NOT NULL DEFAULT 'SYSTEM' COMMENT '用户类型SYSTEM:系统用户/EXTERNAL:外部用户)',
`parent_id` BIGINT COMMENT '父用户ID构建用户树形结构NULL表示根节点',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(自动生成,不可修改)',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间(记录最后修改时间)',
PRIMARY KEY (`id`) COMMENT '主键约束',
UNIQUE INDEX `idx_username` (`username`) COMMENT '用户名唯一索引(加速登录验证)',
UNIQUE INDEX `idx_email` (`email`) COMMENT '邮箱唯一索引(保证账号唯一性)',
FOREIGN KEY (`parent_id`) REFERENCES `sys_user` (`id`) ON DELETE SET NULL COMMENT '外键约束(父用户删除时置空,防止数据不一致)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户主表(存储核心身份信息)';
-- 用户认证体系相关表(密码分离存储)
CREATE TABLE `sys_user_auth` (
`user_id` BIGINT NOT NULL COMMENT '用户ID与sys_user.id一对一绑定',
`password_hash` VARCHAR(128) NOT NULL COMMENT 'BCrypt加密哈希值固定60字符长度',
`password_modified` DATETIME NOT NULL COMMENT '密码最后修改时间UTC时区',
`password_expire` DATETIME COMMENT '密码过期时间NULL表示永不过期',
PRIMARY KEY (`user_id`) COMMENT '主键约束',
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除(用户删除时自动删除认证信息)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户认证表(存储敏感凭证信息)';
-- 密码历史记录表(防止重复使用旧密码)
CREATE TABLE `sys_password_history` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '记录ID自增主键',
`user_id` BIGINT NOT NULL COMMENT '用户ID与sys_user.id关联',
`old_password` VARCHAR(128) NOT NULL COMMENT '历史密码哈希值',
`modified_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间UTC时区',
PRIMARY KEY (`id`) COMMENT '主键约束',
INDEX `idx_user_pwd` (`user_id`, `modified_at`) COMMENT '复合索引(加速历史密码查询)',
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除(用户删除时自动清理历史记录)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密码历史表保存最近N次历史密码';
-- 组织架构体系相关表(支持树形结构)
CREATE TABLE `sys_organization` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '组织ID自增主键',
`org_name` VARCHAR(100) NOT NULL COMMENT '组织名称(显示用中文名)',
`org_code` VARCHAR(50) NOT NULL COMMENT '组织编码唯一业务标识如DEP001',
`parent_id` BIGINT COMMENT '父组织ID构建树形结构NULL表示根节点',
`manager_id` BIGINT COMMENT '负责人ID关联sys_user.id',
`tags` JSON COMMENT '组织标签JSON数组如["子公司","研发中心"]',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间UTC时区',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间UTC时区',
PRIMARY KEY (`id`) COMMENT '主键约束',
UNIQUE INDEX `idx_org_code` (`org_code`) COMMENT '组织编码唯一索引',
FOREIGN KEY (`parent_id`) REFERENCES `sys_organization` (`id`) COMMENT '外键约束(维护树形结构完整性)',
FOREIGN KEY (`manager_id`) REFERENCES `sys_user` (`id`) ON DELETE SET NULL COMMENT '外键约束(负责人删除时置空)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组织架构表(支持多层级结构)';
/*
* RBAC核心表基于角色的访问控制
* 包含角色、权限及其关联关系
*/
CREATE TABLE `sys_role` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID自增主键',
`role_name` VARCHAR(50) NOT NULL COMMENT '角色名称(显示用中文名)',
`role_key` VARCHAR(50) NOT NULL COMMENT '角色标识符唯一英文键如admin',
`description` VARCHAR(255) COMMENT '角色描述(功能说明)',
`parent_id` BIGINT COMMENT '父角色ID构建角色继承树',
PRIMARY KEY (`id`),
UNIQUE INDEX `idx_role_key` (`role_key`) COMMENT '角色标识符唯一索引',
FOREIGN KEY (`parent_id`) REFERENCES `sys_role` (`id`) COMMENT '外键约束(维护角色继承关系)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表(定义系统角色)';
CREATE TABLE `sys_permission` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '权限ID自增主键',
`perm_name` VARCHAR(50) NOT NULL COMMENT '权限名称(显示用中文名)',
`perm_key` VARCHAR(100) NOT NULL COMMENT '权限标识符唯一业务键如user:delete',
`description` VARCHAR(255) COMMENT '权限描述(功能说明)',
`parent_id` BIGINT COMMENT '父权限ID构建权限树形结构',
PRIMARY KEY (`id`),
UNIQUE INDEX `idx_perm_key` (`perm_key`) COMMENT '权限标识符唯一索引',
FOREIGN KEY (`parent_id`) REFERENCES `sys_permission` (`id`) COMMENT '外键约束(维护权限继承关系)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表(定义细粒度权限)';
-- 用户-角色关联表(多对多关系)
CREATE TABLE `sys_user_role` (
`user_id` BIGINT NOT NULL COMMENT '用户ID关联sys_user.id',
`role_id` BIGINT NOT NULL COMMENT '角色ID关联sys_role.id',
PRIMARY KEY (`user_id`, `role_id`) COMMENT '复合主键',
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除(用户删除时自动解除关联)',
FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE COMMENT '级联删除(角色删除时自动解除关联)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表(建立用户与角色的多对多关系)';
-- 角色-权限关联表(多对多关系)
CREATE TABLE `sys_role_permission` (
`role_id` BIGINT NOT NULL COMMENT '角色ID关联sys_role.id',
`perm_id` BIGINT NOT NULL COMMENT '权限ID关联sys_permission.id',
PRIMARY KEY (`role_id`, `perm_id`) COMMENT '复合主键',
FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE COMMENT '级联删除(角色删除时自动解除关联)',
FOREIGN KEY (`perm_id`) REFERENCES `sys_permission` (`id`) ON DELETE CASCADE COMMENT '级联删除(权限删除时自动解除关联)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限关联表(建立角色与权限的多对多关系)';
/*
* 扩展字段体系(支持动态字段管理)
* 包含字段定义和用户扩展数据存储
*/
CREATE TABLE `sys_field_definition` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '字段ID自增主键',
`field_key` VARCHAR(50) NOT NULL COMMENT '字段标识符英文唯一键如birthday',
`field_name` VARCHAR(50) NOT NULL COMMENT '字段显示名称(如"出生日期"',
`field_type` ENUM('STRING','NUMBER','DATE','BOOLEAN','TEXT') NOT NULL DEFAULT 'STRING' COMMENT '字段类型(控制数据格式)',
`is_required` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否必填0-否 1-是)',
`is_unique` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否唯一0-否 1-是)',
`user_types` JSON NOT NULL COMMENT '适用的用户类型JSON数组如["SYSTEM","EXTERNAL"]',
`status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态0-停用 1-启用)',
`created_by` BIGINT NOT NULL COMMENT '创建人ID关联sys_user.id',
`updated_by` BIGINT NOT NULL COMMENT '最后修改人ID关联sys_user.id',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间UTC时区',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间UTC时区',
PRIMARY KEY (`id`),
UNIQUE INDEX `idx_field_key` (`field_key`) COMMENT '字段标识符唯一索引',
FOREIGN KEY (`created_by`) REFERENCES `sys_user` (`id`) COMMENT '外键约束(创建人必须存在)',
FOREIGN KEY (`updated_by`) REFERENCES `sys_user` (`id`) COMMENT '外键约束(修改人必须存在)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字段定义表(管理员维护动态字段)';
CREATE TABLE `sys_user_profile` (
`user_id` BIGINT NOT NULL COMMENT '用户ID关联sys_user.id',
`field_id` BIGINT NOT NULL COMMENT '字段ID关联sys_field_definition.id',
`field_value` TEXT NOT NULL COMMENT '字段值(根据字段类型校验格式)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间UTC时区',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间UTC时区',
PRIMARY KEY (`user_id`, `field_id`) COMMENT '复合主键',
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除(用户删除时自动清理扩展数据)',
FOREIGN KEY (`field_id`) REFERENCES `sys_field_definition` (`id`) COMMENT '外键约束(确保字段定义有效)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户扩展表(存储动态字段数据)';