前言
最近一直在重寫後臺系統,對使用的界面與技術進行一次更新。涉及到權限這塊,最初考慮引入Shiro,但由於對這個框架理解不太深,並且項目DeadLine在那放着,所以決定自己搞一套,畢竟自己搞的比較熟悉方便維護,也方便二次開發定製。
需求明確
以下是整理的現階段需求,以後有二期需求再加上
一、用戶未登錄時,會提示未登錄並轉到登錄界面
二、用戶賬戶被鎖定時,會提示被鎖定並轉到登錄界面
三、用戶在沒有權限時,點擊後臺按鈕會提示無權限
四、菜單要根據給用戶分配的角色填充,只出現該角色可展示的菜單
五、不攔截靜態資源,如:css、js、html等
六、區分是否是Ajax請求,是的話返回對應json數據
七、用戶只能查看自己的產品
數據庫設計
需求明確就可以設計數據庫了,這個根據項目、業務來。
用戶表
產品表
角色表
菜單表
權限表
用戶與產品關聯表
用戶與角色關聯表
角色與菜單關聯表
角色與權限關聯表
以下是對應結構圖:
圖片:
首先看菜單設計
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構成。