Просмотр исходного кода

feat(router): 重构登录路由拦截逻辑并支持角色授权

- 将 EXCLUDE_PAGE_LIST 重命名为 EXCLUDE_LOGIN_PATH_LIST 以更清晰表达用途
- 在 about 页面添加 excludeLoginPath 和 roleAuth 配置
- 更新路由拦截器逻辑以支持新的配置
- 更新相关文档说明
feige996 8 месяцев назад
Родитель
Сommit
b42a5e6c95
5 измененных файлов с 25 добавлено и 11 удалено
  1. 6 0
      src/pages.json
  2. 8 0
      src/pages/about/about.vue
  3. 4 4
      src/router/README.md
  4. 1 1
      src/router/config.ts
  5. 6 6
      src/router/interceptor.ts

+ 6 - 0
src/pages.json

@@ -53,6 +53,12 @@
       "type": "page",
       "style": {
         "navigationBarTitleText": "关于"
+      },
+      "excludeLoginPath": true,
+      "roleAuth": {
+        "field": "role",
+        "value": "admin",
+        "redirect": "/pages/auth/403"
       }
     },
     {

+ 8 - 0
src/pages/about/about.vue

@@ -9,6 +9,14 @@ definePage({
   style: {
     navigationBarTitleText: '关于',
   },
+  // 登录授权(可选):跟以前的 needLogin 类似功能,但是同时支持黑白名单,详情请见 arc/router 文件夹
+  excludeLoginPath: true,
+  // 角色授权(可选):如果需要根据角色授权,就配置这个
+  roleAuth: {
+    field: 'role',
+    value: 'admin',
+    redirect: '/pages/auth/403',
+  },
 })
 
 // 浏览器打印 isH5为true, isWeb为false,大家尽量用 isH5

+ 4 - 4
src/router/README.md

@@ -15,12 +15,12 @@
 
 比如大部分2B和后台管理类的应用,比如企业微信、钉钉、飞书、内部报表系统、CMS系统等,都需要登录,只有登录后,才能使用。
 
-### EXCLUDE_PAGE_LIST
-`EXCLUDE_PAGE_LIST` 表示排除的路由列表。
+### EXCLUDE_LOGIN_PATH_LIST
+`EXCLUDE_LOGIN_PATH_LIST` 表示排除的路由列表。
 
-在 `默认无需登录策略: DEFAULT_NO_NEED_LOGIN` 中,只有路由在 `EXCLUDE_PAGE_LIST` 中,才需要登录,相当于黑名单。
+在 `默认无需登录策略: DEFAULT_NO_NEED_LOGIN` 中,只有路由在 `EXCLUDE_LOGIN_PATH_LIST` 中,才需要登录,相当于黑名单。
 
-在 `默认需要登录策略: DEFAULT_NEED_LOGIN` 中,只有路由在 `EXCLUDE_PAGE_LIST` 中,才不需要登录,相当于白名单。
+在 `默认需要登录策略: DEFAULT_NEED_LOGIN` 中,只有路由在 `EXCLUDE_LOGIN_PATH_LIST` 中,才不需要登录,相当于白名单。
 
 
 ## 登录注册页路由

+ 1 - 1
src/router/config.ts

@@ -12,7 +12,7 @@ export const REGISTER_PAGE = '/pages/login/register'
 export const LOGIN_PAGE_LIST = [LOGIN_PAGE, REGISTER_PAGE]
 
 // 排除在外的列表,白名单策略指白名单列表,黑名单策略指黑名单列表
-export const EXCLUDE_PAGE_LIST = [
+export const EXCLUDE_LOGIN_PATH_LIST = [
   '/pages/xxx/index',
 ]
 

+ 6 - 6
src/router/interceptor.ts

@@ -1,12 +1,12 @@
 /**
  * by 菲鸽 on 2025-08-19
  * 路由拦截,通常也是登录拦截
- * 黑白名单的配置,请看 config.ts 文件, EXCLUDE_PAGE_LIST
+ * 黑白名单的配置,请看 config.ts 文件, EXCLUDE_LOGIN_PATH_LIST
  */
 import { useTokenStore } from '@/store/token'
 import { tabbarStore } from '@/tabbar/store'
 import { getLastPage, parseUrlToObj } from '@/utils/index'
-import { EXCLUDE_PAGE_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_LIST } from './config'
+import { EXCLUDE_LOGIN_PATH_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_LIST } from './config'
 
 export const FG_LOG_ENABLE = false
 
@@ -57,8 +57,8 @@ export const navigateToInterceptor = {
         return true // 明确表示允许路由继续执行
       }
       else {
-        // 需要登录里面的 EXCLUDE_PAGE_LIST 表示白名单,可以直接通过
-        if (EXCLUDE_PAGE_LIST.includes(path)) {
+        // 需要登录里面的 EXCLUDE_LOGIN_PATH_LIST 表示白名单,可以直接通过
+        if (EXCLUDE_LOGIN_PATH_LIST.includes(path)) {
           return true // 明确表示允许路由继续执行
         }
         // 否则需要重定向到登录页
@@ -73,8 +73,8 @@ export const navigateToInterceptor = {
 
     // #region 2/2 不需要登录的情况 ---------------------------
     else {
-      // 不需要登录里面的 EXCLUDE_PAGE_LIST 表示黑名单,需要重定向到登录页
-      if (EXCLUDE_PAGE_LIST.includes(path)) {
+      // 不需要登录里面的 EXCLUDE_LOGIN_PATH_LIST 表示黑名单,需要重定向到登录页
+      if (EXCLUDE_LOGIN_PATH_LIST.includes(path)) {
         FG_LOG_ENABLE && console.log('2 isNeedLogin redirectUrl:', redirectUrl)
         uni.navigateTo({ url: redirectUrl })
         return false // 明确表示阻止原路由继续执行