对比新文件 |
| | |
| | | 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 |
| | | } |
| | | } |