71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import router from './router'
|
||
import { ElMessage } from 'element-plus'
|
||
import { getToken } from '@/utils/auth'
|
||
import { useUserStore } from '@/stores/user'
|
||
|
||
// 白名单路由(不需要登录即可访问)
|
||
const whiteList = ['/login', '/register']
|
||
|
||
// DEV模式:后端未运行时跳过认证,允许直接访问页面
|
||
const DEV_SKIP_AUTH = import.meta.env.DEV && !import.meta.env.VITE_REQUIRE_AUTH
|
||
|
||
// 路由守卫
|
||
router.beforeEach(async (to, _from, next) => {
|
||
// 设置页面标题
|
||
document.title = to.meta.title ? `${to.meta.title} - ERP系统` : 'ERP系统'
|
||
|
||
// DEV模式跳过认证:设置模拟角色以通过权限检查
|
||
if (DEV_SKIP_AUTH) {
|
||
const userStore = useUserStore()
|
||
if (userStore.state.userInfo.roles.length === 0) {
|
||
userStore.state.userInfo.roles = ['admin']
|
||
userStore.state.userInfo.permissions = ['*:*:*']
|
||
userStore.state.userInfo.userName = 'dev'
|
||
userStore.state.userInfo.nickName = '开发模式'
|
||
}
|
||
next()
|
||
return
|
||
}
|
||
|
||
const token = getToken()
|
||
const userStore = useUserStore()
|
||
|
||
if (token) {
|
||
// 已登录
|
||
if (to.path === '/login') {
|
||
// 已登录状态下访问登录页,重定向到首页
|
||
next({ path: '/' })
|
||
} else {
|
||
// 检查是否已获取用户信息
|
||
if (userStore.state.userInfo.roles.length === 0) {
|
||
try {
|
||
// 获取用户信息
|
||
await userStore.getUserInfo()
|
||
// 确保路由完成后再跳转
|
||
next({ ...to, replace: true })
|
||
} catch (error: any) {
|
||
// 获取用户信息失败,可能是 token 过期
|
||
await userStore.fedLogout()
|
||
ElMessage.error(error?.message || '获取用户信息失败,请重新登录')
|
||
next(`/login?redirect=${to.fullPath}`)
|
||
}
|
||
} else {
|
||
next()
|
||
}
|
||
}
|
||
} else {
|
||
// 未登录
|
||
if (whiteList.includes(to.path)) {
|
||
// 在白名单中,直接进入
|
||
next()
|
||
} else {
|
||
// 不在白名单中,重定向到登录页
|
||
next(`/login?redirect=${to.fullPath}`)
|
||
}
|
||
}
|
||
})
|
||
|
||
router.afterEach(() => {
|
||
// 可以在这里添加 NProgress 完成等逻辑
|
||
})
|