dengzedong
2 天以前 36885d9fdc194ec984e257da0950478ebcb33288
提交 | 用户 | 时间
820397 1 import router from './router'
H 2 import type { RouteRecordRaw } from 'vue-router'
3 import { isRelogin } from '@/config/axios/service'
4 import { getAccessToken } from '@/utils/auth'
5 import { useTitle } from '@/hooks/web/useTitle'
6 import { useNProgress } from '@/hooks/web/useNProgress'
7 import { usePageLoading } from '@/hooks/web/usePageLoading'
8 import { useDictStoreWithOut } from '@/store/modules/dict'
9 import { useUserStoreWithOut } from '@/store/modules/user'
10 import { usePermissionStoreWithOut } from '@/store/modules/permission'
11
12 const { start, done } = useNProgress()
13
14 const { loadStart, loadDone } = usePageLoading()
15
16 const parseURL = (
17   url: string | null | undefined
18 ): { basePath: string; paramsObject: { [key: string]: string } } => {
19   // 如果输入为 null 或 undefined,返回空字符串和空对象
20   if (url == null) {
21     return { basePath: '', paramsObject: {} }
22   }
23
24   // 找到问号 (?) 的位置,它之前是基础路径,之后是查询参数
25   const questionMarkIndex = url.indexOf('?')
26   let basePath = url
27   const paramsObject: { [key: string]: string } = {}
28
29   // 如果找到了问号,说明有查询参数
30   if (questionMarkIndex !== -1) {
31     // 获取 basePath
32     basePath = url.substring(0, questionMarkIndex)
33
34     // 从 URL 中获取查询字符串部分
35     const queryString = url.substring(questionMarkIndex + 1)
36
37     // 使用 URLSearchParams 遍历参数
38     const searchParams = new URLSearchParams(queryString)
39     searchParams.forEach((value, key) => {
40       // 封装进 paramsObject 对象
41       paramsObject[key] = value
42     })
43   }
44
45   // 返回 basePath 和 paramsObject
46   return { basePath, paramsObject }
47 }
48
49 // 路由不重定向白名单
50 const whiteList = [
51   '/login',
52   '/social-login',
53   '/auth-redirect',
54   '/bind',
55   '/register',
56   '/oauthLogin/gitee'
57 ]
58
59 // 路由加载前
60 router.beforeEach(async (to, from, next) => {
61   start()
62   loadStart()
63   if (getAccessToken()) {
64     if (to.path === '/login') {
65       next({ path: '/' })
66     } else {
67       // 获取所有字典
68       const dictStore = useDictStoreWithOut()
69       const userStore = useUserStoreWithOut()
70       const permissionStore = usePermissionStoreWithOut()
71       if (!dictStore.getIsSetDict) {
72         await dictStore.setDictMap()
73       }
74       if (!userStore.getIsSetUser) {
75         isRelogin.show = true
39248b 76         await userStore.
H 77         setUserInfoAction()
820397 78         isRelogin.show = false
H 79         // 后端过滤菜单
80         await permissionStore.generateRoutes()
81         permissionStore.getAddRouters.forEach((route) => {
82           router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
83         })
84         const redirectPath = from.query.redirect || to.path
85         // 修复跳转时不带参数的问题
86         const redirect = decodeURIComponent(redirectPath as string)
87         const { paramsObject: query } = parseURL(redirect)
88         const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect, query }
89         next(nextData)
90       } else {
91         next()
92       }
93     }
94   } else {
95     if (whiteList.indexOf(to.path) !== -1) {
96       next()
97     } else {
98       next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
99     }
100   }
101 })
102
103 router.afterEach((to) => {
104   useTitle(to?.meta?.title as string)
105   done() // 结束Progress
106   loadDone()
107 })