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' import * as Sentry from '@sentry/vue' const isHash = true export const router = createRouter({ history: isHash ? createWebHashHistory('/') : createWebHistory('/'), routes: basicRoutes, scrollBehavior: () => ({ left: 0, top: 0 }), }) export async function setupRouter(app) { await addDynamicRoutes() setupRouterGuard(router) if (import.meta.env.VITE_SENTRY) { Sentry.init({ app, dsn: 'https://aa4308fc56a9d107786b8dbcd2ae56e8@w.huakk.top/13', integrations: [ new Sentry.BrowserTracing({ tracePropagationTargets: ['localhost', /^https:\/\/w\.huakk\.top\/api/], routingInstrumentation: Sentry.vueRouterInstrumentation(router), }), new Sentry.Replay(), ], tracesSampleRate: 1.0, replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, }) } 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) => { !router.hasRoute(route.name) && router.addRoute(route) }) router.hasRoute(EMPTY_ROUTE.name) && router.removeRoute(EMPTY_ROUTE.name) router.addRoute(NOT_FOUND_ROUTE) } catch (error) { console.error(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 }