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