后台管理权限设计

前言

最近一直在重写后台系统,对使用的界面与技术进行一次更新。涉及到权限这块,最初考虑引入Shiro,但由于对这个框架理解不太深,并且项目DeadLine在那放着,所以决定自己搞一套,毕竟自己搞的比较熟悉方便维护,也方便二次开发定制。

需求明确

以下是整理的现阶段需求,以后有二期需求再加上

一、用户未登录时,会提示未登录并转到登录界面

二、用户账户被锁定时,会提示被锁定并转到登录界面

三、用户在没有权限时,点击后台按钮会提示无权限

四、菜单要根据给用户分配的角色填充,只出现该角色可展示的菜单

五、不拦截静态资源,如:css、js、html等

六、区分是否是Ajax请求,是的话返回对应json数据

七、用户只能查看自己的产品

数据库设计

需求明确就可以设计数据库了,这个根据项目、业务来。

用户表

产品表

角色表

菜单表

权限表

用户与产品关联表

用户与角色关联表

角色与菜单关联表

角色与权限关联表

以下是对应结构图:
图片:Baidu_icon

首先看菜单设计

CREATE TABLE `uadmin_menu` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id',
  `MenuName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称',
  `ParentId` int(11) NOT NULL COMMENT '父级ID',
  `Url` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '菜单链接地址',
  `SortOrder` int(11) NOT NULL COMMENT '排序编号',
  `CreateDate` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ParenId是菜单的父级ID,代表着层级关系,例如:根菜单ParenId为0,Id为1,它的子菜单对应的ParenId为1;Url字段对应的是点击打开的网址,因为可能是父级菜单,所以可以为空;SortOrder是菜单的排序编号,主要为了针对性地调整菜单显示的顺序。

再看看权限设计

CREATE TABLE `uadmin_power` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id',
  `MenuId` int(11) NOT NULL COMMENT '所属菜单ID',
  `PowerCode` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限编码',
  `PowerName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限名称',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

该权限是对应菜单下的方法级权限,可以控制菜单对应界面的按钮。每次用户点击后,有个自定义拦截器去查询是否有该权限;PowerCode字段对应的是菜单界面按钮的权限,该按钮方法上加自定义权限注解,传入权限编码PowerCode

角色设计

CREATE TABLE `uadmin_role` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id' COMMENT '角色表主键',
  `RoleName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称',
  `Remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
  `CreateDate` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

角色表比较简单,我这里设计的角色是默认无权限的,得与菜单表、权限表相关联。

商品设计

CREATE TABLE `uproduct` (
  `appID` int(11) NOT NULL COMMENT '产品识别appID',
  `appkey` varchar(255) DEFAULT NULL COMMENT '产品识别appKey',
  `appSecret` varchar(255) DEFAULT NULL COMMENT '产品识别appSecret',
  PRIMARY KEY (`appID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品表也比较简单,可以根据自己的业务需求定制,这主要是做后台用户所属商品关联查询的,对应用户只能查看对应商品。

用户设计

CREATE TABLE `uadmin_user` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表主键',
  `UserName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名',
  `Password` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码',
  `DepartmentId` int(11) NOT NULL COMMENT '所属部门编号',
  `HasLock` bit(1) NOT NULL COMMENT '锁定状态,0为启用,1为禁用',
  `CreateDate` datetime NOT NULL COMMENT '生成时间',
  `RealName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '真实姓名',
  `Mobile` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这里跟角色一样,没有超级用户,都是空白权限,需要自己对其定制。HasLock字段表示是否锁定,如果锁定了,拦截器会把该用户操作拦截下来,跳转登录页面。

关联表设计

五张主表之间的关联表,简单来说就是用来做相互的对应关系的,由关联表id,主表id构成。

权限拦截流程设计

Baidu_icon

猜你喜欢

转载自blog.csdn.net/qq_25868207/article/details/77851934