赞
踩
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning
源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui
文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis
设计思路:通过用户关联角色(一个用户可关联多个角色),角色关联菜单(一个角色可关联多个菜单),完成用户权限控制。
- 用户 1 => 角色 N
- 角色 1 => 菜单(权限点)N
sys_user 用户表
sys_user_role 用户角色关系表
sys_role 角色表
sys_role_menu 角色菜单关系表
sys_menu 菜单表
用户表在之前的开发中已经设计并使用了
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;
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 啦~
接下来把基础代码生成一下,对外提供相应接口
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。