Commit 0b68995bd907a05fa4f4e95290a194babe954674

Authored by fengtao
1 parent b7ce8589

fix:DEFECT-432 修复超级管理员分配菜单权限和按钮权限问题

Showing 1 changed file with 112 additions and 56 deletions
... ... @@ -11,12 +11,11 @@ import projectSetting from '/@/settings/projectSetting';
11 11 import { PermissionModeEnum } from '/@/enums/appEnum';
12 12 import { asyncRoutes } from '/@/router/routes';
13 13 import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
14   -import { filter } from '/@/utils/helper/treeHelper';
15   -import { getMenuList } from '/@/api/sys/menu';
  14 +import { filter, forEach } from '/@/utils/helper/treeHelper';
  15 +import { getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu';
16 16 import { getPermCode } from '/@/api/sys/user';
17 17 import { useMessage } from '/@/hooks/web/useMessage';
18 18 import { PageEnum } from '/@/enums/pageEnum';
19   -import { router as navRouter } from '/@/router';
20 19 import { MENU_LIST, USER_INFO_KEY } from '/@/enums/cacheEnum';
21 20 import { getAuthCache, setAuthCache } from '/@/utils/auth';
22 21 import { createStorage } from '/@/utils/cache/index';
... ... @@ -90,8 +89,48 @@ export const usePermissionStore = defineStore({
90 89 this.lastBuildMenuTime = 0;
91 90 },
92 91 async changePermissionCode() {
  92 + const filterMenu = (allMenuList, menuIdsList) => {
  93 + return allMenuList
  94 + .filter((item) => {
  95 + return menuIdsList.indexOf(item.id) > -1;
  96 + })
  97 + .map((subItem) => {
  98 + subItem = Object.assign({}, subItem);
  99 + if (subItem.children) {
  100 + subItem.children = filterMenu(subItem.children, menuIdsList);
  101 + }
  102 + return subItem;
  103 + });
  104 + };
  105 + const userInfo: any = getAuthCache(USER_INFO_KEY);
  106 + const isSysAdmin = 'SYS_ADMIN';
  107 + const routeList = (await getMenuList(2)) as AppRouteRecordRaw[];
  108 + let getSysPermission = [];
  109 + /**
  110 + * 否则不是超级管理员-获取对应角色的权限列表
  111 + */
93 112 const codeList = await getPermCode();
94 113 this.setPermCodeList(codeList);
  114 + /**
  115 + * 如果是超级管理员则获取对应权限列表
  116 + */
  117 + if (userInfo.roles.includes(isSysAdmin) || userInfo.realName == '超级管理员') {
  118 + const getMenuIds = await getMenusIdsByRoleId(userInfo.plainRoles[0].roleId);
  119 + //根据对应的使用者的菜单数组和所有菜单数组对象进行过滤,返回最终需要的菜单
  120 + const newMenu = filterMenu(routeList, getMenuIds);
  121 + /**
  122 + * 递归获取对应所有菜单的权限列表
  123 + */
  124 + function lookForAllId(data = [], arr = []) {
  125 + for (const item of data) {
  126 + arr.push(item.permission);
  127 + if (item.children && item.children.length) lookForAllId(item.children, arr);
  128 + }
  129 + return arr;
  130 + }
  131 + getSysPermission = lookForAllId(newMenu);
  132 + this.setPermCodeList(getSysPermission);
  133 + }
95 134 },
96 135 async buildRoutesAction(): Promise<AppRouteRecordRaw[]> {
97 136 const { t } = useI18n();
... ... @@ -183,70 +222,87 @@ export const usePermissionStore = defineStore({
183 222 // !Simulate to obtain permission codes from the background,
184 223 // this function may only need to be executed once, and the actual project can be put at the right time by itself
185 224 let routeList: AppRouteRecordRaw[] = [];
186   - try {
187   - const userInfo = getAuthCache(USER_INFO_KEY);
188   - if (userInfo?.needSetPwd == true) {
189   - routeList = [
190   - {
191   - name: 'routes.common.system.system',
192   - parentId: '',
193   - children: [
194   - {
195   - id: 'a8ffa8c5-637e-476b-a9e6-b60cebe95718',
196   - createTime: '2021-09-10 20:50:55',
197   - updateTime: '2021-11-16 18:58:24',
198   - name: 'routes.common.system.modifyPassword',
199   - parentId: 'a8ffa8c5-637e-471b-a9e6-b60cebe95713',
200   - children: [],
201   - path: '/system/changePassword',
202   - type: 'SYSADMIN',
203   - permission: 'system:password:view',
204   - sort: 6,
205   - component: '/system/changePassword/index',
206   - meta: {
207   - icon: 'bx:bx-home',
208   - title: 'routes.common.system.modifyPassword',
209   - menuType: '1',
210   - ignoreKeepAlive: true,
211   - hideMenu: false,
212   - status: '0',
213   - },
214   - redirect: '',
  225 + const userInfo: any = getAuthCache(USER_INFO_KEY);
  226 + const filterMenu = (allMenuList, menuIdsList) => {
  227 + return allMenuList
  228 + .filter((item) => {
  229 + return menuIdsList.indexOf(item.id) > -1;
  230 + })
  231 + .map((subItem) => {
  232 + subItem = Object.assign({}, subItem);
  233 + if (subItem.children) {
  234 + subItem.children = filterMenu(subItem.children, menuIdsList);
  235 + }
  236 + return subItem;
  237 + });
  238 + };
  239 + if (userInfo?.needSetPwd == true) {
  240 + routeList = [
  241 + {
  242 + name: 'routes.common.system.system',
  243 + parentId: '',
  244 + children: [
  245 + {
  246 + id: 'a8ffa8c5-637e-476b-a9e6-b60cebe95718',
  247 + createTime: '2021-09-10 20:50:55',
  248 + updateTime: '2021-11-16 18:58:24',
  249 + name: 'routes.common.system.modifyPassword',
  250 + parentId: 'a8ffa8c5-637e-471b-a9e6-b60cebe95713',
  251 + children: [],
  252 + path: '/system/changePassword',
  253 + type: 'SYSADMIN',
  254 + permission: 'system:password:view',
  255 + sort: 6,
  256 + component: '/system/changePassword/index',
  257 + meta: {
  258 + icon: 'bx:bx-home',
  259 + title: 'routes.common.system.modifyPassword',
  260 + menuType: '1',
  261 + ignoreKeepAlive: true,
  262 + hideMenu: false,
  263 + status: '0',
215 264 },
216   - ],
217   - path: '/system',
218   - type: 'SYSADMIN',
219   - permission: '',
220   - sort: 6,
221   - component: 'LAYOUT',
222   - meta: {
223   - icon: 'bx:bx-home',
224   - title: 'routes.common.system.system',
225   - status: '0',
226   - menuType: '0',
  265 + redirect: '',
227 266 },
228   - redirect: '/system/systemManagement',
  267 + ],
  268 + path: '/system',
  269 + type: 'SYSADMIN',
  270 + permission: '',
  271 + sort: 6,
  272 + component: 'LAYOUT',
  273 + meta: {
  274 + icon: 'bx:bx-home',
  275 + title: 'routes.common.system.system',
  276 + status: '0',
  277 + menuType: '0',
229 278 },
230   - ] as AppRouteRecordRaw[];
231   - } else {
232   - this.changePermissionCode();
233   - routeList = (await getMenuList(1)) as AppRouteRecordRaw[];
234   - createStorage('MENU_LIST', JSON.stringify(routeList));
235   - setAuthCache('MENU_LIST', routeList);
  279 + redirect: '/system/systemManagement',
  280 + },
  281 + ] as AppRouteRecordRaw[];
  282 + } else {
  283 + this.changePermissionCode();
  284 + routeList = (await getMenuList(1)) as AppRouteRecordRaw[];
  285 + const isSysAdmin = 'SYS_ADMIN';
  286 + /**
  287 + * 解决超级管理员分配菜单权限问题
  288 + */
  289 + if (userInfo.roles.includes(isSysAdmin) || userInfo.realName == '超级管理员') {
  290 + const getMenuIds = await getMenusIdsByRoleId(userInfo.plainRoles[0].roleId);
  291 + //根据对应的使用者的菜单数组和所有菜单数组对象进行过滤,返回最终需要的菜单
  292 + const newMenu = filterMenu(routeList, getMenuIds);
  293 + routeList = newMenu;
236 294 }
237   - } catch (error) {
238   - console.error(error);
239   - } // Dynamically introduce components
  295 + createStorage('MENU_LIST', JSON.stringify(routeList));
  296 + setAuthCache('MENU_LIST', routeList);
  297 + }
  298 + // Dynamically introduce components
240 299 routeList = transformObjToRoute(routeList);
241   -
242 300 // Background routing to menu structure
243 301 const backMenuList = transformRouteToMenu(routeList);
244 302 this.setBackMenuList(backMenuList);
245   -
246 303 // remove meta.ignoreRoute item
247 304 routeList = filter(routeList, routeRemoveIgnoreFilter);
248 305 routeList = routeList.filter(routeRemoveIgnoreFilter);
249   -
250 306 routeList = flatMultiLevelRoutes(routeList);
251 307 routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
252 308 break;
... ...