134 lines
3.3 KiB
JavaScript
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
|
|
}
|
|
|