index.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { createRouter, createWebHistory } from 'vue-router'
  2. import Temp404 from '@/views/global/temp/404.vue'
  3. import RouterView from '@/layout/router-view.vue'
  4. // @ts-ignore
  5. import Layout from '@/layout/index.vue'
  6. import { useAppStore, useMenuStore } from '@/stores'
  7. const routes = [
  8. { path: '/:pathMatch(.*)*', name: 'NotFound', component: Temp404 },
  9. {
  10. name: 'root',
  11. path: '/',
  12. component: Layout,
  13. redirect: '/home',
  14. children: [],
  15. },
  16. {
  17. name: 'login',
  18. path: '/login',
  19. component: () => import('@/views/global/login/index.vue'),
  20. meta: {},
  21. },
  22. {
  23. name: 'home',
  24. path: '/home',
  25. component: () => import('@/views/study/home/index.vue'),
  26. meta: {
  27. isMenu: true,
  28. title: '首页',
  29. fa: 'fa-home',
  30. theme: 'main',
  31. },
  32. },
  33. ]
  34. const router = createRouter({
  35. // @ts-ignore
  36. history: createWebHistory(import.meta.env.BASE_URL),
  37. routes,
  38. })
  39. const hasLogin = (import.meta as any).env.VITE_LOGIN_MUST === 'Y'
  40. router.beforeEach((to, from, next) => {
  41. document.title = to.meta?.title || (import.meta as any).env.VITE_TITLE
  42. const isLogin = to.name === 'login'
  43. const inviteQuery = to.name === 'invite' ? to.query : {}
  44. const AppStore = useAppStore()
  45. AppStore.loadingStart()
  46. if (
  47. isLogin &&
  48. !AppStore.userInfo &&
  49. !localStorage.getItem((import.meta as any).env.VITE_TOKEN)
  50. ) {
  51. next()
  52. AppStore.loadingEnd()
  53. } else {
  54. if (hasLogin) {
  55. if (AppStore.userInfo) {
  56. isLogin ? next({ name: 'root' }) : next()
  57. AppStore.loadingEnd()
  58. } else {
  59. if (localStorage.getItem((import.meta as any).env.VITE_TOKEN)) {
  60. AppStore.initUserInfo()
  61. .then(() => {
  62. isLogin
  63. ? next({ name: 'root' })
  64. : next({ path: to.path, query: to.query })
  65. })
  66. .catch((e) => {
  67. localStorage.removeItem((import.meta as any).env.VITE_TOKEN)
  68. next({ name: 'login', query: inviteQuery })
  69. })
  70. .finally(() => {
  71. AppStore.loadingEnd()
  72. })
  73. } else {
  74. next({ name: 'login', query: inviteQuery })
  75. AppStore.loadingEnd()
  76. }
  77. }
  78. } else {
  79. next()
  80. AppStore.loadingEnd()
  81. }
  82. }
  83. })
  84. export const initRoutes = () => {
  85. const MenuStore = useMenuStore()
  86. return new Promise((resolve, reject) => {
  87. setTimeout(() => {
  88. MenuStore.initRoutes(MenuStore.mockApi)
  89. resolve(null)
  90. }, 2000)
  91. })
  92. }
  93. export default router