2025-07-21 11:16:16 +08:00
|
|
|
import { asyncRoutes } from '@/router/routes/asyncRoutes'
|
|
|
|
|
import { menuDataToRouter } from '@/router/utils/menuToRouter'
|
|
|
|
|
import { AppRouteRecord } from '@/types/router'
|
|
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
|
|
interface MenuResponse {
|
|
|
|
|
menuList: AppRouteRecord[]
|
|
|
|
|
}
|
2025-07-21 11:44:09 +08:00
|
|
|
// 合并方法
|
|
|
|
|
function mergeRoutes(dynamicRoutes: AppRouteRecord[] = [], staticRoutes: AppRouteRecord[] = []): AppRouteRecord[] {
|
|
|
|
|
// 深度合并逻辑
|
|
|
|
|
const merged = [...staticRoutes]
|
|
|
|
|
|
|
|
|
|
dynamicRoutes.forEach(dynamicRoute => {
|
|
|
|
|
const existingIndex = merged.findIndex(r => r.path === dynamicRoute.path)
|
|
|
|
|
if (existingIndex >= 0) {
|
|
|
|
|
// 合并children(如果存在)
|
|
|
|
|
if (dynamicRoute.children) {
|
|
|
|
|
merged[existingIndex].children = [
|
|
|
|
|
...(merged[existingIndex].children || []),
|
|
|
|
|
...dynamicRoute.children
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
merged.push(dynamicRoute)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return merged
|
|
|
|
|
}
|
2025-07-21 11:16:16 +08:00
|
|
|
// 菜单接口
|
|
|
|
|
export const menuService = {
|
|
|
|
|
async getMenuList(delay = 300): Promise<MenuResponse> {
|
|
|
|
|
try {
|
|
|
|
|
const userStore = useUserStore()
|
|
|
|
|
// 验证用户登录状态
|
|
|
|
|
if (!userStore.isLogin) {
|
|
|
|
|
throw new Error('用户未登录')
|
|
|
|
|
}
|
|
|
|
|
// 模拟接口返回的菜单数据
|
|
|
|
|
const menuData = userStore.info.menu
|
2025-07-21 11:44:09 +08:00
|
|
|
// 2. 合并静态菜单
|
|
|
|
|
const finalRoutes = mergeRoutes(menuData, asyncRoutes)
|
2025-07-21 11:16:16 +08:00
|
|
|
// 验证菜单数据
|
|
|
|
|
if (!menuData || !Array.isArray(menuData) || menuData.length === 0) {
|
|
|
|
|
ElMessage.error('暂无系统菜单权限')
|
|
|
|
|
return { menuList: [] }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 处理菜单数据
|
2025-07-21 11:44:09 +08:00
|
|
|
const menuList = finalRoutes.map((route: any) => menuDataToRouter(route))
|
2025-07-21 11:16:16 +08:00
|
|
|
|
|
|
|
|
// 验证处理后的菜单列表
|
|
|
|
|
if (!menuList || menuList.length === 0) {
|
|
|
|
|
ElMessage.error('菜单数据处理失败')
|
|
|
|
|
return { menuList: [] }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模拟接口延迟
|
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, delay))
|
|
|
|
|
|
|
|
|
|
return { menuList }
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('获取菜单失败:', error)
|
|
|
|
|
throw error instanceof Error ? error : new Error('获取菜单失败')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|