shenwu 6 месяцев назад
Родитель
Сommit
d1a0877cd4
4 измененных файлов с 46 добавлено и 24 удалено
  1. 3 0
      src/config.ts
  2. 27 16
      src/interceptor.ts
  3. 6 2
      src/pages/my/index.tsx
  4. 10 6
      src/server/wx/login.ts

+ 3 - 0
src/config.ts

@@ -9,6 +9,7 @@ globalThis.app = {
     isLoding: false,//是否显示每次请求的加载loding弹窗
     initToken: "",//初始化toekn用于登录时使用
     token: "",//登录后的token
+    tokenValid:false,//token是否有效,有效才放行请求,否则重新登录
     appInfo: null,//初始化
     proVersion: "",
     payVersion: "",
@@ -97,6 +98,7 @@ export interface App {
     enumDictList: any
     /**小程序环境*/
     envVersion: "develop" | "trial" | "release",
+    tokenValid:boolean
 }
 export interface SetApp {
     appName?: string;//小程序名称
@@ -123,6 +125,7 @@ export interface SetApp {
     enumDictList?: any,
     /**小程序环境*/
     envVersion?: "develop" | "trial" | "release",
+    tokenValid?:boolean
 }
 // // 定义全局日志函数
 globalThis.log = app.showLog ? console.log : () => { };

+ 27 - 16
src/interceptor.ts

@@ -4,6 +4,7 @@ import { setApp } from './config';
 import bookStore from '@src/store/book'
 import { enumDictList, getRechargeTemplate } from './server/index/index';
 import indexStore from './store/index'
+import { getUserInfo } from './server/wx/login';
 export interface ResData {
     code: number,
     data: any,
@@ -26,10 +27,10 @@ const requestInterceptor = (chain) => {
     requestParams.url = requestParams.url?.match(/^http[s]?:\/\//ig) ? requestParams.url : app.apiUrl + requestParams.url
     // 是登录接口token换成inittoken
     let token = requestParams.url.match(/(\/jsCodeLogin)|(\/appComponent\/list)/ig) ? app.initToken : app.token
-    // 不存在token并且不是init和login接口关闭请求
-    if (!token && !requestParams.url.match(/(\/jsCodeLogin)|(\/loginInitialize)/ig)) {
+    //token验证未通过并且不是init和login接口关闭请求
+    if (!app.tokenValid && !requestParams.url.match(/(\/jsCodeLogin)|(\/loginInitialize)|(\/refreshUserInfo)/ig)) {
         // 打印日志或执行一些清理操作
-        console.log("Token效,取消请求,并存入待请求列表,授权后重新请求");
+        console.log("Token为验证是否有效,取消请求,并存入待请求列表,授权后重新请求");
         // 存入待请求列表
         pendingRequests.push(chain);
         // 返回一个被拒绝的Promise以中断请求
@@ -65,20 +66,28 @@ const responseInterceptor = (chain) => {
                 if (chain.requestParams.url.includes("loginInitialize")) {
                     // 存放初始token和app信息
                     setApp({ initToken: data.data.token, appInfo: data.data.appInfo, payVersion: data.data.appInfo.iosPayment })
+                    // 获取个人信息接口先验证登录是否过期,如果没过期放行接口请求,过期将token清除重新登录
+                    let userInfo = await getUserInfo()
+                    let user: any = null
+                    if (!userInfo) {
+                        setApp({ token: "" })
+                        // 登录
+                        user = await api.login()
+                    } else {
+                        console.log("验证token通过")
+                        setApp({ tokenValid: true })
+                    }
                     // 获取枚举
                     enumDictList()
-                    // 登录
-                    let user: any = await api.login()
-                    console.log("user", user)
                     // 存放user信息到本地
                     Taro.setStorageSync("userInfo", user)
                     // 获取充值模板
                     await getRechargeTemplate()
                     // 判断是否需要隐藏支付
                     if (app.system === "ios") {
-                        let iosShowPay = app?.proVersion? app?.payVersion >= app?.proVersion : false
-                        console.log("是ios",iosShowPay)
-                        setApp({iosShowPay})
+                        let iosShowPay = app?.proVersion ? app?.payVersion >= app?.proVersion : false
+                        console.log("是ios", iosShowPay)
+                        setApp({ iosShowPay })
                         // setApp({ iosShowPay: true })
                     } else {
                         setApp({ iosShowPay: true })
@@ -95,13 +104,15 @@ const responseInterceptor = (chain) => {
                 }
                 break;
             case 300:
-                log("token过期,重新登录", data)
-                setApp({ token: "" })
-                await api.loginInit(app.appId)
-                // 重新执行当前请求
-                console.log("登录后重新请求===>")
-                const newRequestParams = chain.requestParams;
-                return Taro.request(newRequestParams).then(newResponse => newResponse.data);
+                if (app.tokenValid) {
+                    log("token过期,重新登录", data)
+                    setApp({ token: "",tokenValid:false })
+                    await api.loginInit(app.appId)
+                    // 重新执行当前请求
+                    console.log("登录后重新请求===>")
+                    const newRequestParams = chain.requestParams;
+                    return Taro.request(newRequestParams).then(newResponse => newResponse.data);
+                }
             default:
                 log("未知错误", data)
                 Taro.showToast({

+ 6 - 2
src/pages/my/index.tsx

@@ -1,4 +1,4 @@
-import { useState } from 'react'
+import { useEffect, useState } from 'react'
 import Taro, { useDidHide } from '@tarojs/taro'
 import { View, Text, Image, Button, Navigator } from '@tarojs/components'
 import { observer, inject } from 'mobx-react'
@@ -7,6 +7,7 @@ import { Store } from '@src/app'
 import ModalStore from '@src/store/modalStore'
 import IosShowPay from '@src/components/pay/IosShowPay'
 import GlobalModal from '@src/components/bottomModal'
+import { setApp } from '@src/config'
 interface Props {
     store: Store;
 }
@@ -25,7 +26,10 @@ function My(props: Props) {
     useDidHide(() => {
         ModalStore.hideModal()
     });
-    console.log("个人信息:", userInfoStore)
+    // useEffect(()=>{
+    //     console.log("22222222222")
+    //     setApp({ token: "123", })//让token失效
+    // },[])
     return <View className='my'>
         <View className="userInfo">
             {/* <Image src={require('../../icon/myBack.png')} /> */}

+ 10 - 6
src/server/wx/login.ts

@@ -39,7 +39,7 @@ export function wxlogin() {
               data: { jsCode: res.code, params: app.pathParams },
             });
             if (response.code === 200) {
-              setApp({ token: response.data.token, userInfo: response.data.userInfo })//存放token
+              setApp({ token: response.data.token, userInfo: response.data.userInfo ,tokenValid:true})//存放token
               userInfoStore.setData({ userInfo: response.data.userInfo, isVip: response.data?.userInfo?.userStanding?.includes("vip") })
               resolve(response.data)
             }
@@ -62,15 +62,19 @@ export function wxlogin() {
  * 获取个人信息
  * */
 export function getUserInfo() {
-  new Promise((resolve, reject) => {
+ return new Promise((resolve, reject) => {
     Taro.request({
       url: "/app/wechatMiniappUser/refreshUserInfo",
       method: "POST",
       success: (res) => {
-        let { token, userInfo } = res?.data?.data
-        setApp({ token, userInfo })//存放token
-        userInfoStore.setData({ userInfo: userInfo, isVip: userInfo?.userStanding?.includes("vip") })
-        resolve(res?.data?.data.userInfo)
+        if (res.data.code === 200) {
+          let { token, userInfo } = res?.data?.data
+          setApp({ token, userInfo })//存放token
+          userInfoStore.setData({ userInfo: userInfo, isVip: userInfo?.userStanding?.includes("vip") })
+          resolve(res?.data?.data.userInfo)
+        }else{
+          resolve(null)
+        }
       },
       fail: (err) => {
         reject(err);