From fa3ac93010bea3805438ee3ab0a182bfbf7423da Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期一, 27 五月 2024 16:19:31 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/router/menus/index.ts | 126 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 126 insertions(+), 0 deletions(-) diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts new file mode 100644 index 0000000..6dcb0b0 --- /dev/null +++ b/src/router/menus/index.ts @@ -0,0 +1,126 @@ +import type { RouteRecordNormalized } from 'vue-router' +import type { Menu, MenuModule } from '/@/router/types' + +import { pathToRegexp } from 'path-to-regexp' +import { PermissionModeEnum } from '/@/enums/appEnum' +import { router } from '/@/router' +import { getAllParentPath, transformMenuModule } from '/@/router/helper/menuHelper' +import { useAppStoreWithOut } from '/@/store/modules/app' +import { usePermissionStore } from '/@/store/modules/permission' +import { filter } from '/@/utils/helper/treeHelper' +import { isUrl } from '/@/utils/is' + +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) + } + if (isRouteMappingMode()) { + return permissionStore.getFrontMenuList.filter((item) => !item.hideMenu) + } + 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[] + } + 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).test(menu.path) + } + const isSame = route.path === menu.path + if (!isSame) return false + + if (route.meta?.ignoreAuth) return true + + return isSame || pathToRegexp(route.path).test(menu.path) + }) + + if (!matchRoute) return false + menu.icon = (menu.icon || matchRoute.meta.icon) as string + menu.meta = matchRoute.meta + return true + } +} -- Gitblit v1.9.3