Commit e2cc5af9375f59d2891be769010ef5d3ccfe9755

Authored by Vben
1 parent 908116dd

fix(route): ensure that the first level menu can be hidden

CHANGELOG.zh_CN.md
... ... @@ -19,6 +19,7 @@
19 19 - 修复后台权限指令不生效
20 20 - 确保 progress 进度条正确关闭
21 21 - 修复表格勾选列配置失效问题
  22 +- 确保一级菜单可以被隐藏
22 23  
23 24 ## 2.1.0 (2021-03-15)
24 25  
... ...
src/router/helper/routeHelper.ts
... ... @@ -79,27 +79,28 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul
79 79 /**
80 80 * Convert multi-level routing to level 2 routing
81 81 */
82   -export function flatRoutes(routeModules: AppRouteModule[]) {
83   - for (let index = 0; index < routeModules.length; index++) {
84   - const routeModule = routeModules[index];
  82 +export function flatMultiLevelRoutes(routeModules: AppRouteModule[]) {
  83 + const modules: AppRouteModule[] = cloneDeep(routeModules);
  84 + for (let index = 0; index < modules.length; index++) {
  85 + const routeModule = modules[index];
85 86 if (!isMultipleRoute(routeModule)) {
86 87 continue;
87 88 }
88 89 promoteRouteLevel(routeModule);
89 90 }
  91 + return modules;
90 92 }
91 93  
92 94 // Routing level upgrade
93 95 function promoteRouteLevel(routeModule: AppRouteModule) {
94 96 // Use vue-router to splice menus
95 97 let router: Router | null = createRouter({
96   - routes: [routeModule as any],
  98 + routes: [(routeModule as unknown) as RouteRecordNormalized],
97 99 history: createWebHashHistory(),
98 100 });
99 101  
100 102 const routes = router.getRoutes();
101   - const children = cloneDeep(routeModule.children);
102   - addToChildren(routes, children || [], routeModule);
  103 + addToChildren(routes, routeModule.children || [], routeModule);
103 104 router = null;
104 105  
105 106 routeModule.children = routeModule.children?.filter((item) => !item.children?.length);
... ... @@ -114,12 +115,15 @@ function addToChildren(
114 115 for (let index = 0; index < children.length; index++) {
115 116 const child = children[index];
116 117 const route = routes.find((item) => item.name === child.name);
117   - if (route) {
118   - routeModule.children = routeModule.children || [];
119   - routeModule.children?.push(route as any);
120   - if (child.children?.length) {
121   - addToChildren(routes, child.children, routeModule);
122   - }
  118 + if (!route) {
  119 + continue;
  120 + }
  121 + routeModule.children = routeModule.children || [];
  122 + if (!routeModule.children.find((item) => item.name === route.name)) {
  123 + routeModule.children?.push((route as unknown) as AppRouteModule);
  124 + }
  125 + if (child.children?.length) {
  126 + addToChildren(routes, child.children, routeModule);
123 127 }
124 128 }
125 129 }
... ...
src/router/menus/index.ts
... ... @@ -45,6 +45,7 @@ async function getAsyncMenus() {
45 45 export const getMenus = async (): Promise<Menu[]> => {
46 46 const menus = await getAsyncMenus();
47 47 const routes = router.getRoutes();
  48 +
48 49 return !isBackMode() ? filter(menus, basicFilter(routes)) : menus;
49 50 };
50 51  
... ...
src/router/routes/index.ts
... ... @@ -5,7 +5,6 @@ import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from &#39;/@/router/routes/basic&#39;;
5 5 import { mainOutRoutes } from './mainOut';
6 6 import { PageEnum } from '/@/enums/pageEnum';
7 7 import { t } from '/@/hooks/web/useI18n';
8   -import { flatRoutes } from '/@/router/helper/routeHelper';
9 8  
10 9 const modules = import.meta.globEager('./modules/**/*.ts');
11 10  
... ... @@ -17,9 +16,6 @@ Object.keys(modules).forEach((key) =&gt; {
17 16 routeModuleList.push(...modList);
18 17 });
19 18  
20   -// Multi-level routing conversion
21   -flatRoutes(routeModuleList);
22   -
23 19 export const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList];
24 20  
25 21 export const RootRoute: AppRouteRecordRaw = {
... ...
src/store/modules/permission.ts
... ... @@ -15,7 +15,7 @@ import { toRaw } from &#39;vue&#39;;
15 15 import { getMenuListById } from '/@/api/sys/menu';
16 16 import { getPermCodeByUserId } from '/@/api/sys/user';
17 17  
18   -import { transformObjToRoute, flatRoutes } from '/@/router/helper/routeHelper';
  18 +import { transformObjToRoute, flatMultiLevelRoutes } from '/@/router/helper/routeHelper';
19 19 import { transformRouteToMenu } from '/@/router/helper/menuHelper';
20 20  
21 21 import { useMessage } from '/@/hooks/web/useMessage';
... ... @@ -99,12 +99,16 @@ class Permission extends VuexModule {
99 99  
100 100 // role permissions
101 101 if (permissionMode === PermissionModeEnum.ROLE) {
102   - routes = filter(asyncRoutes, (route) => {
  102 + const routeFilter = (route) => {
103 103 const { meta } = route as AppRouteRecordRaw;
104 104 const { roles } = meta || {};
105 105 if (!roles) return true;
106 106 return roleList.some((role) => roles.includes(role));
107   - });
  107 + };
  108 + routes = filter(asyncRoutes, routeFilter);
  109 + routes = routes.filter(routeFilter);
  110 + // Convert multi-level routing to level 2 routing
  111 + routes = flatMultiLevelRoutes(routes);
108 112 // If you are sure that you do not need to do background dynamic permissions, please comment the entire judgment below
109 113 } else if (permissionMode === PermissionModeEnum.BACK) {
110 114 createMessage.loading({
... ... @@ -131,7 +135,7 @@ class Permission extends VuexModule {
131 135 const backMenuList = transformRouteToMenu(routeList);
132 136 this.commitBackMenuListState(backMenuList);
133 137  
134   - flatRoutes(routeList);
  138 + routeList = flatMultiLevelRoutes(routeList);
135 139 routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
136 140 }
137 141 routes.push(ERROR_LOG_ROUTE);
... ...