index.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 { isUrl } 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.glob('./modules/**/*.ts', { eager: true });
  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. // ===========================
  19. // ==========Helper===========
  20. // ===========================
  21. const getPermissionMode = () => {
  22. const appStore = useAppStoreWithOut();
  23. return appStore.getProjectConfig.permissionMode;
  24. };
  25. const isBackMode = () => {
  26. return getPermissionMode() === PermissionModeEnum.BACK;
  27. };
  28. const isRouteMappingMode = () => {
  29. return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;
  30. };
  31. const isRoleMode = () => {
  32. return getPermissionMode() === PermissionModeEnum.ROLE;
  33. };
  34. const staticMenus: Menu[] = [];
  35. (() => {
  36. menuModules.sort((a, b) => {
  37. return (a.orderNo || 0) - (b.orderNo || 0);
  38. });
  39. for (const menu of menuModules) {
  40. staticMenus.push(transformMenuModule(menu));
  41. }
  42. })();
  43. async function getAsyncMenus() {
  44. const permissionStore = usePermissionStore();
  45. if (isBackMode()) {
  46. return permissionStore.getBackMenuList.filter((item) => !item.meta?.hideMenu && !item.hideMenu);
  47. }
  48. if (isRouteMappingMode()) {
  49. return permissionStore.getFrontMenuList.filter((item) => !item.hideMenu);
  50. }
  51. return staticMenus;
  52. }
  53. export const getMenus = async (): Promise<Menu[]> => {
  54. const menus = await getAsyncMenus();
  55. if (isRoleMode()) {
  56. const routes = router.getRoutes();
  57. return filter(menus, basicFilter(routes));
  58. }
  59. return menus;
  60. };
  61. export async function getCurrentParentPath(currentPath: string) {
  62. const menus = await getAsyncMenus();
  63. const allParentPath = await getAllParentPath(menus, currentPath);
  64. return allParentPath?.[0];
  65. }
  66. // Get the level 1 menu, delete children
  67. export async function getShallowMenus(): Promise<Menu[]> {
  68. const menus = await getAsyncMenus();
  69. const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));
  70. if (isRoleMode()) {
  71. const routes = router.getRoutes();
  72. return shallowMenuList.filter(basicFilter(routes));
  73. }
  74. return shallowMenuList;
  75. }
  76. // Get the children of the menu
  77. export async function getChildrenMenus(parentPath: string) {
  78. const menus = await getMenus();
  79. const parent = menus.find((item) => item.path === parentPath);
  80. if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {
  81. return [] as Menu[];
  82. }
  83. if (isRoleMode()) {
  84. const routes = router.getRoutes();
  85. return filter(parent.children, basicFilter(routes));
  86. }
  87. return parent.children;
  88. }
  89. function basicFilter(routes: RouteRecordNormalized[]) {
  90. return (menu: Menu) => {
  91. const matchRoute = routes.find((route) => {
  92. if (isUrl(menu.path)) return true;
  93. if (route.meta?.carryParam) {
  94. return pathToRegexp(route.path).test(menu.path);
  95. }
  96. const isSame = route.path === menu.path;
  97. if (!isSame) return false;
  98. if (route.meta?.ignoreAuth) return true;
  99. return isSame || pathToRegexp(route.path).test(menu.path);
  100. });
  101. if (!matchRoute) return false;
  102. menu.icon = (menu.icon || matchRoute.meta.icon) as string;
  103. menu.meta = matchRoute.meta;
  104. return true;
  105. };
  106. }