Kaynağa Gözat

refactor(router): 修改登录路由拦截逻辑以支持开发环境动态更新

将 needLogin 参数名改为 excludeLoginPath 以更准确表达用途
在开发环境下动态获取排除登录的页面列表
将路由配置中的排除列表与页面配置合并
feige996 8 ay önce
ebeveyn
işleme
ec9e7f34d2
3 değiştirilmiş dosya ile 12 ekleme ve 4 silme
  1. 6 0
      src/router/config.ts
  2. 4 2
      src/router/interceptor.ts
  3. 2 2
      src/utils/index.ts

+ 6 - 0
src/router/config.ts

@@ -1,3 +1,5 @@
+import { getAllPages } from '@/utils'
+
 export const LOGIN_STRATEGY_MAP = {
   DEFAULT_NO_NEED_LOGIN: 0, // 黑名单策略,默认可以进入APP
   DEFAULT_NEED_LOGIN: 1, // 白名单策略,默认不可以进入APP,需要强制登录
@@ -11,9 +13,13 @@ export const REGISTER_PAGE = '/pages/login/register'
 
 export const LOGIN_PAGE_LIST = [LOGIN_PAGE, REGISTER_PAGE]
 
+// 在 definePage 里面配置了 excludeLoginPath 的页面,功能与 EXCLUDE_LOGIN_PATH_LIST 相同
+export const excludeLoginPathList = getAllPages('excludeLoginPath').map(page => page.path)
+
 // 排除在外的列表,白名单策略指白名单列表,黑名单策略指黑名单列表
 export const EXCLUDE_LOGIN_PATH_LIST = [
   '/pages/xxx/index',
+  ...excludeLoginPathList, // 都是以 / 开头的 path
 ]
 
 // 在微信小程序里面是否使用小程序默认的登录,默认为true

+ 4 - 2
src/router/interceptor.ts

@@ -5,9 +5,10 @@
  */
 import { useTokenStore } from '@/store/token'
 import { tabbarStore } from '@/tabbar/store'
-import { getLastPage, parseUrlToObj } from '@/utils/index'
+import { getAllPages, getLastPage, parseUrlToObj } from '@/utils/index'
 import { EXCLUDE_LOGIN_PATH_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_LIST } from './config'
 
+const isDev = import.meta.env.DEV
 export const FG_LOG_ENABLE = false
 
 // 黑名单登录拦截器 - (适用于大部分页面不需要登录,少部分页面需要登录)
@@ -57,8 +58,9 @@ export const navigateToInterceptor = {
         return true // 明确表示允许路由继续执行
       }
       else {
+        const allExcludeLoginPages = getAllPages('excludeLoginPath') // dev 环境下,需要每次都重新获取,否则新配置就不会生效
         // 需要登录里面的 EXCLUDE_LOGIN_PATH_LIST 表示白名单,可以直接通过
-        if (EXCLUDE_LOGIN_PATH_LIST.includes(path)) {
+        if (EXCLUDE_LOGIN_PATH_LIST.includes(path) || (isDev && allExcludeLoginPages.some(page => page.path === path))) {
           return true // 明确表示允许路由继续执行
         }
         // 否则需要重定向到登录页

+ 2 - 2
src/utils/index.ts

@@ -60,10 +60,10 @@ export function parseUrlToObj(url: string) {
 }
 /**
  * 得到所有的需要登录的 pages,包括主包和分包的
- * 这里设计得通用一点,可以传递 key 作为判断依据,默认是 needLogin, 与 route-block 配对使用
+ * 这里设计得通用一点,可以传递 key 作为判断依据,默认是 excludeLoginPath, 与 route-block 配对使用
  * 如果没有传 key,则表示所有的 pages,如果传递了 key, 则表示通过 key 过滤
  */
-export function getAllPages(key = 'needLogin') {
+export function getAllPages(key = 'excludeLoginPath') {
   // 这里处理主包
   const mainPages = pages
     .filter(page => !key || page[key])