import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' import type { AdminMenuNode } from '@/types/admin' import AdminLayout from '@/layout/AdminLayout.vue' import NotFoundPage from '@/pages/error/NotFoundPage.vue' import { useAdminSessionStore } from '@/stores/admin-session' import { APP_BASE_PATH } from '@/config/app' import { adminRouteRecords } from './routes' import { defineLazyPage } from './lazy-page' const router = createRouter({ history: createWebHistory(APP_BASE_PATH), routes: [ { path: '/', component: AdminLayout, children: [ ...adminRouteRecords.map((record) => ({ ...record, component: defineLazyPage(record.component as () => Promise<{ default: unknown }>), })), { path: ':pathMatch(.*)*', component: NotFoundPage, meta: { title: '页面不存在' } }, ] as RouteRecordRaw[], }, ], }) router.beforeEach(async (to) => { const session = useAdminSessionStore() if (!session.initialized) { try { await session.initialize() } catch { return false } } // 根路由:有可见页面时跳到首个可见页;没有任何页面时停留根路由展示无菜单空态。 if (to.path === '/') { return session.firstVisible || true } const menuKey = to.meta.menuKey if (menuKey && !session.isSuperAdmin && !hasMenu(session.menuTree, menuKey)) { // 无权限页面:回退到首个可见页面;一个都没有则回根路由空态。 return session.firstVisible || '/' } return true }) function hasMenu(nodes: AdminMenuNode[], key: string): boolean { return nodes.some((node) => node.key === key || hasMenu(node.children || [], key)) } export default router