feat: routers support `ignoreRoute` option
为路由配置添加`meta`.`ignoreRoute`配置,允许在`ROUTE_MAPPING`及`BACK`模式下配置纯菜单数据
fixed:
| | |
| | | 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]; |
| | |
| | | menu.path = `${parentPath}/${menu.path}`; |
| | | } |
| | | if (menu?.children?.length) { |
| | | joinParentPath(menu.children, menu.path); |
| | | joinParentPath(menu.children, isPlainPath(menu.path) ? menu.path : parentPath); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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, |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | }; |
| | |
| | | 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); |
| | |
| | | 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); |
| | | }); |
| | |
| | | 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; |
| | |
| | | // Never show in menu |
| | | hideMenu?: boolean; |
| | | isLink?: boolean; |
| | | ignoreRoute?: boolean; |
| | | } |
| | | } |