From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/permission.ts | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 107 insertions(+), 0 deletions(-)
diff --git a/src/permission.ts b/src/permission.ts
new file mode 100644
index 0000000..d2e7d31
--- /dev/null
+++ b/src/permission.ts
@@ -0,0 +1,107 @@
+import router from './router'
+import type { RouteRecordRaw } from 'vue-router'
+import { isRelogin } from '@/config/axios/service'
+import { getAccessToken } from '@/utils/auth'
+import { useTitle } from '@/hooks/web/useTitle'
+import { useNProgress } from '@/hooks/web/useNProgress'
+import { usePageLoading } from '@/hooks/web/usePageLoading'
+import { useDictStoreWithOut } from '@/store/modules/dict'
+import { useUserStoreWithOut } from '@/store/modules/user'
+import { usePermissionStoreWithOut } from '@/store/modules/permission'
+
+const { start, done } = useNProgress()
+
+const { loadStart, loadDone } = usePageLoading()
+
+const parseURL = (
+ url: string | null | undefined
+): { basePath: string; paramsObject: { [key: string]: string } } => {
+ // 濡傛灉杈撳叆涓� null 鎴� undefined锛岃繑鍥炵┖瀛楃涓插拰绌哄璞�
+ if (url == null) {
+ return { basePath: '', paramsObject: {} }
+ }
+
+ // 鎵惧埌闂彿 (?) 鐨勪綅缃紝瀹冧箣鍓嶆槸鍩虹璺緞锛屼箣鍚庢槸鏌ヨ鍙傛暟
+ const questionMarkIndex = url.indexOf('?')
+ let basePath = url
+ const paramsObject: { [key: string]: string } = {}
+
+ // 濡傛灉鎵惧埌浜嗛棶鍙凤紝璇存槑鏈夋煡璇㈠弬鏁�
+ if (questionMarkIndex !== -1) {
+ // 鑾峰彇 basePath
+ basePath = url.substring(0, questionMarkIndex)
+
+ // 浠� URL 涓幏鍙栨煡璇㈠瓧绗︿覆閮ㄥ垎
+ const queryString = url.substring(questionMarkIndex + 1)
+
+ // 浣跨敤 URLSearchParams 閬嶅巻鍙傛暟
+ const searchParams = new URLSearchParams(queryString)
+ searchParams.forEach((value, key) => {
+ // 灏佽杩� paramsObject 瀵硅薄
+ paramsObject[key] = value
+ })
+ }
+
+ // 杩斿洖 basePath 鍜� paramsObject
+ return { basePath, paramsObject }
+}
+
+// 璺敱涓嶉噸瀹氬悜鐧藉悕鍗�
+const whiteList = [
+ '/login',
+ '/social-login',
+ '/auth-redirect',
+ '/bind',
+ '/register',
+ '/oauthLogin/gitee'
+]
+
+// 璺敱鍔犺浇鍓�
+router.beforeEach(async (to, from, next) => {
+ start()
+ loadStart()
+ if (getAccessToken()) {
+ if (to.path === '/login') {
+ next({ path: '/' })
+ } else {
+ const dictStore = useDictStoreWithOut()
+ const userStore = useUserStoreWithOut()
+ const permissionStore = usePermissionStoreWithOut()
+ // 寮傛鍔犺浇瀛楀吀
+ // 鍙﹀锛岄棿鎺� issue锛歨ttps://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ID9FLI
+ if (!dictStore.getIsSetDict) {
+ dictStore.setDictMap().then()
+ }
+ if (!userStore.getIsSetUser) {
+ isRelogin.show = true
+ await userStore.setUserInfoAction()
+ isRelogin.show = false
+ // 鍚庣杩囨护鑿滃崟
+ await permissionStore.generateRoutes()
+ permissionStore.getAddRouters.forEach((route) => {
+ router.addRoute(route as unknown as RouteRecordRaw) // 鍔ㄦ�佹坊鍔犲彲璁块棶璺敱琛�
+ })
+ const redirectPath = from.query.redirect || to.path
+ // 淇璺宠浆鏃朵笉甯﹀弬鏁扮殑闂
+ const redirect = decodeURIComponent(redirectPath as string)
+ const { paramsObject: query } = parseURL(redirect)
+ const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect, query }
+ next(nextData)
+ } else {
+ next()
+ }
+ }
+ } else {
+ if (whiteList.indexOf(to.path) !== -1) {
+ next()
+ } else {
+ next(`/login?redirect=${to.fullPath}`) // 鍚﹀垯鍏ㄩ儴閲嶅畾鍚戝埌鐧诲綍椤�
+ }
+ }
+})
+
+router.afterEach((to) => {
+ useTitle(to?.meta?.title as string)
+ done() // 缁撴潫Progress
+ loadDone()
+})
--
Gitblit v1.8.0