Files
urbanLifeline/urbanLifelineWeb/packages/platform/src/router/index.ts
2025-12-13 14:13:31 +08:00

77 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import { TokenManager } from 'shared/api'
import { loadRoutesFromStorage } from './dynamicRoute'
// platform应用的动态路由会根据layout字段自动添加不需要预定义Root布局
const routes: RouteRecordRaw[] = [
{
path: '/login',
name: 'Login',
component: () => import('@/views/public/Login/Login.vue'),
meta: {
title: '登录',
requiresAuth: false // 不需要登录
}
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
// 标记动态路由是否已加载
let dynamicRoutesLoaded = false
// 路由守卫
router.beforeEach((to, from, next) => {
// 设置页面标题
if (to.meta.title) {
document.title = `${to.meta.title} - 泰豪电源 AI 数智化平台`
}
// 检查是否需要登录
const requiresAuth = to.meta.requiresAuth !== false // 默认需要登录
const hasToken = TokenManager.hasToken()
if (requiresAuth && !hasToken) {
// 需要登录但未登录,跳转到登录页
next({
path: '/login',
query: { redirect: to.fullPath } // 保存原始路径
})
return
}
if (to.path === '/login' && hasToken) {
// 已登录但访问登录页,跳转到首页
next('/')
return
}
// 如果已登录且动态路由未加载,先加载动态路由
if (hasToken && !dynamicRoutesLoaded) {
dynamicRoutesLoaded = true
const loaded = loadRoutesFromStorage()
if (loaded && to.path !== '/') {
// 动态路由已加载,重新导航到目标路由
next({ ...to, replace: true })
return
}
}
next()
})
// 导出动态路由生成函数
export { addDynamicRoutes, loadRoutesFromStorage } from './dynamicRoute'
// 重置动态路由加载状态(用于登录后重新加载)
export function resetDynamicRoutes() {
dynamicRoutesLoaded = false
}
// 导出路由和辅助函数
export default router