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