permission.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import router from './router'
  2. import NProgress from 'nprogress'
  3. import 'nprogress/nprogress.css'
  4. import { getToken } from '@/utils/auth'
  5. import { isPathMatch } from '@/utils/validate'
  6. import useSettingsStore from '@/store/modules/settings'
  7. import usePermissionStore from '@/store/modules/permission'
  8. import useUserStore from '@/store/modules/user'
  9. NProgress.configure({ showSpinner: false })
  10. const whiteList = ['/login', '/register']
  11. const isWhiteList = (path) => {
  12. return whiteList.some(pattern => isPathMatch(pattern, path))
  13. }
  14. router.beforeEach(async (to, from, next) => {
  15. NProgress.start()
  16. if (getToken()) {
  17. to.meta.title && useSettingsStore().setTitle(to.meta.title)
  18. /* has token*/
  19. const userStore = useUserStore()
  20. // 如果还没有用户信息,先获取用户信息
  21. if (!userStore.name && userStore.token) {
  22. try {
  23. await userStore.getInfo()
  24. } catch (error) {
  25. console.error('获取用户信息失败:', error)
  26. // 如果获取用户信息失败,清除token并跳转到登录页
  27. await userStore.logOut()
  28. next(`/login?redirect=${to.fullPath}`)
  29. NProgress.done()
  30. return
  31. }
  32. }
  33. if (to.path === '/login') {
  34. // 如果已经登录,跳转到首页
  35. next({ path: '/user/myuser', replace: true })
  36. NProgress.done()
  37. } else if (isWhiteList(to.path)) {
  38. next()
  39. } else {
  40. // 直接加载菜单,不需要角色权限判断
  41. const permissionStore = usePermissionStore()
  42. if (permissionStore.routes.length === 0) {
  43. // 菜单还未加载,先加载菜单
  44. try {
  45. const accessRoutes = await permissionStore.generateRoutes()
  46. // 动态添加路由
  47. accessRoutes.forEach(route => {
  48. router.addRoute(route) // 动态添加路由
  49. })
  50. // 路由加载完成后,继续导航到目标路径
  51. next({ ...to, replace: true })
  52. } catch (error) {
  53. console.error('加载路由失败:', error)
  54. next()
  55. }
  56. } else {
  57. next()
  58. }
  59. }
  60. } else {
  61. // 没有token
  62. if (isWhiteList(to.path)) {
  63. // 在免登录白名单,直接进入
  64. next()
  65. } else {
  66. next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
  67. NProgress.done()
  68. }
  69. }
  70. })
  71. router.afterEach(() => {
  72. NProgress.done()
  73. })