写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支撑。

源码地址(后端):gitee.com/csps/mingyu…

源码地址(前端):gitee.com/csps/mingyu…

文档地址:gitee.com/csps/mingyu…

数据库权限模型规划

规划思路:通过用户相关人物(一个用户可相关多个人物),人物相关菜单(一个人物可相关多个菜单),完结用户权限操控。

  • 用户 1 => 人物 N
  • 人物 1 => 菜单(权限点)N
sys_user      用户表
sys_user_role    用户人物联系表
sys_role      人物表
sys_role_menu    人物菜单联系表
sys_menu      菜单表

017-从零搭建微服务-系统服务(四)

用户表

用户表在之前的开发中现已规划并使用了

CREATE TABLE `sys_user` (
  `user_id`   BIGINT(20)    NOT NULL    COMMENT '用户ID',
  `username`   VARCHAR(64)   NOT NULL    COMMENT '用户名',
  `nickname`   VARCHAR(64)   NOT NULL    COMMENT '用户昵称',
  `sex`     CHAR(1)     DEFAULT '0'   COMMENT '用户性别(0男 1女 2未知)',
  `password`   VARCHAR(255)   NOT NULL    COMMENT '密码',
  `phone`    VARCHAR(32)   DEFAULT NULL  COMMENT '手机号码',
  `email`    VARCHAR(32)   DEFAULT NULL  COMMENT '用户邮箱',
  `avatar`    VARCHAR(255)   DEFAULT NULL  COMMENT '头像',
  `status`    CHAR(1)     DEFAULT '0'   COMMENT '帐号状况(0正常 1停用)',
  `is_deleted`  CHAR(1)     DEFAULT '0'   COMMENT '删去标志(0正常,1删去)',
  `create_time` DATETIME     DEFAULT NULL  COMMENT '创建时刻',
  `update_time` DATETIME     DEFAULT NULL  COMMENT '修正时刻',
  `create_by`  VARCHAR(64)   DEFAULT NULL  COMMENT '创建者',
  `update_by`  VARCHAR(64)   DEFAULT NULL  COMMENT '更新人',
  PRIMARY KEY (`user_id`),
  KEY `user_idx1_username` (`username`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '用户表';
​
​
BEGIN;
INSERT INTO `sys_user` VALUES (1, 'mingyue', '明月', '0', '123456', '13288888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
INSERT INTO `sys_user` VALUES (2, 'strive', 'Strive', '0', '123456', '15388888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
COMMIT;

人物表

CREATE TABLE sys_role (
  `role_id`    BIGINT(20)   NOT NULL     COMMENT '人物ID',
  `role_name`   VARCHAR(64)   NOT NULL     COMMENT '人物称号',
  `role_code`   VARCHAR(64)   NOT NULL     COMMENT '人物代码',
  `order_num`   INT(4)     NOT NULL     COMMENT '显现顺序',
  `status`    CHAR(1)     DEFAULT '0'   COMMENT '人物状况(0正常 1停用)',
  `role_desc`   VARCHAR(255)  DEFAULT NULL   COMMENT '人物描绘',
  `is_deleted`  CHAR(1)     DEFAULT '0'   COMMENT '删去标志(0正常,1删去)',
  `create_time`  DATETIME    DEFAULT NULL   COMMENT '创建时刻',
  `update_time`  DATETIME    DEFAULT NULL   COMMENT '修正时刻',
  `create_by`   VARCHAR(64)   DEFAULT NULL   COMMENT '创建者',
  `update_by`   VARCHAR(64)   DEFAULT NULL   COMMENT '更新人',
  PRIMARY KEY (`role_id`),
  UNIQUE KEY `role_idx1_role_code` (`role_code`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '人物表';
​
​
BEGIN;
INSERT INTO `sys_role` VALUES (1, '超级办理员', 'admin', 0, '0', NULL, '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
INSERT INTO `sys_role` VALUES (2, '一般用户', 'common', 1, '0', NULL, '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
COMMIT;

用户人物联系表

办理用户与人物之间联系,用户 1 => 人物 N

DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE sys_user_role (
  `user_id`  BIGINT(20) NOT NULL COMMENT '用户ID',
  `role_id`  BIGINT(20) NOT NULL COMMENT '人物ID',
  PRIMARY KEY (`user_id`, `role_id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '用户和人物相关表';
​
BEGIN;
INSERT INTO `sys_user_role` VALUES (1, 1);
INSERT INTO `sys_user_role` VALUES (2, 2);
COMMIT;

菜单表

菜单表的规划参考前端项目 JSON 数据规划

{
 // 菜单途径,用于跳转
 path: '/home',
 // 菜单 name,用于界面 keep-alive 路由缓存。
 // 此 name 需要与 component 组件中的 name 值相同(仅有)
 name: 'home',
 // 组件途径
 component: () => import('/@/views/home/index.vue'),
 // 菜单重定向途径
 redirect: '/home',
 // 附加自定义数据
 meta: {
  // 菜单标题(国际化写法)
  title: 'message.router.home',
  // 菜单外链链接
  // 敞开外链条件,`1、isLink: true 2、链接地址不为空(meta.isLink) 3、isIframe: false`
  isLink: '',
  // 菜单是否躲藏(菜单不显现在界面,但可以进行跳转)
  isHide: false,
  // 菜单是否缓存
  isKeepAlive: true,
  // 菜单是否固定(固定在 tagsView 中,不行进行关闭),右键菜单无 `关闭` 项
  isAffix: true,
  // 是否内嵌
  // 敞开条件,`1、isIframe: true 2、链接地址不为空(meta.isLink)`
  isIframe: false,
  // 当时路由权限标识,取人物办理。操控路由显现、躲藏。超级办理员:admin 一般人物:common
  // 之前 auth 取用户(人物下有多个用户)
  roles: ['admin', 'common'],
  // 菜单图标
  icon: 'iconfont icon-shouye',
  // 自行再添加
  ...
  },
}
CREATE TABLE `sys_menu` (
  `menu_id`    BIGINT(20)  NOT NULL        COMMENT '菜单称号',
  `menu_name`   VARCHAR(32)  NOT NULL        COMMENT '菜单称号',
  `parent_id`   BIGINT(20)  DEFAULT NULL      COMMENT '父菜单ID',
  `permission`   VARCHAR(32)  DEFAULT NULL      COMMENT '权限标识',
  `type`      CHAR(1)    DEFAULT NULL      COMMENT '菜单类型(0菜单 1按钮)',
  `order_num`   INT(4)    NOT NULL DEFAULT '0'  COMMENT '排序值',
  `path`      VARCHAR(128) DEFAULT NULL      COMMENT '路由地址(前端URL)',
  `component`   VARCHAR(255) DEFAULT null      COMMENT '组件途径',
  `redirect`    VARCHAR(255) DEFAULT null      COMMENT '重定向途径',
  `is_link`    CHAR(1)    DEFAULT '0'       COMMENT '是否为外链(0否 1是)',
  `is_hide`    CHAR(1)    DEFAULT '0'       COMMENT '是否躲藏(0否 1是)',
  `is_keep_alive` CHAR(1)    DEFAULT '0'       COMMENT '是否敞开缓存(0否 1是)',
  `is_affix`    CHAR(1)    DEFAULT '0'       COMMENT '是否固定(0否 1是)',
  `is_iframe`   CHAR(1)    DEFAULT '0'       COMMENT '是否内嵌(0否 1是)',
  `status`     CHAR(1)    DEFAULT '0'       COMMENT '菜单状况(0正常 1停用)',
  `icon`      VARCHAR(64)  DEFAULT NULL      COMMENT '图标',
  `is_deleted`   CHAR(1)    DEFAULT '0'       COMMENT '删去标志(0正常,1删去)',
  `create_time`  DATETIME   DEFAULT NULL      COMMENT '创建时刻',
  `update_time`  DATETIME   DEFAULT NULL      COMMENT '修正时刻',
  `create_by`   VARCHAR(64)  DEFAULT NULL      COMMENT '创建者',
  `update_by`   VARCHAR(64)  DEFAULT NULL      COMMENT '更新人',
  PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜单权限表';
​
​
BEGIN;
INSERT INTO `sys_menu` VALUES (1000, '系统办理', -1, NULL, '0', 0, '/system', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-xitongshezhi', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1100, '用户办理', 1000, NULL, '0', 0, '/system/user', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-icon-', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1200, '人物办理', 1000, NULL, '0', 1, '/system/role', NULL, NULL, '0', '0', '0', '0', '0', '0', 'ele-ColdDrink', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1300, '菜单办理', 1000, NULL, '0', 2, '/system/menu', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-caidan', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
COMMIT;

人物菜单相关表

办理人物与菜单之间联系,人物 1 => 菜单(权限点)N

DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE sys_role_menu (
  `role_id`  BIGINT(20) NOT NULL COMMENT '人物ID',
  `menu_id`  BIGINT(20) NOT NULL COMMENT '菜单ID',
  PRIMARY KEY (`role_id`, `menu_id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '人物和菜单相关表';
​
BEGIN;
INSERT INTO `sys_role_menu` VALUES (1, 1000);
INSERT INTO `sys_role_menu` VALUES (1, 1100);
INSERT INTO `sys_role_menu` VALUES (1, 1200);
INSERT INTO `sys_role_menu` VALUES (1, 1300);
INSERT INTO `sys_role_menu` VALUES (2, 1000);
INSERT INTO `sys_role_menu` VALUES (2, 1100);
COMMIT;

编写联系 SQL

用户与人物

SELECT su.user_id, su.username, su.nickname,sur.role_id,sr.role_name FROM sys_user su
LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
LEFT JOIN sys_role sr ON sr.role_id = sur.role_id

人物与菜单

SELECT sr.role_id, sr.role_name, sm.menu_id, sm.menu_name FROM sys_role sr
LEFT JOIN sys_role_menu srm ON srm.role_id = sr.role_id
LEFT JOIN sys_menu sm ON sm.menu_id = srm.menu_id

用户与菜单

SELECT su.user_id, su.username, su.nickname,sur.role_id,sr.role_name, sm.menu_id, sm.menu_name FROM sys_user su
LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
LEFT JOIN sys_role sr ON sr.role_id = sur.role_id
LEFT JOIN sys_role_menu srm ON srm.role_id = sr.role_id
LEFT JOIN sys_menu sm ON sm.menu_id = srm.menu_id

小结

数据库权限模型规划到此就 OK 啦~

接下来把基础代码生成一下,对外提供相应接口