full-routes.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /**
  2. * 1. 前端维护的完整路由表, 用于创建"菜单"
  3. * 2. component 是 string,并不是 组件对象。
  4. * 3. 生成菜单,关注的 path,name,component,icon。
  5. * 4. 部分路由组件是菜单不可见的,当访问该路由时,左侧菜单的menu item会失去active状态。需要设置 meta.activeMenu 保持选中状态。
  6. */
  7. import { AppRouteRecordRaw } from './types';
  8. import { getTreeItem } from '@/utils';
  9. import { cloneDeep } from 'lodash-es';
  10. import { PageEnum } from '@/enums/pageEnum';
  11. import {
  12. disasterPreventionRoute,
  13. emergencyManagementRoute,
  14. platformRoutes,
  15. largeScreenRoutes,
  16. trafficRoutes,
  17. } from './routers';
  18. type RouteRecordString = Omit<AppRouteRecordRaw, 'component'> & { component?: string };
  19. export const RootRoute: RouteRecordString = {
  20. path: '/',
  21. name: 'Root',
  22. redirect: PageEnum.BASE_HOME,
  23. meta: {
  24. title: 'Root',
  25. },
  26. };
  27. export const HOME_PAGE: RouteRecordString = {
  28. // 模板管理
  29. path: '/home',
  30. name: 'HomePage',
  31. component: '/home/PageHome',
  32. meta: {
  33. icon: '',
  34. title: '首页',
  35. },
  36. };
  37. export const fullRoutes: AppRouteRecordRaw[] = [
  38. disasterPreventionRoute,
  39. emergencyManagementRoute,
  40. platformRoutes,
  41. largeScreenRoutes,
  42. trafficRoutes,
  43. ] as const;
  44. /**
  45. * 类型定义。避免与已有的定义冲突,避免与 vue-router的类型定义冲突,前面加 _ 前缀
  46. */
  47. export interface _RouteViewItem {
  48. label: string;
  49. value: string;
  50. }
  51. export type _RouteView = _RouteViewItem & { children?: _RouteViewItem[] | null };
  52. export type _RouteViewTree = _RouteView[];
  53. /**
  54. * 获取指定 父路由 下的子路由。
  55. * 若 父级路由 未指定,则返回一级路由
  56. */
  57. export function getChildRoutesView(parentRouteName?: string | null): _RouteViewItem[] {
  58. // 未指定 parentRouteName, 则返回 level1 的路由
  59. if (parentRouteName == null) {
  60. return fullRoutes.map((route) => ({
  61. label: route.meta.title as string,
  62. value: route.name,
  63. }));
  64. }
  65. // 获取指定父路由的子路由
  66. const parentRoute: AppRouteRecordRaw = cloneDeep(getTreeItem(fullRoutes, parentRouteName, 'name'));
  67. if (parentRoute.children && parentRoute.children.length > 0) {
  68. return parentRoute.children.map((route) => ({
  69. label: route.meta.title as string,
  70. value: route.name,
  71. }));
  72. } else {
  73. return [];
  74. }
  75. }
  76. /**
  77. * 获取指定的 路由信息
  78. */
  79. export function getRouteByName(routeName: string) {
  80. return cloneDeep(getTreeItem(fullRoutes, routeName, 'name')) as AppRouteRecordRaw;
  81. }
  82. /**
  83. * 转换成 el-tree-select 的数据结构形式
  84. */
  85. export function transformToRouteViewTree(routes?: AppRouteRecordRaw[] | null) {
  86. const tree: _RouteViewTree = [];
  87. if (routes == null) return tree;
  88. for (const route of routes) {
  89. const treeItem: _RouteView = {
  90. value: route.name,
  91. label: route.meta.title as string,
  92. children: null,
  93. };
  94. if (route.children && route.children.length > 0) {
  95. treeItem.children = transformToRouteViewTree(route.children);
  96. tree.push(treeItem);
  97. } else {
  98. tree.push(treeItem);
  99. }
  100. }
  101. return tree;
  102. }
  103. export const routeViewTree = transformToRouteViewTree(fullRoutes);