vue-vben-admin/src/router/menus/index.ts

137 lines
3.9 KiB
TypeScript
Raw Normal View History

import type { Menu, MenuModule } from '@/router/types';
2020-09-28 20:19:10 +08:00
import type { RouteRecordNormalized } from 'vue-router';
2020-12-15 14:59:22 +08:00
import { useAppStoreWithOut } from '@/store/modules/app';
import { usePermissionStore } from '@/store/modules/permission';
import { transformMenuModule, getAllParentPath } from '@/router/helper/menuHelper';
import { filter } from '@/utils/helper/treeHelper';
import { isHttpUrl } from '@/utils/is';
import { router } from '@/router';
import { PermissionModeEnum } from '@/enums/appEnum';
2020-10-14 22:08:56 +08:00
import { pathToRegexp } from 'path-to-regexp';
2020-11-23 23:24:13 +08:00
const modules = import.meta.glob('./modules/**/*.ts', { eager: true });
2020-12-15 14:59:22 +08:00
2020-10-30 21:32:05 +08:00
const menuModules: MenuModule[] = [];
2020-09-28 20:19:10 +08:00
2020-10-16 22:03:44 +08:00
Object.keys(modules).forEach((key) => {
const mod = (modules as Recordable)[key].default || {};
2021-01-09 23:28:52 +08:00
const modList = Array.isArray(mod) ? [...mod] : [mod];
menuModules.push(...modList);
2020-10-16 22:03:44 +08:00
});
2020-09-28 20:19:10 +08:00
// ===========================
// ==========Helper===========
// ===========================
const getPermissionMode = () => {
const appStore = useAppStoreWithOut();
return appStore.getProjectConfig.permissionMode;
};
2020-12-07 21:17:24 +08:00
const isBackMode = () => {
return getPermissionMode() === PermissionModeEnum.BACK;
};
const isRouteMappingMode = () => {
return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;
};
const isRoleMode = () => {
return getPermissionMode() === PermissionModeEnum.ROLE;
2020-12-07 21:17:24 +08:00
};
2020-09-28 20:19:10 +08:00
const staticMenus: Menu[] = [];
(() => {
menuModules.sort((a, b) => {
return (a.orderNo || 0) - (b.orderNo || 0);
});
2020-11-28 14:27:26 +08:00
2020-09-28 20:19:10 +08:00
for (const menu of menuModules) {
staticMenus.push(transformMenuModule(menu));
}
})();
async function getAsyncMenus() {
2021-04-10 19:25:49 +08:00
const permissionStore = usePermissionStore();
//递归过滤所有隐藏的菜单
const menuFilter = (items) => {
return items.filter((item) => {
const show = !item.meta?.hideMenu && !item.hideMenu;
if (show && item.children) {
item.children = menuFilter(item.children);
}
return show;
});
};
if (isBackMode()) {
return menuFilter(permissionStore.getBackMenuList);
}
if (isRouteMappingMode()) {
return menuFilter(permissionStore.getFrontMenuList);
}
return staticMenus;
2020-09-28 20:19:10 +08:00
}
2020-12-10 23:58:11 +08:00
export const getMenus = async (): Promise<Menu[]> => {
2020-09-28 20:19:10 +08:00
const menus = await getAsyncMenus();
if (isRoleMode()) {
const routes = router.getRoutes();
return filter(menus, basicFilter(routes));
}
return menus;
2020-09-28 20:19:10 +08:00
};
export async function getCurrentParentPath(currentPath: string) {
const menus = await getAsyncMenus();
const allParentPath = await getAllParentPath(menus, currentPath);
2020-12-15 14:59:22 +08:00
return allParentPath?.[0];
2020-09-28 20:19:10 +08:00
}
// Get the level 1 menu, delete children
2020-12-10 23:58:11 +08:00
export async function getShallowMenus(): Promise<Menu[]> {
2020-09-28 20:19:10 +08:00
const menus = await getAsyncMenus();
const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));
if (isRoleMode()) {
const routes = router.getRoutes();
return shallowMenuList.filter(basicFilter(routes));
}
return shallowMenuList;
2020-09-28 20:19:10 +08:00
}
// Get the children of the menu
2020-09-28 20:19:10 +08:00
export async function getChildrenMenus(parentPath: string) {
const menus = await getMenus();
2020-09-28 20:19:10 +08:00
const parent = menus.find((item) => item.path === parentPath);
if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {
return [] as Menu[];
}
if (isRoleMode()) {
const routes = router.getRoutes();
return filter(parent.children, basicFilter(routes));
}
return parent.children;
2020-09-28 20:19:10 +08:00
}
function basicFilter(routes: RouteRecordNormalized[]) {
return (menu: Menu) => {
2020-10-14 22:08:56 +08:00
const matchRoute = routes.find((route) => {
2023-11-07 10:31:32 +08:00
if (isHttpUrl(menu.path)) return true;
2020-12-07 23:56:57 +08:00
2020-12-15 14:59:22 +08:00
if (route.meta?.carryParam) {
return pathToRegexp(route.path).test(menu.path);
2020-10-14 22:08:56 +08:00
}
2020-12-15 14:59:22 +08:00
const isSame = route.path === menu.path;
if (!isSame) return false;
if (route.meta?.ignoreAuth) return true;
2020-12-07 23:56:57 +08:00
2020-12-15 14:59:22 +08:00
return isSame || pathToRegexp(route.path).test(menu.path);
2020-10-14 22:08:56 +08:00
});
if (!matchRoute) return false;
2021-02-28 23:05:37 +08:00
menu.icon = (menu.icon || matchRoute.meta.icon) as string;
2020-09-28 20:19:10 +08:00
menu.meta = matchRoute.meta;
return true;
};
}