index.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import type { Menu, MenuModule } from '@/router/types';
  2. import type { RouteRecordNormalized } from 'vue-router';
  3. import { useAppStoreWithOut } from '@/store/modules/app';
  4. import { usePermissionStore } from '@/store/modules/permission';
  5. import { transformMenuModule, getAllParentPath } from '@/router/helper/menuHelper';
  6. import { filter } from '@/utils/helper/treeHelper';
  7. import { isHttpUrl } from '@/utils/is';
  8. import { router } from '@/router';
  9. import { PermissionModeEnum } from '@/enums/appEnum';
  10. import { pathToRegexp } from 'path-to-regexp';
  11. const modules = import.meta.globEager('./vent/**/*.ts');
  12. const menuModules: MenuModule[] = [];
  13. Object.keys(modules).forEach((key) => {
  14. const mod = (modules as Recordable)[key].default || {};
  15. const modList = Array.isArray(mod) ? [...mod] : [mod];
  16. menuModules.push(...modList);
  17. });
  18. // const menuModules: MenuModule[] = [];
  19. // ===========================
  20. // ==========Helper===========
  21. // ===========================
  22. const getPermissionMode = () => {
  23. const appStore = useAppStoreWithOut();
  24. return appStore.getProjectConfig.permissionMode;
  25. };
  26. const isBackMode = () => {
  27. return getPermissionMode() === PermissionModeEnum.BACK;
  28. };
  29. const isRouteMappingMode = () => {
  30. return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;
  31. };
  32. const isRoleMode = () => {
  33. return getPermissionMode() === PermissionModeEnum.ROLE;
  34. };
  35. const staticMenus: Menu[] = [];
  36. (() => {
  37. menuModules.sort((a, b) => {
  38. return (a.orderNo || 0) - (b.orderNo || 0);
  39. });
  40. for (const menu of menuModules) {
  41. staticMenus.push(transformMenuModule(menu));
  42. }
  43. })();
  44. async function getAsyncMenus() {
  45. const permissionStore = usePermissionStore();
  46. //递归过滤所有隐藏的菜单
  47. const menuFilter = (items) => {
  48. return items.filter((item) => {
  49. const show = !item.meta?.hideMenu && !item.hideMenu;
  50. if (show && item.children) {
  51. item.children = menuFilter(item.children);
  52. }
  53. return show;
  54. });
  55. };
  56. if (isBackMode()) {
  57. return menuFilter(permissionStore.getBackMenuList);
  58. }
  59. if (isRouteMappingMode()) {
  60. return menuFilter(permissionStore.getFrontMenuList);
  61. }
  62. return staticMenus;
  63. }
  64. export const getMenus = async (): Promise<Menu[]> => {
  65. const menus = await getAsyncMenus();
  66. if (isRoleMode()) {
  67. const routes = router.getRoutes();
  68. return filter(menus, basicFilter(routes));
  69. }
  70. return menus;
  71. };
  72. export async function getCurrentParentPath(currentPath: string) {
  73. const menus = await getAsyncMenus();
  74. const allParentPath = await getAllParentPath(menus, currentPath);
  75. return allParentPath?.[0];
  76. }
  77. // Get the level 1 menu, delete children
  78. export async function getShallowMenus(): Promise<Menu[]> {
  79. const menus = await getAsyncMenus();
  80. const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));
  81. if (isRoleMode()) {
  82. const routes = router.getRoutes();
  83. return shallowMenuList.filter(basicFilter(routes));
  84. }
  85. return shallowMenuList;
  86. }
  87. // Get the children of the menu
  88. export async function getChildrenMenus(parentPath: string) {
  89. const menus = await getMenus();
  90. const parent = menus.find((item) => item.path === parentPath);
  91. if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {
  92. return [] as Menu[];
  93. }
  94. if (isRoleMode()) {
  95. const routes = router.getRoutes();
  96. return filter(parent.children, basicFilter(routes));
  97. }
  98. return parent.children;
  99. }
  100. function basicFilter(routes: RouteRecordNormalized[]) {
  101. return (menu: Menu) => {
  102. const matchRoute = routes.find((route) => {
  103. if (isHttpUrl(menu.path)) return true;
  104. if (route.meta?.carryParam) {
  105. return pathToRegexp(route.path).test(menu.path);
  106. }
  107. const isSame = route.path === menu.path;
  108. if (!isSame) return false;
  109. if (route.meta?.ignoreAuth) return true;
  110. return isSame || pathToRegexp(route.path).test(menu.path);
  111. });
  112. if (!matchRoute) return false;
  113. menu.icon = (menu.icon || matchRoute.meta.icon) as string;
  114. menu.meta = matchRoute.meta;
  115. return true;
  116. };
  117. }