router-guards.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import type { RouteRecordRaw } from 'vue-router'
  2. import { isNavigationFailure, Router } from 'vue-router'
  3. import { useUserStoreWidthOut } from '@/store/modules/user'
  4. import { useAsyncRouteStoreWidthOut } from '@/store/modules/asyncRoute'
  5. import { ACCESS_TOKEN } from '@/store/mutation-types'
  6. import { storage } from '@/utils/storage'
  7. import { PageEnum } from '@/enums/pageEnum'
  8. import { ErrorPageRoute } from '@/router/base'
  9. import { App } from 'vue'
  10. import { useLoadingBar, useDialog } from 'naive-ui'
  11. import { BaseRoute } from '@/router/base'
  12. const LOGIN_PATH = PageEnum.BASE_LOGIN
  13. const whitePathList = [LOGIN_PATH] // no redirect whitelist
  14. const Loading = useLoadingBar()
  15. export function createRouterGuards(router: Router, app: App) {
  16. const userStore = useUserStoreWidthOut()
  17. const asyncRouteStore = useAsyncRouteStoreWidthOut()
  18. router.beforeEach(async (to, from, next) => {
  19. Loading && Loading.start()
  20. if (from.path === LOGIN_PATH && to.name === 'errorPage') {
  21. next(PageEnum.BASE_HOME)
  22. return
  23. }
  24. // Whitelist can be directly entered
  25. if (whitePathList.includes(to.path)) {
  26. next()
  27. return
  28. }
  29. const token = storage.get(ACCESS_TOKEN)
  30. // console.log(token, 'token')
  31. if (!token) {
  32. // You can access without permissions. You need to set the routing meta.ignoreAuth to true
  33. if (to.meta.ignoreAuth) {
  34. next()
  35. return
  36. }
  37. // redirect login page
  38. const redirectData: { path: string; replace: boolean; query?: any } = {
  39. path: LOGIN_PATH,
  40. replace: true
  41. }
  42. if (to.path) {
  43. redirectData.query = {
  44. ...redirectData.query,
  45. redirect: to.path
  46. }
  47. }
  48. next(redirectData)
  49. return
  50. }
  51. if (asyncRouteStore.getIsDynamicAddedRoute) {
  52. next()
  53. return
  54. }
  55. await userStore.GetInfo()
  56. const routes = await asyncRouteStore.generateRoutes()
  57. const isHasRoot = routes.find((item: any) => {
  58. return item.path == from.query?.redirect
  59. })
  60. const hasCurrentRoute = routes.find((item: any) => {
  61. return item.path == to.path
  62. })
  63. router.addRoute(BaseRoute)
  64. // // 动态添加可访问路由表
  65. // ;((routes as any) || []).forEach((item: any) => {
  66. // // console.log(item, 'add route')
  67. // router.addRoute(item as unknown as RouteRecordRaw)
  68. // })
  69. //添加404
  70. const isErrorPage = router.getRoutes().findIndex((item) => item.name === ErrorPageRoute.name)
  71. if (isErrorPage === -1) {
  72. router.addRoute(ErrorPageRoute as unknown as RouteRecordRaw)
  73. }
  74. const redirectPath = (
  75. hasCurrentRoute ? to.path : isHasRoot ? from.query.redirect : PageEnum.BASE_HOME
  76. ) as string
  77. const redirect = decodeURIComponent(redirectPath)
  78. const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
  79. asyncRouteStore.setDynamicAddedRoute(true)
  80. next(nextData)
  81. Loading && Loading.finish()
  82. })
  83. router.afterEach((to, _, failure) => {
  84. if (isNavigationFailure(failure)) {
  85. //console.log('failed navigation', failure)
  86. }
  87. const asyncRouteStore = useAsyncRouteStoreWidthOut()
  88. // 在这里设置需要缓存的组件名称
  89. const keepAliveComponents = asyncRouteStore.keepAliveComponents
  90. const currentComName: any = to.matched.find((item) => item.name == to.name)?.name
  91. if (currentComName && !keepAliveComponents.includes(currentComName) && to.meta?.keepAlive) {
  92. // 需要缓存的组件
  93. keepAliveComponents.push(currentComName)
  94. } else if (!to.meta?.keepAlive || to.name == 'Redirect') {
  95. // 不需要缓存的组件
  96. const index = asyncRouteStore.keepAliveComponents.findIndex((name) => name == currentComName)
  97. if (index != -1) {
  98. keepAliveComponents.splice(index, 1)
  99. }
  100. }
  101. asyncRouteStore.setKeepAliveComponents(keepAliveComponents)
  102. Loading && Loading.finish()
  103. })
  104. router.onError((error) => {})
  105. }