寫在最前
如果這個項目讓你有所收獲,記得 Star 關(guān)注哦,這對我是非常不錯的鼓勵與支持。
源碼地址(后端):https://gitee.com/csps/mingyue-springcloud-learning
源碼地址(前端):https://gitee.com/csps/mingyue-springcloud-ui
文檔地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis
數(shù)據(jù)庫權(quán)限模型設計
設計思路:通過用戶關(guān)聯(lián)角色(一個用戶可關(guān)聯(lián)多個角色),角色關(guān)聯(lián)菜單(一個角色可關(guān)聯(lián)多個菜單),完成用戶權(quán)限控制。
- 用戶 1 => 角色 N
- 角色 1 => 菜單(權(quán)限點)N
sys_user 用戶表
sys_user_role 用戶角色關(guān)系表
sys_role 角色表
sys_role_menu 角色菜單關(guān)系表
sys_menu 菜單表
用戶表
用戶表在之前的開發(fā)中已經(jīng)設計并使用了
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 '帳號狀態(tài)(0正常 1停用)',
`is_deleted` CHAR(1) DEFAULT '0' COMMENT '刪除標志(0正常,1刪除)',
`create_time` DATETIME DEFAULT NULL COMMENT '創(chuàng)建時間',
`update_time` DATETIME DEFAULT NULL COMMENT '修改時間',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '創(chuàng)建者',
`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 '角色狀態(tài)(0正常 1停用)',
`role_desc` VARCHAR(255) DEFAULT NULL COMMENT '角色描述',
`is_deleted` CHAR(1) DEFAULT '0' COMMENT '刪除標志(0正常,1刪除)',
`create_time` DATETIME DEFAULT NULL COMMENT '創(chuàng)建時間',
`update_time` DATETIME DEFAULT NULL COMMENT '修改時間',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '創(chuàng)建者',
`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;
用戶角色關(guān)系表
管理用戶與角色之間關(guān)系,用戶 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 = '用戶和角色關(guān)聯(lián)表';
BEGIN;
INSERT INTO `sys_user_role` VALUES (1, 1);
INSERT INTO `sys_user_role` VALUES (2, 2);
COMMIT;
菜單表
菜單表的設計參考前端項目 JSON 數(shù)據(jù)設計
{
// 菜單路徑,用于跳轉(zhuǎn)
path: '/home',
// 菜單 name,用于界面 keep-alive 路由緩存。
// 此 name 需要與 component 組件中的 name 值相同(唯一)
name: 'home',
// 組件路徑
component: () => import('/@/views/home/index.vue'),
// 菜單重定向路徑
redirect: '/home',
// 附加自定義數(shù)據(jù)
meta: {
// 菜單標題(國際化寫法)
title: 'message.router.home',
// 菜單外鏈鏈接
// 開啟外鏈條件,`1、isLink: true 2、鏈接地址不為空(meta.isLink) 3、isIframe: false`
isLink: '',
// 菜單是否隱藏(菜單不顯示在界面,但可以進行跳轉(zhuǎn))
isHide: false,
// 菜單是否緩存
isKeepAlive: true,
// 菜單是否固定(固定在 tagsView 中,不可進行關(guān)閉),右鍵菜單無 `關(guān)閉` 項
isAffix: true,
// 是否內(nèi)嵌
// 開啟條件,`1、isIframe: true 2、鏈接地址不為空(meta.isLink)`
isIframe: false,
// 當前路由權(quán)限標識,取角色管理??刂坡酚娠@示、隱藏。超級管理員: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 '權(quán)限標識',
`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 '是否內(nèi)嵌(0否 1是)',
`status` CHAR(1) DEFAULT '0' COMMENT '菜單狀態(tài)(0正常 1停用)',
`icon` VARCHAR(64) DEFAULT NULL COMMENT '圖標',
`is_deleted` CHAR(1) DEFAULT '0' COMMENT '刪除標志(0正常,1刪除)',
`create_time` DATETIME DEFAULT NULL COMMENT '創(chuàng)建時間',
`update_time` DATETIME DEFAULT NULL COMMENT '修改時間',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '創(chuàng)建者',
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜單權(quán)限表';
BEGIN;
INSERT INTO `sys_menu` VALUES (1000, '系統(tǒng)管理', -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;
角色菜單關(guān)聯(lián)表
管理角色與菜單之間關(guān)系,角色 1 => 菜單(權(quán)限點)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 = '角色和菜單關(guān)聯(lián)表';
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;
編寫關(guān)系 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
小結(jié)
數(shù)據(jù)庫權(quán)限模型設計到此就 OK 啦~文章來源:http://www.zghlxwxcb.cn/news/detail-602392.html
接下來把基礎代碼生成一下,對外提供相應接口文章來源地址http://www.zghlxwxcb.cn/news/detail-602392.html
到了這里,關(guān)于017-從零搭建微服務-系統(tǒng)服務(四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!