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