|
@@ -2,54 +2,17 @@ import { lazy, Suspense, useMemo } from 'react'
|
|
|
import { Navigate, Outlet } from 'react-router'
|
|
|
import { useUserMenu } from '@/store/userStore'
|
|
|
import type { AppRouteObject } from '#/router'
|
|
|
-import type { Permission } from '#/entity'
|
|
|
-import { BasicStatus, MenuType, PermissionType } from '#/enum'
|
|
|
+import { PermissionType } from '#/enum'
|
|
|
import { isEmpty } from 'ramda'
|
|
|
import { clone } from 'ramda'
|
|
|
-import { flattenTrees } from '@/utils/tree'
|
|
|
import { Tag } from 'antd'
|
|
|
import { Iconify } from '@/components/icon'
|
|
|
import { CircleLoading } from '@/components/loading'
|
|
|
-import { getRoutesFromModules } from '../utils'
|
|
|
|
|
|
const ENTRY_PATH = '/src/pages'
|
|
|
const PAGES = import.meta.glob('/src/pages/**/*.tsx')
|
|
|
-// console.log(PAGES)
|
|
|
export const loadComponentFromPath = (path: string) => PAGES[`${ENTRY_PATH}${path}.tsx`]
|
|
|
|
|
|
-/**
|
|
|
- * Build complete route path by traversing from current permission to root
|
|
|
- * @param {Permission} permission - current permission
|
|
|
- * @param {Permission[]} flattenedPermissions - flattened permission array
|
|
|
- * @param {string[]} segments - route segments accumulator
|
|
|
- * @returns {string} normalized complete route path
|
|
|
- */
|
|
|
-function buildCompleteRoute(
|
|
|
- permission: Permission,
|
|
|
- flattenedPermissions: Permission[],
|
|
|
- segments: string[] = []
|
|
|
-): string {
|
|
|
- // debugger
|
|
|
- // Add current route segment
|
|
|
- segments.unshift(permission.path)
|
|
|
-
|
|
|
- // Base case: reached root permission
|
|
|
- if (permission.parentId === '-1') {
|
|
|
- // debugger
|
|
|
- return segments.join('')
|
|
|
- }
|
|
|
-
|
|
|
- // Find parent and continue recursion
|
|
|
- const parent = flattenedPermissions.find((p) => p.id === permission.parentId)
|
|
|
- if (!parent) {
|
|
|
- debugger
|
|
|
- console.warn(`Parent permission not found for ID: ${permission.parentId}`)
|
|
|
- return `/${segments.join('/')}`
|
|
|
- }
|
|
|
-
|
|
|
- return buildCompleteRoute(parent, flattenedPermissions, segments)
|
|
|
-}
|
|
|
-
|
|
|
// Components
|
|
|
function NewFeatureTag() {
|
|
|
return (
|
|
@@ -87,15 +50,8 @@ const createBaseRoute = (menuItem: API.MenuChildrenItem, completeRoute: string):
|
|
|
return baseRoute
|
|
|
}
|
|
|
|
|
|
-const createCatalogueRoute = (
|
|
|
- menuItem: API.MenuChildrenItem,
|
|
|
- flattenedPermissions: API.MenuChildrenItem[]
|
|
|
-): AppRouteObject => {
|
|
|
- // 1.创建基础路由
|
|
|
- // console.log(buildCompleteRoute(permission, flattenedPermissions))
|
|
|
- // console.log('0000', menuItem.path)
|
|
|
+const createCatalogueRoute = (menuItem: API.MenuChildrenItem): AppRouteObject => {
|
|
|
const baseRoute = createBaseRoute(menuItem, menuItem.path)
|
|
|
- // console.log(baseRoute)
|
|
|
if (baseRoute.meta) {
|
|
|
baseRoute.meta.hideTab = true
|
|
|
}
|
|
@@ -109,7 +65,7 @@ const createCatalogueRoute = (
|
|
|
)
|
|
|
}
|
|
|
|
|
|
- baseRoute.children = transformMenuToRoutes(children, flattenedPermissions)
|
|
|
+ baseRoute.children = transformMenuToRoutes(children)
|
|
|
|
|
|
if (!isEmpty(children)) {
|
|
|
baseRoute.children.unshift({
|
|
@@ -121,11 +77,7 @@ const createCatalogueRoute = (
|
|
|
return baseRoute
|
|
|
}
|
|
|
|
|
|
-const createMenuRoute = (
|
|
|
- menuItem: API.MenuChildrenItem,
|
|
|
- flattenedPermissions: API.MenuChildrenItem[]
|
|
|
-): AppRouteObject => {
|
|
|
- // console.log('1111', menuItem.path)
|
|
|
+const createMenuRoute = (menuItem: API.MenuChildrenItem): AppRouteObject => {
|
|
|
const baseRoute = createBaseRoute(menuItem, menuItem.path)
|
|
|
if (menuItem.path) {
|
|
|
const Element = lazy(loadComponentFromPath(menuItem.path) as any)
|
|
@@ -144,17 +96,14 @@ const createMenuRoute = (
|
|
|
return baseRoute
|
|
|
}
|
|
|
|
|
|
-function transformMenuToRoutes(
|
|
|
- menu: API.MenuChildrenItem[],
|
|
|
- flattenedPermissions: API.MenuChildrenItem[]
|
|
|
-): AppRouteObject[] {
|
|
|
+function transformMenuToRoutes(menu: API.MenuChildrenItem[]): AppRouteObject[] {
|
|
|
return menu.map((menuItem) => {
|
|
|
// 创建目录路由
|
|
|
if (menuItem.type === PermissionType.CATALOGUE) {
|
|
|
- return createCatalogueRoute(menuItem, flattenedPermissions)
|
|
|
+ return createCatalogueRoute(menuItem)
|
|
|
}
|
|
|
// 创建菜单路由
|
|
|
- return createMenuRoute(menuItem, flattenedPermissions)
|
|
|
+ return createMenuRoute(menuItem)
|
|
|
})
|
|
|
}
|
|
|
|
|
@@ -168,21 +117,40 @@ const addTypeToMenu = (menu: API.MenuResult) => {
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+// 导出一个函数usePermissionRoutes
|
|
|
export function usePermissionRoutes() {
|
|
|
const menu = useUserMenu()
|
|
|
|
|
|
return useMemo(() => {
|
|
|
if (!menu) return []
|
|
|
|
|
|
+ // 克隆menu
|
|
|
const menuCopy = clone(menu)
|
|
|
// 给menu的每一级添加type, type为0, 即为目录, type为1, 即为菜单, 只有最后一级才是菜单
|
|
|
addTypeToMenu(menuCopy)
|
|
|
console.log('添加type后的菜单', menuCopy)
|
|
|
-
|
|
|
- const flattenedMenu = flattenTrees(menuCopy) // 拍平成功
|
|
|
-
|
|
|
- console.log('~~~~~~', transformMenuToRoutes(menuCopy, flattenedMenu))
|
|
|
- // 将菜单转换成路由
|
|
|
- return transformMenuToRoutes(menuCopy, flattenedMenu)
|
|
|
+ const constantMenu: API.MenuResult = [
|
|
|
+ {
|
|
|
+ id: 'dashboard',
|
|
|
+ parentId: '-1',
|
|
|
+ weight: 0,
|
|
|
+ name: '首页',
|
|
|
+ path: '/dashboard/index',
|
|
|
+ visible: true,
|
|
|
+ isKeepAlive: false,
|
|
|
+ sortOrder: 1,
|
|
|
+ icon: 'fengxiankongzhi1',
|
|
|
+ menuType: 'MENU',
|
|
|
+ label: '',
|
|
|
+ type: 1,
|
|
|
+ title: '首页',
|
|
|
+ isHide: false
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ menuCopy.unshift(...constantMenu)
|
|
|
+
|
|
|
+ console.log('动态路由:', transformMenuToRoutes(menuCopy))
|
|
|
+ return transformMenuToRoutes(menuCopy)
|
|
|
}, [menu])
|
|
|
}
|