新增前端vue
This commit is contained in:
129
web-vue/packages/core/router/menus/index.ts
Normal file
129
web-vue/packages/core/router/menus/index.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
import type { Menu, MenuModule } from '@jeesite/core/router/types';
|
||||
import type { RouteRecordNormalized } from 'vue-router';
|
||||
|
||||
import { useAppStoreWithOut } from '@jeesite/core/store/modules/app';
|
||||
import { usePermissionStore } from '@jeesite/core/store/modules/permission';
|
||||
import { transformMenuModule, getAllParentPath } from '@jeesite/core/router/helper/menuHelper';
|
||||
import { filter } from '@jeesite/core/utils/helper/treeHelper';
|
||||
import { isUrl } from '@jeesite/core/utils/is';
|
||||
import { router } from '@jeesite/core/router';
|
||||
import { PermissionModeEnum } from '@jeesite/core/enums/appEnum';
|
||||
import { pathToRegexp } from 'path-to-regexp';
|
||||
|
||||
const modules = import.meta.glob('./modules/**/*.ts', { eager: true });
|
||||
|
||||
const menuModules: MenuModule[] = [];
|
||||
|
||||
Object.keys(modules).forEach((key) => {
|
||||
const mod = (modules as Recordable)[key].default || {};
|
||||
const modList = Array.isArray(mod) ? [...mod] : [mod];
|
||||
menuModules.push(...modList);
|
||||
});
|
||||
|
||||
// ===========================
|
||||
// ==========Helper===========
|
||||
// ===========================
|
||||
|
||||
const getPermissionMode = () => {
|
||||
const appStore = useAppStoreWithOut();
|
||||
return appStore.getProjectConfig.permissionMode;
|
||||
};
|
||||
const isBackMode = () => {
|
||||
return getPermissionMode() === PermissionModeEnum.BACK;
|
||||
};
|
||||
|
||||
const isRouteMappingMode = () => {
|
||||
return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;
|
||||
};
|
||||
|
||||
const isRoleMode = () => {
|
||||
return getPermissionMode() === PermissionModeEnum.ROLE;
|
||||
};
|
||||
|
||||
const staticMenus: Menu[] = [];
|
||||
(() => {
|
||||
menuModules.sort((a, b) => {
|
||||
return (a.orderNo || 0) - (b.orderNo || 0);
|
||||
});
|
||||
|
||||
for (const menu of menuModules) {
|
||||
staticMenus.push(transformMenuModule(menu));
|
||||
}
|
||||
})();
|
||||
|
||||
async function getAsyncMenus() {
|
||||
const permissionStore = usePermissionStore();
|
||||
if (isBackMode()) {
|
||||
// return permissionStore.getBackMenuList.filter((item) => !item.meta?.hideMenu && !item.hideMenu);
|
||||
return permissionStore.getBackMenuList;
|
||||
}
|
||||
if (isRouteMappingMode()) {
|
||||
// return permissionStore.getFrontMenuList.filter((item) => !item.hideMenu);
|
||||
return permissionStore.getFrontMenuList;
|
||||
}
|
||||
return staticMenus;
|
||||
}
|
||||
|
||||
export const getMenus = async (): Promise<Menu[]> => {
|
||||
const menus = await getAsyncMenus();
|
||||
if (isRoleMode()) {
|
||||
const routes = router.getRoutes();
|
||||
return filter(menus, basicFilter(routes));
|
||||
}
|
||||
return menus;
|
||||
};
|
||||
|
||||
export async function getCurrentParentPath(currentPath: string) {
|
||||
const menus = await getAsyncMenus();
|
||||
const allParentPath = await getAllParentPath(menus, currentPath);
|
||||
return allParentPath?.[0];
|
||||
}
|
||||
|
||||
// Get the level 1 menu, delete children
|
||||
export async function getShallowMenus(): Promise<Menu[]> {
|
||||
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;
|
||||
}
|
||||
|
||||
// Get the children of the menu
|
||||
export async function getChildrenMenus(parentPath: string) {
|
||||
const menus = await getMenus();
|
||||
const parent = menus.find((item) => item.path === parentPath);
|
||||
if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {
|
||||
return [] as Menu[];
|
||||
}
|
||||
// console.log(menus, parent, parentPath);
|
||||
if (isRoleMode()) {
|
||||
const routes = router.getRoutes();
|
||||
return filter(parent.children, basicFilter(routes));
|
||||
}
|
||||
return parent.children;
|
||||
}
|
||||
|
||||
function basicFilter(routes: RouteRecordNormalized[]) {
|
||||
return (menu: Menu) => {
|
||||
const matchRoute = routes.find((route) => {
|
||||
if (isUrl(menu.path)) return true;
|
||||
|
||||
if (route.meta?.carryParam) {
|
||||
return pathToRegexp(route.path).regexp.test(menu.path);
|
||||
}
|
||||
const isSame = route.path === menu.path;
|
||||
if (!isSame) return false;
|
||||
|
||||
if (route.meta?.ignoreAuth) return true;
|
||||
|
||||
return isSame || pathToRegexp(route.path).regexp.test(menu.path);
|
||||
});
|
||||
|
||||
if (!matchRoute) return false;
|
||||
menu.icon = (menu.icon || matchRoute.meta.icon) as string;
|
||||
menu.meta = matchRoute.meta;
|
||||
return true;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user