98 lines
2.6 KiB
JavaScript
98 lines
2.6 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'
|
||
|
||
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
|
||
}
|