From 72ac240f2858cd74cb62b7647ca89d63bb71d247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A0=E6=9C=A8?= Date: Thu, 1 Jul 2021 23:54:10 +0800 Subject: [PATCH] feat: routers support `ignoreRoute` option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为路由配置添加`meta`.`ignoreRoute`配置,允许在`ROUTE_MAPPING`及`BACK`模式下配置纯菜单数据 fixed: --- src/router/helper/menuHelper.ts | 6 +++++- src/router/routes/modules/demo/feat.ts | 22 ++++++++++++++++++++++ src/store/modules/permission.ts | 12 ++++++++++++ types/vue-router.d.ts | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/router/helper/menuHelper.ts b/src/router/helper/menuHelper.ts index f88cfe61ddb..84251484114 100644 --- a/src/router/helper/menuHelper.ts +++ b/src/router/helper/menuHelper.ts @@ -9,6 +9,10 @@ export function getAllParentPath(treeData: T[], path: string) { return (menuList || []).map((item) => item.path); } +function isPlainPath(path: string) { + return path.indexOf(':') === -1; +} + function joinParentPath(menus: Menu[], parentPath = '') { for (let index = 0; index < menus.length; index++) { const menu = menus[index]; @@ -20,7 +24,7 @@ function joinParentPath(menus: Menu[], parentPath = '') { menu.path = `${parentPath}/${menu.path}`; } if (menu?.children?.length) { - joinParentPath(menu.children, menu.path); + joinParentPath(menu.children, isPlainPath(menu.path) ? menu.path : parentPath); } } } diff --git a/src/router/routes/modules/demo/feat.ts b/src/router/routes/modules/demo/feat.ts index 48438a24893..c3291b194b6 100644 --- a/src/router/routes/modules/demo/feat.ts +++ b/src/router/routes/modules/demo/feat.ts @@ -241,6 +241,28 @@ const feat: AppRouteModule = { title: t('routes.demo.feat.tab'), carryParam: true, }, + children: [ + { + path: 'testTab/id1', + name: 'TestTab1', + component: () => import('/@/views/demo/feat/tab-params/index.vue'), + meta: { + title: t('routes.demo.feat.tab1'), + carryParam: true, + ignoreRoute: true, + }, + }, + { + path: 'testTab/id2', + name: 'TestTab2', + component: () => import('/@/views/demo/feat/tab-params/index.vue'), + meta: { + title: t('routes.demo.feat.tab2'), + carryParam: true, + ignoreRoute: true, + }, + }, + ], }, ], }; diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index f9a220b4874..f08b9f99433 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -111,6 +111,12 @@ export const usePermissionStore = defineStore({ return roleList.some((role) => roles.includes(role)); }; + const routeRmoveIgnoreFilter = (route: AppRouteRecordRaw) => { + const { meta } = route; + const { ignoreRoute } = meta || {}; + return !ignoreRoute; + }; + switch (permissionMode) { case PermissionModeEnum.ROLE: routes = filter(asyncRoutes, routeFilter); @@ -123,6 +129,8 @@ export const usePermissionStore = defineStore({ routes = filter(asyncRoutes, routeFilter); routes = routes.filter(routeFilter); const menuList = transformRouteToMenu(routes, true); + routes = filter(routes, routeRmoveIgnoreFilter); + routes = routes.filter(routeRmoveIgnoreFilter); menuList.sort((a, b) => { return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0); }); @@ -158,6 +166,10 @@ export const usePermissionStore = defineStore({ const backMenuList = transformRouteToMenu(routeList); this.setBackMenuList(backMenuList); + // remove meta.ignoreRoute item + routeList = filter(routeList, routeRmoveIgnoreFilter); + routeList = routeList.filter(routeRmoveIgnoreFilter); + routeList = flatMultiLevelRoutes(routeList); routes = [PAGE_NOT_FOUND_ROUTE, ...routeList]; break; diff --git a/types/vue-router.d.ts b/types/vue-router.d.ts index 525679c27a7..2b32346a84b 100644 --- a/types/vue-router.d.ts +++ b/types/vue-router.d.ts @@ -33,5 +33,6 @@ declare module 'vue-router' { // Never show in menu hideMenu?: boolean; isLink?: boolean; + ignoreRoute?: boolean; } }