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

107 lines
3.2 KiB
TypeScript
Raw Normal View History

2020-10-16 22:03:44 +08:00
import type { Menu, MenuModule } from '/@/router/types';
2020-09-28 20:19:10 +08:00
import type { RouteRecordNormalized } from 'vue-router';
import { appStore } from '/@/store/modules/app';
import { permissionStore } from '/@/store/modules/permission';
2020-12-03 21:49:32 +08:00
import { transformMenuModule, flatMenus, getAllParentPath } from '/@/router/helper/menuHelper';
2020-09-28 20:19:10 +08:00
import { filter } from '/@/utils/helper/treeHelper';
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
2020-10-16 22:03:44 +08:00
import modules from 'globby!/@/router/menus/modules/**/*.@(ts)';
2020-09-28 20:19:10 +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) => {
2020-11-28 14:27:26 +08:00
const moduleItem = modules[key];
const menuModule = Array.isArray(moduleItem) ? [...moduleItem] : [moduleItem];
menuModules.push(...menuModule);
2020-10-16 22:03:44 +08:00
});
2020-09-28 20:19:10 +08:00
// ===========================
// ==========Helper===========
// ===========================
2020-12-07 21:17:24 +08:00
const isBackMode = () => {
return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK;
};
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() {
// 前端角色控制菜单 直接取菜单文件
if (!isBackMode()) {
return staticMenus;
}
return permissionStore.getBackMenuListState;
}
// 获取深层扁平化菜单
export const getFlatMenus = async () => {
const menus = await getAsyncMenus();
return flatMenus(menus);
};
// 获取菜单 树级
export const getMenus = async () => {
const menus = await getAsyncMenus();
const routes = router.getRoutes();
return !isBackMode() ? filter(menus, basicFilter(routes)) : menus;
};
// 获取当前路径的顶级路径
export async function getCurrentParentPath(currentPath: string) {
const menus = await getAsyncMenus();
const allParentPath = await getAllParentPath(menus, currentPath);
return allParentPath[0];
}
// 获取1级菜单删除children
export async function getShallowMenus() {
const menus = await getAsyncMenus();
const routes = router.getRoutes();
const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));
return !isBackMode() ? shallowMenuList.filter(basicFilter(routes)) : shallowMenuList;
}
// 获取菜单的children
export async function getChildrenMenus(parentPath: string) {
const menus = await getAsyncMenus();
const parent = menus.find((item) => item.path === parentPath);
if (!parent) return [] as Menu[];
return parent.children;
}
// 扁平化children
export async function getFlatChildrenMenus(children: Menu[]) {
return flatMenus(children);
}
// 通用过滤方法
function basicFilter(routes: RouteRecordNormalized[]) {
return (menu: Menu) => {
2020-10-14 22:08:56 +08:00
const matchRoute = routes.find((route) => {
if (route.meta) {
if (route.meta.carryParam) {
return pathToRegexp(route.path).test(menu.path);
}
2020-11-12 22:20:15 +08:00
if (route.meta.ignoreAuth) return false;
2020-10-14 22:08:56 +08:00
}
return route.path === menu.path;
});
if (!matchRoute) return false;
2020-09-28 20:19:10 +08:00
menu.icon = menu.icon || matchRoute.meta.icon;
menu.meta = matchRoute.meta;
return true;
};
}