Commit e2cc5af9375f59d2891be769010ef5d3ccfe9755
1 parent
908116dd
fix(route): ensure that the first level menu can be hidden
Showing
5 changed files
with
26 additions
and
20 deletions
CHANGELOG.zh_CN.md
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 '/@/router/routes/basic'; | @@ -5,7 +5,6 @@ import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic'; | ||
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) => { | @@ -17,9 +16,6 @@ Object.keys(modules).forEach((key) => { | ||
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 'vue'; | @@ -15,7 +15,7 @@ import { toRaw } from 'vue'; | ||
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); |