Java 企业级权限管理项目笔记(四) - - - 权限管理系统核心表设计

关于为什么要自己写一套权限管理系统的原因?

  1. 满足框架的要求进行配置
  2. 没有界面操作和查看
  3. 期望更细致的管理

目前笔者所在的公司,项目中所使用的权限管理系统并不是使用SpringSecurity 或者 SpringShiro 这套框架,其中原因:既有以上的三个原因,也有最重要的一点,这两个框架对开发人员并不是很友善,也因此,项目中使用的自己开发的权限管理。而本人便是该权限管理系统的主要开发人员,不过由于项目权限体系的需求原因,所以学习慕课某课程,深入了解权限管理的核心,提高相应的能力。

一、权限管理项目需开发的内容

配置管理类功能

权限拦截类功能

辅助类功能: 缓存(Redis)、各种树结构生成

二、功能构成:

1、配置管理类功能:

  • 用户、权限、角色的管理界面(扩展用:部门、权限模块)
  • 角色 - 用户管理、角色-权限管理
  • 权限更新日志管理

2、权限拦截类功能:

  • 在切面(Filter)做权限拦截
  • 确定用户是否拥有某个权限

3、辅助类功能:

  • 缓存(Redi)的封装和使用
  • 各种树:部门树、权限模块树、角色权限树、用户权限树
  • 权限操作恢复

三、详细表结构设计

设计规范:

 每个表都有自己的主键;

字段尽量定义为NOT NULL;

尽量为每个字段添加备注;

数据库字段统一小写,单词之间使用下划线分隔;

使用InnoDB存储引擎;

可以使用varchar的字段尽可能不使用 TEXT、BLOB类型;

表字符集选择 UTF8

详细表结构设计:

           

1、部门表

CREATE TABLE `sys_dept` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT '部门id' ,
`name`  varchar(20) NOT NULL COMMENT '部门名称' ,
`parent_id`  int NOT NULL DEFAULT 0 COMMENT '上级部门id' ,
`level`  varchar(200) NOT NULL DEFAULT '' COMMENT '部门层级' ,
`seq`  int NOT NULL DEFAULT 0 COMMENT '部门在当前层级下的顺序。由小到大排序' ,
`remark`  varchar(200) NULL DEFAULT '' COMMENT '备注' ,
`operator`  varchar(20) NOT NULL DEFAULT '' COMMENT '操作者' ,
`operator_time`  datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次操作时间' ,
`operator_ip`  varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者ip' ,
PRIMARY KEY (`id`)
);
知识兔

2、用户表

CREATE TABLE `sys_user` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT 'user id' ,
`username`  varchar(20) NOT NULL DEFAULT '' COMMENT '用户名字' ,
`telephone`  varchar(13) NOT NULL DEFAULT '' COMMENT '联系方式' ,
`mail`  varchar(20) NOT NULL DEFAULT '' COMMENT '邮箱' ,
`password`  varchar(40) NOT NULL DEFAULT '' COMMENT '密码' ,
`dept_id`  int NOT NULL DEFAULT 0 COMMENT '部门id' ,
`status`  int NOT NULL COMMENT '用户状态' ,
`remark`  varchar(200) NULL DEFAULT '' COMMENT '备注' ,
`operator`  varchar(20) NOT NULL DEFAULT '' COMMENT '操作者' ,
`operator_time`  datetime NOT NULL DEFAULT now() ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次操作时间' ,
`operator_ip`  varchar(20) NOT NULL ,
PRIMARY KEY (`id`)
);
知识兔

3、权限模块表

CREATE TABLE `sys_acl_module` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT '权限id' ,
`name`  varchar(20) NOT NULL COMMENT '权限名称' ,
`parent_id`  int NOT NULL DEFAULT 0 COMMENT '上级权限id' ,
`level`  varchar(200) NOT NULL DEFAULT '' COMMENT '权限层级' ,
`seq`  int NOT NULL DEFAULT 0 COMMENT '权限在当前层级下的顺序。由小到大排序' ,
`status`  int NOT NULL DEFAULT 0 COMMENT '1表示可用,0表示失效' ,
`remark`  varchar(200) NULL DEFAULT '' COMMENT '备注' ,
`operator`  varchar(20) NOT NULL DEFAULT '' COMMENT '操作者' ,
`operator_time`  datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次操作时间' ,
`operator_ip`  varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者ip' ,
PRIMARY KEY (`id`)
);
知识兔

4、权限表

CREATE TABLE `sys_acl` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT '权限id' ,
`code`  varchar(20) NOT NULL DEFAULT '' COMMENT '权限码' ,
`name`  varchar(20) NOT NULL DEFAULT '' COMMENT '权限名称' ,
`acl_module_id`  int NOT NULL DEFAULT 0 COMMENT '权限所在模块的id' ,
`url`  varchar(100) NOT NULL DEFAULT '' COMMENT '请求的url,可用填正则表达式' ,
`type`  int NOT NULL DEFAULT 1 COMMENT '类型1:菜单;2:按钮;3:其他' ,
`status`  int NOT NULL DEFAULT 1 COMMENT '状态:1:正常;2:冻结' ,
`seq`  int NOT NULL COMMENT '权限在当前模块下的顺序' ,
`remark`  varchar(200) NULL DEFAULT '' COMMENT '备注' ,
`operator`  varchar(20) NOT NULL DEFAULT '' COMMENT '操作者' ,
`operator_time`  datetime NOT NULL DEFAULT now() ON UPDATE CURRENT_TIMESTAMP COMMENT '最后操作时间' ,
`operator_ip`  varchar(20) NOT NULL DEFAULT '' COMMENT '最后操作者的ip' ,
PRIMARY KEY (`id`)
);
知识兔

5、角色表

CREATE TABLE `sys_role` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT '角色id' ,
`name`  varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称' ,
`type`  int NOT NULL DEFAULT 2 COMMENT '角色类型1:管理员。2:其他用户' ,
`status`  int NOT NULL DEFAULT 1 COMMENT '状态:1:正常;2:冻结' ,
`remark`  varchar(200) NULL DEFAULT '' COMMENT '备注' ,
`operator`  varchar(20) NOT NULL DEFAULT '' ,
`operator_time`  datetime NOT NULL DEFAULT now() ON UPDATE CURRENT_TIMESTAMP ,
`opeator_ip`  varchar(20) NOT NULL DEFAULT '' ,
PRIMARY KEY (`id`)
);
知识兔

6、角色用户关联表

CREATE TABLE `sys_role_user` (
`id`  int NOT NULL AUTO_INCREMENT ,
`role_id`  int NOT NULL COMMENT '角色id' ,
`user_id`  int NOT NULL COMMENT '用户id' ,
`operator`  varchar(20) NOT NULL ,
`operator_time`  datetime NOT NULL DEFAULT now() ON UPDATE CURRENT_TIMESTAMP ,
`operator_ip`  varchar(20) NOT NULL ,
PRIMARY KEY (`id`)
);
知识兔

7、角色-权限关联表

CREATE TABLE `sys_role_acl` (
`id`  int NOT NULL AUTO_INCREMENT ,
`role_id`  int NOT NULL COMMENT '角色id' ,
`acl_id`  int NOT NULL COMMENT '权限id' ,
`operator`  varchar(20) NOT NULL ,
`operator_time`  datetime NOT NULL DEFAULT now() ON UPDATE CURRENT_TIMESTAMP ,
`operator_ip`  varchar(20) NOT NULL ,
PRIMARY KEY (`id`)
);
知识兔

8、权限相关更新记录表

CREATE TABLE `sys_log` (
`id`  int NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`type`  int NOT NULL DEFAULT 0 COMMENT '权限更新的类型:1:部门;2:用户;3:权限模块;4:权限;5:角色;6:角色用户关系;7:角色权限关系;' ,
`target_id`  int NOT NULL COMMENT '基于type指定的对象id,比如用户、角色、权限表的主键' ,
`old_value`  text NOT NULL ,
`new_value`  text NOT NULL ,
`operator`  varchar(255) NOT NULL ,
`operator_time`  datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
`operator_ip`  varchar(255) NOT NULL ,
`status`  int NOT NULL COMMENT '当前是否复原过0:没有;1:有' ,
PRIMARY KEY (`id`)
);
知识兔

注意: 

            datetime类型只支持Mysql5.6.5以上版本。

            以下的版本将 datetime 换成 TIMESTAMP 即可。

计算机