(1) 相關博文地址: SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(一):搭建基本環境:https://www.cnblogs.com/l-y-h/p/12930895.html SpringBoot + Vue + ElementUI 實現後臺管理 ...
(1) 相關博文地址:
SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(一):搭建基本環境:https://www.cnblogs.com/l-y-h/p/12930895.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(二):引入 element-ui 定義基本頁面顯示:https://www.cnblogs.com/l-y-h/p/12935300.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(三):引入 js-cookie、axios、mock 封裝請求處理以及返回結果:https://www.cnblogs.com/l-y-h/p/12955001.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(四):引入 vuex 進行狀態管理、引入 vue-i18n 進行國際化管理:https://www.cnblogs.com/l-y-h/p/12963576.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(五):引入 vue-router 進行路由管理、模塊化封裝 axios 請求、使用 iframe 標簽嵌套頁面:https://www.cnblogs.com/l-y-h/p/12973364.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(六):使用 vue-router 進行動態載入菜單:https://www.cnblogs.com/l-y-h/p/13052196.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 後端篇(一): 搭建基本環境、整合 Swagger、MyBatisPlus、JSR303 以及國際化操作:https://www.cnblogs.com/l-y-h/p/13083375.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 後端篇(二): 整合 Redis(常用工具類、緩存)、整合郵件發送功能:https://www.cnblogs.com/l-y-h/p/13163653.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 後端篇(三): 整合阿裡雲 OSS 服務 -- 上傳、下載文件、圖片:https://www.cnblogs.com/l-y-h/p/13202746.html SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 後端篇(四): 整合阿裡雲 簡訊服務、整合 JWT 單點登錄:https://www.cnblogs.com/l-y-h/p/13214493.html
(2)代碼地址:
https://github.com/lyh-man/admin-vue-template.git
一、數據表設計
1、需求分析
(1)目的:
由於此項目作為一個後臺管理系統模板,不同用戶登錄後應該有不同的操作許可權,所以此處實現一個簡單的菜單許可權控制。即不同用戶登錄系統後,會展示不同的菜單,並對菜單具有操作(增刪改查)的許可權。
(2)數據表設計(自己瞎搗鼓的,有不對的地方還望 DBA 大神不吝賜教(=_=)):
需求:
一個用戶登錄系統後,根據其所代表的的角色,去查詢其對應的菜單許可權,並返回相應的菜單數據。
整個設計核心可以分為:用戶、用戶角色(下麵簡稱角色)、菜單許可權(下麵簡稱菜單)。
思考一:
一個用戶只擁有一個角色,一個角色可以被多個用戶擁有。
一個角色可以有多個菜單,一個菜單可以被多個角色擁有。
即 角色 與 用戶間為 1 對 多關係,角色 與 菜單 間為 多對多關係。
所以可以在用戶表中定義一個欄位作為外鍵 關聯到 角色表。
而角色表 與 菜單表 採用 中間表去維護。
思考二:
一個用戶可以有多個角色,一個角色可以被多個用戶擁有。
一個角色可以有多個菜單,一個菜單可以被多個角色擁有。
即 菜單 與 角色 間屬於 多對多關係,用戶 與 角色間 也屬於 多對多關係。
所以 用戶表 與 角色表間、角色表 與 菜單表間均可以採用 中間表維護。
為了避免使用外鍵,此處我均採用中間表對三張表進行數據關聯。
最終設計(三個主表,兩個中間表):
用戶表 sys_user
用戶角色表 sys_user_role
角色表 sys_role
角色菜單表 sys_role_menu
菜單表 sys_menu
2、用戶表(sys_user)設計
(1)必須欄位:
用戶 ID、用戶名、用戶手機號、用戶密碼。
其中:
用戶手機號 作為用戶註冊、登錄的依據(用戶名也可以登錄)。
用戶名為 用戶登錄後顯示的 昵稱。
用戶密碼 需要密文存儲(此項目中 前端、後端均對密碼進行 MD5 加密處理)。
(2)數據表結構如下:
-- DROP DATABASE IF EXISTS admin_template; -- -- CREATE DATABASE admin_template; -- --------------------------sys_user 用戶表--------------------------------------- USE admin_template; DROP TABLE IF EXISTS sys_user; -- 用戶表 CREATE TABLE sys_user ( id bigint NOT NULL COMMENT '用戶 ID', name varchar(20) NOT NULL COMMENT '用戶名', mobile varchar(20) NOT NULL COMMENT '用戶手機號', password varchar(64) NOT NULL COMMENT '用戶密碼', sex tinyint DEFAULT NULL COMMENT '性別, 0 表示女, 1 表示男', age tinyint DEFAULT NULL COMMENT '年齡', avatar varchar(255) DEFAULT NULL COMMENT '頭像', email varchar(100) DEFAULT NULL COMMENT '郵箱', create_time datetime DEFAULT NULL COMMENT '創建時間', update_time datetime DEFAULT NULL COMMENT '修改時間', delete_flag tinyint DEFAULT NULL COMMENT '邏輯刪除標誌,0 表示未刪除, 1 表示刪除', disabled_flag tinyint DEFAULT NULL COMMENT '禁用標誌, 0 表示未禁用, 1 表示禁用', wx_id varchar(128) DEFAULT NULL COMMENT '微信 openid(拓展欄位、用於第三方微信登錄)', qq_id varchar(128) DEFAULT NULL COMMENT 'QQ openid(拓展欄位、用於第三方 QQ 登錄)', PRIMARY KEY(id), UNIQUE INDEX(name), UNIQUE INDEX(mobile) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系統用戶表'; -- 插入數據 INSERT INTO `sys_user`(`id`, `name`, `mobile`, `password`, `sex`, `age`, `avatar`, `email`, `create_time`, `update_time`, `delete_flag`, `disabled_flag`, `wx_id`, `qq_id`) VALUES (1278601251755454466, 'superAdmin', '17730125031', 'e10adc3949ba59abbe56e057f20f883e', 1, 23, NULL, "m_17730125031@163.com", '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0, 0, NULL, NULL), (1278601251755451232, 'admin', '17730125032', 'e10adc3949ba59abbe56e057f20f883e', 1, 23, NULL, "m_17730125031@163.com", '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0, 0, NULL, NULL), (1278601251755456778, 'jack', '17730125033', 'e10adc3949ba59abbe56e057f20f883e', 1, 23, NULL, "m_17730125031@163.com", '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0, 0, NULL, NULL); -- --------------------------sys_user 用戶表---------------------------------------
3、角色表(sys_role)設計
(1)必須欄位:
角色 ID,角色名稱。
其中:
角色名稱用於定位用戶角色。
(2)數據表結構如下:
-- DROP DATABASE IF EXISTS admin_template; -- -- CREATE DATABASE admin_template; -- --------------------------sys_role 角色表--------------------------------------- USE admin_template; DROP TABLE IF EXISTS sys_role; -- 系統用戶角色表 CREATE TABLE sys_role ( id bigint NOT NULL COMMENT '角色 ID', role_name varchar(20) NOT NULL COMMENT '角色名稱', role_code varchar(20) DEFAULT NULL COMMENT '角色碼', remark varchar(255) DEFAULT NULL COMMENT '角色備註', create_time datetime DEFAULT NULL COMMENT '創建時間', update_time datetime DEFAULT NULL COMMENT '修改時間', delete_flag tinyint DEFAULT NULL COMMENT '邏輯刪除標誌,0 表示未刪除, 1 表示刪除', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系統用戶角色表'; -- 插入數據 INSERT INTO `sys_role`(`id`, `role_name`, `role_code`, `remark`, `create_time`, `update_time`, `delete_flag`) VALUES (1278601251755451245, 'superAdmin', '1001', '超級管理員','2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755452551, 'admin', '2001', '普通管理員','2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755458779, 'user', '3001', '普通用戶','2020-07-02 16:07:48', '2020-07-02 16:07:48', 0); -- --------------------------sys_role 角色表---------------------------------------
4、菜單許可權表(sys_menu)設計
(1)必須欄位:
當前菜單 ID,父菜單 ID,菜單名,菜單類型,菜單路徑
其中:
當前菜單 ID 與 父菜單 ID 用於確定菜單的層級順序。
菜單類型 用於確定是否顯示在菜單目錄中(按鈕不顯示在菜單目錄中)。
菜單路徑 用於確定最終指向的 組件路徑(使用 vue-route 進行路由跳轉)。
註:
最外層 父菜單 ID 此處設置為 0,但不創建 ID 為 0 的數據。
(2)數據表結構如下:
-- DROP DATABASE IF EXISTS admin_template; -- -- CREATE DATABASE admin_template; -- --------------------------sys_menu 菜單許可權表--------------------------------------- USE admin_template; DROP TABLE IF EXISTS sys_menu; -- 系統菜單許可權表 CREATE TABLE sys_menu ( menu_id bigint NOT NULL COMMENT '當前菜單 ID', parent_id bigint NOT NULL COMMENT '當前菜單父菜單 ID', name_zh varchar(20) NOT NULL COMMENT '中文菜單名稱', name_en varchar(40) NOT NULL COMMENT '英文菜單名稱', type tinyint NOT NULL COMMENT '菜單類型,0 表示目錄,1 表示菜單項,2 表示按鈕', url varchar(100) NOT NULL COMMENT '訪問路徑', icon varchar(100) DEFAULT NULL COMMENT '菜單圖標', order_num int DEFAULT NULL COMMENT '菜單項順序', create_time datetime DEFAULT NULL COMMENT '創建時間', update_time datetime DEFAULT NULL COMMENT '修改時間', delete_flag tinyint DEFAULT NULL COMMENT '邏輯刪除標誌,0 表示未刪除, 1 表示刪除', PRIMARY KEY(menu_id) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系統菜單許可權表'; -- 插入數據 INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name_zh`, `name_en`, `type`, `url`, `icon`, `order_num`, `create_time`, `update_time`, `delete_flag`) VALUES (127860125171111, 0, '系統管理', 'System Control', 0, '', 'el-icon-setting', 0,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125172211, 127860125171111, '用戶管理', 'User Control', 1, 'sys/UserList', 'el-icon-user', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125173311, 127860125171111, '角色管理', 'Role Control', 1, 'sys/RoleControl', 'el-icon-price-tag', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125174411, 127860125171111, '菜單管理', 'Menu Control', 1, 'sys/MenuControl', 'el-icon-menu', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125172221, 127860125172211, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125172231, 127860125172211, '刪除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125172241, 127860125172211, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125172251, 127860125172211, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125173321, 127860125173311, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125173331, 127860125173311, '刪除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125173341, 127860125173311, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125173351, 127860125173311, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125174421, 127860125174411, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125174431, 127860125174411, '刪除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125174441, 127860125174411, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125174451, 127860125174411, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125175511, 0, '幫助', 'help', 0, '', 'el-icon-info', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125175521, 127860125175511, '百度', 'Baidu', 1, 'https://www.baidu.com/', 'el-icon-menu', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (127860125175531, 127860125175511, '博客', 'Blog', 1, 'https://www.cnblogs.com/l-y-h/', 'el-icon-menu', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0); -- --------------------------sys_menu 菜單許可權表---------------------------------------
5、中間表設計(sys_user_role、sys_role_menu)
(1)設計原則:
中間表存儲的是相關聯兩表的主鍵。
(2)用戶角色表如下:
-- DROP DATABASE IF EXISTS admin_template; -- -- CREATE DATABASE admin_template; -- --------------------------sys_user_role 用戶角色表--------------------------------------- USE admin_template; DROP TABLE IF EXISTS sys_user_role; -- 系統用戶角色表 CREATE TABLE sys_user_role ( id bigint NOT NULL COMMENT '用戶角色表 ID', role_id bigint NOT NULL COMMENT '角色 ID', user_id bigint NOT NULL COMMENT '用戶 ID', create_time datetime DEFAULT NULL COMMENT '創建時間', update_time datetime DEFAULT NULL COMMENT '修改時間', delete_flag tinyint DEFAULT NULL COMMENT '邏輯刪除標誌,0 表示未刪除, 1 表示刪除', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系統用戶角色表'; -- 插入數據 INSERT INTO `sys_user_role`(`id`, `role_id`, `user_id`, `create_time`, `update_time`, `delete_flag`) VALUES (1278601251755452234, '1278601251755451245', '1278601251755454466', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755453544, '1278601251755452551', '1278601251755451232', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755454664, '1278601251755458779', '1278601251755456778', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0); -- --------------------------sys_user_role 用戶角色表---------------------------------------
(3)角色菜單表如下:
-- DROP DATABASE IF EXISTS admin_template; -- -- CREATE DATABASE admin_template; -- --------------------------sys_role_menu 系統角色菜單表--------------------------------------- USE admin_template; DROP TABLE IF EXISTS sys_role_menu; -- 系統角色菜單表 CREATE TABLE sys_role_menu ( id bigint NOT NULL COMMENT '角色菜單表 ID', role_id bigint NOT NULL COMMENT '角色 ID', menu_id varchar(20) NOT NULL COMMENT '菜單 ID', create_time datetime DEFAULT NULL COMMENT '創建時間', update_time datetime DEFAULT NULL COMMENT '修改時間', delete_flag tinyint DEFAULT NULL COMMENT '邏輯刪除標誌,0 表示未刪除, 1 表示刪除', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系統角色菜單表'; -- 插入數據 INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`, `create_time`, `update_time`, `delete_flag`) VALUES (1278601251755461111, '1278601251755451245', '1278601251755451111', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461112, '1278601251755451245', '1278601251755452211', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461113, '1278601251755451245', '1278601251755453311', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461114, '1278601251755451245', '1278601251755454411', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461115, '1278601251755451245', '1278601251755452221', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461116, '1278601251755451245', '1278601251755452231', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461117, '1278601251755451245', '1278601251755452241', '2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), (1278601251755461118, '1278601251755451245