提交 e2cc5af9 作者: Vben

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

上级 908116dd
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
- 修复后台权限指令不生效 - 修复后台权限指令不生效
- 确保 progress 进度条正确关闭 - 确保 progress 进度条正确关闭
- 修复表格勾选列配置失效问题 - 修复表格勾选列配置失效问题
- 确保一级菜单可以被隐藏
## 2.1.0 (2021-03-15) ## 2.1.0 (2021-03-15)
......
...@@ -79,27 +79,28 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul ...@@ -79,27 +79,28 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul
/** /**
* Convert multi-level routing to level 2 routing * Convert multi-level routing to level 2 routing
*/ */
export function flatRoutes(routeModules: AppRouteModule[]) { export function flatMultiLevelRoutes(routeModules: AppRouteModule[]) {
for (let index = 0; index < routeModules.length; index++) { const modules: AppRouteModule[] = cloneDeep(routeModules);
const routeModule = routeModules[index]; for (let index = 0; index < modules.length; index++) {
const routeModule = modules[index];
if (!isMultipleRoute(routeModule)) { if (!isMultipleRoute(routeModule)) {
continue; continue;
} }
promoteRouteLevel(routeModule); promoteRouteLevel(routeModule);
} }
return modules;
} }
// Routing level upgrade // Routing level upgrade
function promoteRouteLevel(routeModule: AppRouteModule) { function promoteRouteLevel(routeModule: AppRouteModule) {
// Use vue-router to splice menus // Use vue-router to splice menus
let router: Router | null = createRouter({ let router: Router | null = createRouter({
routes: [routeModule as any], routes: [(routeModule as unknown) as RouteRecordNormalized],
history: createWebHashHistory(), history: createWebHashHistory(),
}); });
const routes = router.getRoutes(); const routes = router.getRoutes();
const children = cloneDeep(routeModule.children); addToChildren(routes, routeModule.children || [], routeModule);
addToChildren(routes, children || [], routeModule);
router = null; router = null;
routeModule.children = routeModule.children?.filter((item) => !item.children?.length); routeModule.children = routeModule.children?.filter((item) => !item.children?.length);
...@@ -114,12 +115,15 @@ function addToChildren( ...@@ -114,12 +115,15 @@ function addToChildren(
for (let index = 0; index < children.length; index++) { for (let index = 0; index < children.length; index++) {
const child = children[index]; const child = children[index];
const route = routes.find((item) => item.name === child.name); const route = routes.find((item) => item.name === child.name);
if (route) { if (!route) {
routeModule.children = routeModule.children || []; continue;
routeModule.children?.push(route as any); }
if (child.children?.length) { routeModule.children = routeModule.children || [];
addToChildren(routes, child.children, routeModule); if (!routeModule.children.find((item) => item.name === route.name)) {
} routeModule.children?.push((route as unknown) as AppRouteModule);
}
if (child.children?.length) {
addToChildren(routes, child.children, routeModule);
} }
} }
} }
......
...@@ -45,6 +45,7 @@ async function getAsyncMenus() { ...@@ -45,6 +45,7 @@ async function getAsyncMenus() {
export const getMenus = async (): Promise<Menu[]> => { export const getMenus = async (): Promise<Menu[]> => {
const menus = await getAsyncMenus(); const menus = await getAsyncMenus();
const routes = router.getRoutes(); const routes = router.getRoutes();
return !isBackMode() ? filter(menus, basicFilter(routes)) : menus; return !isBackMode() ? filter(menus, basicFilter(routes)) : menus;
}; };
......
...@@ -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';
import { mainOutRoutes } from './mainOut'; import { mainOutRoutes } from './mainOut';
import { PageEnum } from '/@/enums/pageEnum'; import { PageEnum } from '/@/enums/pageEnum';
import { t } from '/@/hooks/web/useI18n'; import { t } from '/@/hooks/web/useI18n';
import { flatRoutes } from '/@/router/helper/routeHelper';
const modules = import.meta.globEager('./modules/**/*.ts'); const modules = import.meta.globEager('./modules/**/*.ts');
...@@ -17,9 +16,6 @@ Object.keys(modules).forEach((key) => { ...@@ -17,9 +16,6 @@ Object.keys(modules).forEach((key) => {
routeModuleList.push(...modList); routeModuleList.push(...modList);
}); });
// Multi-level routing conversion
flatRoutes(routeModuleList);
export const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList]; export const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList];
export const RootRoute: AppRouteRecordRaw = { export const RootRoute: AppRouteRecordRaw = {
......
...@@ -15,7 +15,7 @@ import { toRaw } from 'vue'; ...@@ -15,7 +15,7 @@ import { toRaw } from 'vue';
import { getMenuListById } from '/@/api/sys/menu'; import { getMenuListById } from '/@/api/sys/menu';
import { getPermCodeByUserId } from '/@/api/sys/user'; import { getPermCodeByUserId } from '/@/api/sys/user';
import { transformObjToRoute, flatRoutes } from '/@/router/helper/routeHelper'; import { transformObjToRoute, flatMultiLevelRoutes } from '/@/router/helper/routeHelper';
import { transformRouteToMenu } from '/@/router/helper/menuHelper'; import { transformRouteToMenu } from '/@/router/helper/menuHelper';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
...@@ -99,12 +99,16 @@ class Permission extends VuexModule { ...@@ -99,12 +99,16 @@ class Permission extends VuexModule {
// role permissions // role permissions
if (permissionMode === PermissionModeEnum.ROLE) { if (permissionMode === PermissionModeEnum.ROLE) {
routes = filter(asyncRoutes, (route) => { const routeFilter = (route) => {
const { meta } = route as AppRouteRecordRaw; const { meta } = route as AppRouteRecordRaw;
const { roles } = meta || {}; const { roles } = meta || {};
if (!roles) return true; if (!roles) return true;
return roleList.some((role) => roles.includes(role)); return roleList.some((role) => roles.includes(role));
}); };
routes = filter(asyncRoutes, routeFilter);
routes = routes.filter(routeFilter);
// Convert multi-level routing to level 2 routing
routes = flatMultiLevelRoutes(routes);
// If you are sure that you do not need to do background dynamic permissions, please comment the entire judgment below // If you are sure that you do not need to do background dynamic permissions, please comment the entire judgment below
} else if (permissionMode === PermissionModeEnum.BACK) { } else if (permissionMode === PermissionModeEnum.BACK) {
createMessage.loading({ createMessage.loading({
...@@ -131,7 +135,7 @@ class Permission extends VuexModule { ...@@ -131,7 +135,7 @@ class Permission extends VuexModule {
const backMenuList = transformRouteToMenu(routeList); const backMenuList = transformRouteToMenu(routeList);
this.commitBackMenuListState(backMenuList); this.commitBackMenuListState(backMenuList);
flatRoutes(routeList); routeList = flatMultiLevelRoutes(routeList);
routes = [PAGE_NOT_FOUND_ROUTE, ...routeList]; routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
} }
routes.push(ERROR_LOG_ROUTE); routes.push(ERROR_LOG_ROUTE);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论