Files
admin_core/src/router/index.js
张成 e039ae8c62 1
2025-10-28 11:24:11 +08:00

134 lines
3.3 KiB
JavaScript

import { getToken } from '../utils/tools'
// 基础路由配置(不包含具体组件,需要在使用时注入)
export const createBaseRoutes = (LoginPage, Page401, Page404, Page500) => {
return [
{
path: '/login',
name: 'login',
component: LoginPage
},
{
path: '/401',
name: 'error_401',
component: Page401
},
{
path: '/404',
name: 'error_404',
component: Page404
},
{
path: '/500',
name: 'error_500',
component: Page500
},
{
path: '*',
name: 'error_404_wildcard',
component: Page404
}
]
}
// 路由守卫配置
export const setupRouterGuards = (router, ViewUI, homeName = 'home') => {
router.beforeEach((to, from, next) => {
const token = getToken()
ViewUI.LoadingBar.start()
if (to.name === 'view_log') {
next()
return
}
if (!token && to.name !== 'login') {
// 未登录且访问非登录页 → 跳转到登录页
next({ name: 'login' })
} else if (!token && to.name === 'login') {
// 未登录且访问登录页 → 允许访问
next()
} else if (token && to.name === 'login') {
// 已登录且访问登录页 → 重定向到首页
// 避免重复导航警告
if (from.name === homeName) {
next(false)
} else {
next({ name: homeName })
}
} else {
// 已登录,检查路由是否存在
if (token && to.matched.length === 0 && to.path !== '/') {
// 路由不存在,可能是动态路由还未加载完成
console.warn('路由未找到:', to.name || to.path, ',尝试等待动态路由加载')
// 等待一小段时间后重试
setTimeout(() => {
// 检查路由是否已经存在
const route = router.resolve(to.path)
if (route && route.matched.length > 0) {
next({ path: to.path, replace: true })
} else {
console.error('路由仍然不存在:', to.name || to.path, ',跳转到首页')
next({ name: homeName, replace: true })
}
}, 150)
return
}
// 其他情况 → 允许访问
next()
}
})
router.afterEach(to => {
ViewUI.LoadingBar.finish()
window.scrollTo(0, 0)
})
return router
}
// 获取动态路由的方法
export function getRoutes(components = {}, uiTool) {
const { Main, ParentView, Page404, HomePage } = components
if (!Main || !ParentView || !Page404) {
console.error('Missing required layout components')
return null
}
return uiTool.getRoutes(Main, ParentView, Page404, HomePage)
}
// 创建路由实例的方法
export function createRouter(Router, components = {}, customRoutes = [], ViewUI) {
const { LoginPage, Page401, Page404, Page500 } = components
if (!LoginPage || !Page401 || !Page404 || !Page500) {
console.error('Missing required page components')
return null
}
const baseRoutes = createBaseRoutes(LoginPage, Page401, Page404, Page500)
const router = new Router({
routes: [...baseRoutes, ...customRoutes],
mode: 'hash'
})
if (ViewUI) {
setupRouterGuards(router, ViewUI, 'home')
}
return router
}
export default {
createBaseRoutes,
setupRouterGuards,
createRouter,
getRoutes
}