Commit 72ac240f2858cd74cb62b7647ca89d63bb71d247

Authored by 无木
1 parent b5046f07

feat: routers support `ignoreRoute` option

为路由配置添加`meta`.`ignoreRoute`配置,允许在`ROUTE_MAPPING`及`BACK`模式下配置纯菜单数据

fixed:
src/router/helper/menuHelper.ts
... ... @@ -9,6 +9,10 @@ export function getAllParentPath<T = Recordable>(treeData: T[], path: string) {
9 9 return (menuList || []).map((item) => item.path);
10 10 }
11 11  
  12 +function isPlainPath(path: string) {
  13 + return path.indexOf(':') === -1;
  14 +}
  15 +
12 16 function joinParentPath(menus: Menu[], parentPath = '') {
13 17 for (let index = 0; index < menus.length; index++) {
14 18 const menu = menus[index];
... ... @@ -20,7 +24,7 @@ function joinParentPath(menus: Menu[], parentPath = &#39;&#39;) {
20 24 menu.path = `${parentPath}/${menu.path}`;
21 25 }
22 26 if (menu?.children?.length) {
23   - joinParentPath(menu.children, menu.path);
  27 + joinParentPath(menu.children, isPlainPath(menu.path) ? menu.path : parentPath);
24 28 }
25 29 }
26 30 }
... ...
src/router/routes/modules/demo/feat.ts
... ... @@ -241,6 +241,28 @@ const feat: AppRouteModule = {
241 241 title: t('routes.demo.feat.tab'),
242 242 carryParam: true,
243 243 },
  244 + children: [
  245 + {
  246 + path: 'testTab/id1',
  247 + name: 'TestTab1',
  248 + component: () => import('/@/views/demo/feat/tab-params/index.vue'),
  249 + meta: {
  250 + title: t('routes.demo.feat.tab1'),
  251 + carryParam: true,
  252 + ignoreRoute: true,
  253 + },
  254 + },
  255 + {
  256 + path: 'testTab/id2',
  257 + name: 'TestTab2',
  258 + component: () => import('/@/views/demo/feat/tab-params/index.vue'),
  259 + meta: {
  260 + title: t('routes.demo.feat.tab2'),
  261 + carryParam: true,
  262 + ignoreRoute: true,
  263 + },
  264 + },
  265 + ],
244 266 },
245 267 ],
246 268 };
... ...
src/store/modules/permission.ts
... ... @@ -111,6 +111,12 @@ export const usePermissionStore = defineStore({
111 111 return roleList.some((role) => roles.includes(role));
112 112 };
113 113  
  114 + const routeRmoveIgnoreFilter = (route: AppRouteRecordRaw) => {
  115 + const { meta } = route;
  116 + const { ignoreRoute } = meta || {};
  117 + return !ignoreRoute;
  118 + };
  119 +
114 120 switch (permissionMode) {
115 121 case PermissionModeEnum.ROLE:
116 122 routes = filter(asyncRoutes, routeFilter);
... ... @@ -123,6 +129,8 @@ export const usePermissionStore = defineStore({
123 129 routes = filter(asyncRoutes, routeFilter);
124 130 routes = routes.filter(routeFilter);
125 131 const menuList = transformRouteToMenu(routes, true);
  132 + routes = filter(routes, routeRmoveIgnoreFilter);
  133 + routes = routes.filter(routeRmoveIgnoreFilter);
126 134 menuList.sort((a, b) => {
127 135 return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0);
128 136 });
... ... @@ -158,6 +166,10 @@ export const usePermissionStore = defineStore({
158 166 const backMenuList = transformRouteToMenu(routeList);
159 167 this.setBackMenuList(backMenuList);
160 168  
  169 + // remove meta.ignoreRoute item
  170 + routeList = filter(routeList, routeRmoveIgnoreFilter);
  171 + routeList = routeList.filter(routeRmoveIgnoreFilter);
  172 +
161 173 routeList = flatMultiLevelRoutes(routeList);
162 174 routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
163 175 break;
... ...
types/vue-router.d.ts
... ... @@ -33,5 +33,6 @@ declare module &#39;vue-router&#39; {
33 33 // Never show in menu
34 34 hideMenu?: boolean;
35 35 isLink?: boolean;
  36 + ignoreRoute?: boolean;
36 37 }
37 38 }
... ...