index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { createRouter, createWebHistory } from 'vue-router'
  2. import MainView from '@/views/MainView.vue'
  3. import DashboardView from '@/views/DashboardView.vue'
  4. import LoginView from '@/views/LoginView.vue'
  5. import { useUserStore } from '@/stores/user'
  6. import { useTeamStore } from '@/stores/team'
  7. const router = createRouter({
  8. history: createWebHistory('/admin/'),
  9. routes: [
  10. {
  11. path: '/',
  12. redirect: '/main/dashboard'
  13. },
  14. {
  15. path: '/main',
  16. component: MainView,
  17. meta: { requiresAuth: true },
  18. children: [
  19. {
  20. path: '',
  21. redirect: '/main/dashboard'
  22. },
  23. {
  24. path: 'dashboard',
  25. name: 'dashboard',
  26. component: DashboardView
  27. },
  28. {
  29. path: 'user',
  30. name: 'user',
  31. component: () => import('@/views/UserView.vue')
  32. },
  33. {
  34. path: 'sys-config',
  35. name: 'sys-config',
  36. component: () => import('@/views/SysConfigView.vue')
  37. },
  38. {
  39. path: 'income',
  40. name: 'income',
  41. component: () => import('@/views/IncomeView.vue')
  42. },
  43. {
  44. path: 'finance',
  45. name: 'finance',
  46. component: () => import('@/views/FinanceView.vue')
  47. },
  48. {
  49. path: 'team',
  50. name: 'team',
  51. redirect: '/main/team/info',
  52. children: [
  53. {
  54. path: 'info',
  55. name: 'team-info',
  56. component: () => import('@/views/TeamView.vue')
  57. },
  58. {
  59. path: 'members',
  60. name: 'team-members',
  61. component: () => import('@/views/TeamMembersView.vue')
  62. }
  63. ]
  64. },
  65. {
  66. path: 'link',
  67. name: 'link',
  68. component: () => import('@/views/LinkView.vue')
  69. },
  70. ]
  71. },
  72. {
  73. path: '/login',
  74. name: 'login',
  75. component: LoginView,
  76. meta: { guest: true }
  77. },
  78. {
  79. path: '/:pathMatch(.*)*',
  80. redirect: '/main/dashboard'
  81. }
  82. ]
  83. })
  84. router.beforeEach(async (to, from, next) => {
  85. const userStore = useUserStore()
  86. const teamStore = useTeamStore()
  87. if (to.meta.requiresAuth) {
  88. if (userStore.token && userStore.userInfo.id && userStore.userInfo.role) {
  89. if (userStore.userInfo.role === 'admin') {
  90. await teamStore.loadTeams()
  91. }
  92. next()
  93. } else if (userStore.token) {
  94. try {
  95. await userStore.sync()
  96. // 确保用户信息完整后再继续
  97. if (userStore.userInfo.id && userStore.userInfo.role) {
  98. if (userStore.userInfo.role === 'admin') {
  99. await teamStore.loadTeams()
  100. }
  101. next()
  102. } else {
  103. // 用户信息不完整,清除token并重定向到登录页
  104. userStore.logout()
  105. next('/login')
  106. }
  107. } catch (error) {
  108. console.error('同步用户信息失败:', error)
  109. userStore.logout()
  110. next('/login')
  111. }
  112. } else {
  113. next('/login')
  114. }
  115. } else if (to.path === '/login' && userStore.token) {
  116. next('/')
  117. } else {
  118. next()
  119. }
  120. })
  121. export default router