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 | 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 '/@/router/routes/basic'; |
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) => { |
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 'vue'; |
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); | ... | ... |