首先介紹下思路:
1、用戶表 user;
2、角色表 role;
3、菜單 menu;
4、角色菜單權限表 role_menu;
5、用戶菜單權限表 user_menu;
如圖:
根據用戶角色取出該角色所有權限,並對用戶進行權限分配;註意菜單的按鈕(新增、刪除、修改)權限是放在中間表(user_menu)中的;
1、新增用戶時,是要根據用戶角色進行分配權限的 壹定記得批量添加;批量、批量、批量,重要的事情說三遍,不要查詢角色權限,然後for循環,這樣效率太低了;
SQL如下:
INSERT INTO sys_user_menu(UserId, MenuId, DelPower, UpdPower, InsPower, ViewPower)
SELECT #{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId = #{roleId}
updPower 默認都是有的 所以都是1,這樣根據角色查詢出權限直接添加,響應時間大大提升;
2、修改用戶角色也要記得重新分配用戶權限哦!這個不能忘,可以用上面的方法;
業務方法:
如果角色沒有修改,是不用重新分配權限的,所有userRole 重置為 null,如果角色修改則刪除原權限,重新進行分配;
3、最後要優化的就是根據用戶查詢權限的時候啦,我最開始是這樣做的,查詢角色權限,用戶權限,返回到前端,前端進行處理;結果就是很卡 基本上要三到四秒,
解決方案,壹步到位;壹個查詢返回全部數據。
如下SQL:
SELECT menu.MenuId id, ParentId pid, MenuName text,
(SELECT COUNT(1) FROM sys_user_menu WHERE UserId = #{userId} AND? MenuId = sm.MenuId) isShow,
(SELECT CONCAT(
(CASE WHEN smenu.InsPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.DelPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.UpdPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.ViewPower = 1 THEN 1 ELSE 0 END))
FROM sys_user_menu smenu WHERE smenu.UserId = #{userId}
AND? smenu.MenuId = sm.MenuId) MenuInfo
FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId = menu.MenuId
WHERE RoelId = #{roleId}
首先根據 角色ID查詢出權限,然後子查詢用戶是否有該權限,有返回1 木用返回 0;
最後按鈕權限 我是直接拼接成字符串,分別對應 添加、刪除、修改、查看 1 有該按鈕 0 沒有該按鈕;
優化後 不管是添加、修改用戶,加載用戶權限都能控制在 1~2 秒;