Prechádzať zdrojové kódy

fix: 如果路由拦截器和http响应拦截都符合条件,可能会两次跳转登录页面

Utopia 6 mesiacov pred
rodič
commit
a7b5a80009
3 zmenil súbory, kde vykonal 11 pridanie a 10 odobranie
  1. 2 2
      src/http/alova.ts
  2. 3 3
      src/http/http.ts
  3. 6 5
      src/router/interceptor.ts

+ 2 - 2
src/http/alova.ts

@@ -4,7 +4,7 @@ import AdapterUniapp from '@alova/adapter-uniapp'
 import { createAlova } from 'alova'
 import { createServerTokenAuthentication } from 'alova/client'
 import VueHook from 'alova/vue'
-import { LOGIN_PAGE } from '@/router/config'
+import { toLoginPage } from '@/utils/toLoginPage'
 import { ContentTypeEnum, ResultEnum, ShowMessage } from './tools/enum'
 
 // 配置动态Tag
@@ -31,7 +31,7 @@ const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthenticati
       }
       catch (error) {
         // 切换到登录页
-        await uni.reLaunch({ url: LOGIN_PAGE })
+        toLoginPage({ mode: 'reLaunch' })
         throw error
       }
     },

+ 3 - 3
src/http/http.ts

@@ -1,9 +1,9 @@
 import type { IDoubleTokenRes } from '@/api/types/login'
 import type { CustomRequestOptions, IResponse } from '@/http/types'
 import { nextTick } from 'vue'
-import { LOGIN_PAGE } from '@/router/config'
 import { useTokenStore } from '@/store/token'
 import { isDoubleTokenMode } from '@/utils'
+import { toLoginPage } from '@/utils/toLoginPage'
 import { ResultEnum } from './tools/enum'
 
 // 刷新 token 状态管理
@@ -32,7 +32,7 @@ export function http<T>(options: CustomRequestOptions) {
           if (!isDoubleTokenMode) {
             // 未启用双token策略,清理用户信息,跳转到登录页
             tokenStore.logout()
-            uni.navigateTo({ url: LOGIN_PAGE })
+            toLoginPage()
             return reject(res)
           }
 
@@ -80,7 +80,7 @@ export function http<T>(options: CustomRequestOptions) {
               await tokenStore.logout()
               // 跳转到登录页
               setTimeout(() => {
-                uni.navigateTo({ url: LOGIN_PAGE })
+                toLoginPage()
               }, 2000)
             }
             finally {

+ 6 - 5
src/router/interceptor.ts

@@ -7,6 +7,7 @@ import { isMp } from '@uni-helper/uni-env'
 import { useTokenStore } from '@/store/token'
 import { isPageTabbar, tabbarStore } from '@/tabbar/store'
 import { getAllPages, getLastPage, HOME_PAGE, parseUrlToObj } from '@/utils/index'
+import { toLoginPage } from '@/utils/toLoginPage'
 import { EXCLUDE_LOGIN_PATH_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_ENABLE_IN_MP, NOT_FOUND_PAGE } from './config'
 
 export const FG_LOG_ENABLE = false
@@ -83,7 +84,7 @@ export const navigateToInterceptor = {
     if (Object.keys(myQuery).length) {
       fullPath += `?${Object.keys(myQuery).map(key => `${key}=${myQuery[key]}`).join('&')}`
     }
-    const redirectUrl = `${LOGIN_PAGE}?redirect=${encodeURIComponent(fullPath)}`
+    const redirectQuery = `?redirect=${encodeURIComponent(fullPath)}`
 
     // #region 1/2 默认需要登录的情况(白名单策略) ---------------------------
     if (isNeedLoginMode) {
@@ -96,8 +97,8 @@ export const navigateToInterceptor = {
         if (path === LOGIN_PAGE) {
           return true // 明确表示允许路由继续执行
         }
-        FG_LOG_ENABLE && console.log('1 isNeedLogin(白名单策略) redirectUrl:', redirectUrl)
-        uni.navigateTo({ url: redirectUrl })
+        FG_LOG_ENABLE && console.log('1 isNeedLogin(白名单策略) url:', fullPath)
+        toLoginPage({ queryString: redirectQuery })
         return false // 明确表示阻止原路由继续执行
       }
     }
@@ -107,8 +108,8 @@ export const navigateToInterceptor = {
     else {
       // 不需要登录里面的 EXCLUDE_LOGIN_PATH_LIST 表示黑名单,需要重定向到登录页
       if (judgeIsExcludePath(path)) {
-        FG_LOG_ENABLE && console.log('2 isNeedLogin(黑名单策略) redirectUrl:', redirectUrl)
-        uni.navigateTo({ url: redirectUrl })
+        FG_LOG_ENABLE && console.log('2 isNeedLogin(黑名单策略) url:', fullPath)
+        toLoginPage({ queryString: redirectQuery })
         return false // 修改为false,阻止原路由继续执行
       }
       return true // 明确表示允许路由继续执行