83 lines
2.4 KiB
JavaScript
83 lines
2.4 KiB
JavaScript
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
|
|
}
|