import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router' import { setupRouterGuard } from './guard' import { basicRoutes, EMPTY_ROUTE, NOT_FOUND_ROUTE } from './routes' import { getToken, isNullOrWhitespace } from '@/utils' import { useUserStore, usePermissionStore } from '@/store' const isHash = false export const router = createRouter({ history: isHash ? createWebHashHistory('/') : createWebHistory('/'), routes: basicRoutes, scrollBehavior: () => ({ left: 0, top: 0 }), }) export async function setupRouter(app) { await addDynamicRoutes() setupRouterGuard(router) app.use(router) } export async function resetRouter() { const basicRouteNames = getRouteNames(basicRoutes) router.getRoutes().forEach((route) => { const name = route.name if (!basicRouteNames.includes(name)) { router.removeRoute(name) } }) } export async function addDynamicRoutes() { const token = getToken() // 没有token情况 if (isNullOrWhitespace(token)) { router.addRoute(EMPTY_ROUTE) return } // 有token的情况 try { const userStore = useUserStore() const permissionStore = usePermissionStore() !userStore.userId && (await userStore.getUserInfo()) const accessRoutes = permissionStore.generateRoutes(userStore.role) // 确保路由按正确顺序添加 accessRoutes.forEach((route) => { if (!router.hasRoute(route.name)) { router.addRoute(route) } }) // 移除空路由,添加404路由 if (router.hasRoute(EMPTY_ROUTE.name)) { router.removeRoute(EMPTY_ROUTE.name) } router.addRoute(NOT_FOUND_ROUTE) // 确保根路径重定向到工作台 if (!router.hasRoute('Dashboard')) { const workbenchRoute = { name: 'Dashboard', path: '/', component: () => import('@/layout/index.vue'), redirect: '/workbench', children: [ { name: 'Workbench', path: 'workbench', component: () => import('@/views/workbench/index.vue'), meta: { title: '工作台', icon: 'mdi:index', order: 0, }, }, ], } router.addRoute(workbenchRoute) } } catch (error) { console.error(error) throw error } } export function getRouteNames(routes) { return routes.map((route) => getRouteName(route)).flat(1) } function getRouteName(route) { const names = [route.name] if (route.children && route.children.length) { names.push(...route.children.map((item) => getRouteName(item)).flat(1)) } return names }