MySQL数据表设计 系统权限表设计 权限、角色、用户表设计
数据库
创建
CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改
ALTER DATABASE my_database CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
字符集:utf8和utf8mb4,推荐使用:utf8mb4
utf8:主要支持Unicode字符集中的基本多语言平面(BMP)范围内的字符,码点范围从0x0000到0xFFFF。这涵盖了大多数常用的字符,包括拉丁语、希腊语、中文、日文等。但它不包含一些表情符号(Emoji)。
utf8mb4:是utf8的超集,支持Unicode字符集的全部字符,能够表示更多的特殊字符。
校对规则(Collation),推荐使用:utf8mb4_unicode_ci
校对规则(Collation)也可以称为排序规则,是一组字符编码规则,用于对字符串进行排序和比较。
数据库配置设置:my.ini或者my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
权限系统
ACL(Access Control List),访问控制列表
ACL是一种访问控制机制,包含三个关键要素:用户(User)、资源(Resource)和操作(Operate),当用户请求操作资源时,检查资源的权限列表,如果资源的权限列表中存在该用户的操作权限则允许,否则拒绝。
RBAC(Role-Based Access Control),基于角色的访问控制
RBAC模型,三个基础组成部分:用户(User)、角色(Role)和权限(Privilege),通过定义角色的权限,授予用户某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型);
RBAC权限授权,实际上是:Who、What、How,构成了访问权限三元组,也就是:Who对What(Which)进行How的操作。
Who:权限的拥用者或主体,如:Principal、User、Group、 Role、Actor等等;
What:权限针对的对象或资源(Resource、Class);
How:具体的权限(Privilege,正向授权与负向授权);
Operator:操作,表明对What的How操作,也就是:权限(Privilege)+ 资源(Resource);
Role:角色,一定数量的权限的集合,权限分配的单位与载体,目的是隔离用户(User)和权限(Privilege)的逻辑关系;
Group:用户组,权限分配的单位与载体,权限不考虑分配给特定的用户而给组,组可以包括组(以实现权限的继承),也可以包含用户,组内用户继承组的权限,User与Group是多对多的关系,Group可以层次化,以满足不同层级权限控制的要求。
数据库表设计
/** 功能权限表 **/
CREATE TABLE `t_permission` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID' primary key,
`name` VARCHAR(32) NOT NULL COMMENT '菜单名称',
`mark` VARCHAR(32) NULL DEFAULT NULL COMMENT '菜单权限标识',
`path` VARCHAR(128) NULL DEFAULT NULL COMMENT '前端URL',
`url` VARCHAR(128) NULL DEFAULT NULL COMMENT '请求链接',
`method` VARCHAR(32) NULL DEFAULT NULL COMMENT '请求方法',
`parent_id` INT(11) NULL DEFAULT NULL COMMENT '父菜单ID',
`parent_full_path` VARCHAR(256) NULL DEFAULT NULL COMMENT '菜单全路径',
`icon` VARCHAR(32) NULL DEFAULT NULL COMMENT '图标',
`component` VARCHAR(64) NULL DEFAULT NULL COMMENT '组件',
`type` INT(2) NULL DEFAULT '0' COMMENT '菜单类型 (0菜单 1按钮)',
`status` INT(2) NULL DEFAULT '1' COMMENT '状态:1:启用;0:停用',
`level` INT(5) NULL DEFAULT '1' COMMENT '级别',
`sorted` INT(5) NULL DEFAULT '1' COMMENT '排序值',
`create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_uid` INT(11) NULL DEFAULT '1' COMMENT '创建用户ID',
`create_user` VARCHAR(50) NULL DEFAULT '' COMMENT '创建人',
`modify_time` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
)
COMMENT='功能权限表',ENGINE=InnoDB;
/** 角色表 **/
CREATE TABLE `t_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT primary key COMMENT '主键ID',
`name` VARCHAR(100) NOT NULL COMMENT '角色名称',
`code` VARCHAR(100) NOT NULL COMMENT '角色编号',
`type` INT(5) NULL DEFAULT '0' COMMENT '角色类型',
`sorted` INT(11) NULL DEFAULT '1' COMMENT '排序值',
`status` INT(2) NULL DEFAULT '1' COMMENT '状态:1:启用;0:停用',
`describe` VARCHAR(255) NULL DEFAULT '' COMMENT '角色描述',
`create_uid` INT(11) NULL DEFAULT NULL COMMENT '创建用户ID',
`create_user` VARCHAR(100) NULL DEFAULT '' COMMENT '创建人',
`create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间'
)
COMMENT='角色表',ENGINE=InnoDB;
/** 角色权限关系表 **/
CREATE TABLE `t_role_permission` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
`role_id` INT(11) NULL DEFAULT NULL COMMENT '角色id',
`permission_id` INT(11) NULL DEFAULT NULL COMMENT '权限id',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_uid` INT(11) NULL DEFAULT NULL COMMENT '创建用户ID',
`create_user` VARCHAR(100) NULL DEFAULT '' COMMENT '创建人'
)
COMMENT='角色权限关联表',ENGINE=InnoDB;
/** 用户表 **/
CREATE TABLE `t_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT primary key COMMENT '主键ID',
`username` VARCHAR(60) NOT NULL UNIQUE COMMENT '登录用户名',
`password` VARCHAR(255) NOT NULL COMMENT '登录密码',
`type` INT(5) NULL DEFAULT '0' COMMENT '用户类型',
`real_name` VARCHAR(60) NULL DEFAULT '0' COMMENT '用户真实名称',
`nick_name` VARCHAR(60) NULL DEFAULT '1' COMMENT '用户昵称',
`avatar` VARCHAR(255) NULL DEFAULT NULL COMMENT '用户头像',
`gender` INT(5) NULL DEFAULT '0' COMMENT '用户性别,0:未知,1 男 2 女',
`phone` VARCHAR(30) NULL DEFAULT '' COMMENT '用户电话',
`mobile` VARCHAR(30) NULL DEFAULT '' COMMENT '用户手机号',
`email` VARCHAR(60) NULL DEFAULT '' COMMENT '用户邮箱',
`status` INT(1) NULL DEFAULT '0' COMMENT '用户状态: 0:停用、1:正常',
`job_number` VARCHAR(50) NULL DEFAULT '' COMMENT '用户工号',
`id_number` VARCHAR(30) NULL DEFAULT '' COMMENT '用户身份证号码',
`work_title` VARCHAR(50) NULL DEFAULT NULL COMMENT '工作职称',
`work_post` VARCHAR(50) NULL DEFAULT NULL COMMENT '工作职位',
`work_role` VARCHAR(100) NULL DEFAULT NULL COMMENT '工作角色',
`describe` VARCHAR(35) NULL DEFAULT '' COMMENT '用户描述',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_uid` INT(11) NULL DEFAULT NULL COMMENT '创建用户ID',
`create_user` VARCHAR(100) NULL DEFAULT '' COMMENT '创建人',
`modify_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`logic_deleted` INT(1) NULL DEFAULT '0' COMMENT '0,正常 1,已删除'
)
COMMENT='用户表' ENGINE=InnoDB;
/** 用户角色关系表 **/
CREATE TABLE `t_user_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
`user_id` INT(11) COMMENT '用户id',
`role_id` INT(11) COMMENT '角色id',
`create_uid` INT(11) COMMENT '创建用户ID',
`create_user` VARCHAR(50) NULL DEFAULT '' COMMENT '创建人',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
)
COMMENT='用户角色关联表',ENGINE=InnoDB;