|  | @@ -12,7 +12,7 @@ import {
 | 
	
		
			
				|  |  |  import { stringify } from "qs";
 | 
	
		
			
				|  |  |  import NProgress from "../progress";
 | 
	
		
			
				|  |  |  // import { loadEnv } from "@build/index";
 | 
	
		
			
				|  |  | -import { getToken } from "@/utils/auth";
 | 
	
		
			
				|  |  | +import { getToken, formatToken } from "@/utils/auth";
 | 
	
		
			
				|  |  |  import { useUserStoreHook } from "@/store/modules/user";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 加载环境变量 VITE_PROXY_DOMAIN(开发环境)  VITE_PROXY_DOMAIN_REAL(打包后的线上环境)
 | 
	
	
		
			
				|  | @@ -43,27 +43,43 @@ class PureHttp {
 | 
	
		
			
				|  |  |      this.httpInterceptorsRequest();
 | 
	
		
			
				|  |  |      this.httpInterceptorsResponse();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /** token过期后,暂存待执行的请求 */
 | 
	
		
			
				|  |  | +  private static requests = [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /** 防止重复刷新token */
 | 
	
		
			
				|  |  | +  private static isRefreshing = false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    /** 初始化配置对象 */
 | 
	
		
			
				|  |  |    private static initConfig: PureHttpRequestConfig = {};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /** 保存当前Axios实例对象 */
 | 
	
		
			
				|  |  |    private static axiosInstance: AxiosInstance = Axios.create(defaultConfig);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  /** 重连原始请求 */
 | 
	
		
			
				|  |  | +  private static retryOriginalRequest(config: PureHttpRequestConfig) {
 | 
	
		
			
				|  |  | +    return new Promise(resolve => {
 | 
	
		
			
				|  |  | +      PureHttp.requests.push((token: string) => {
 | 
	
		
			
				|  |  | +        config.headers["Authorization"] = formatToken(token);
 | 
	
		
			
				|  |  | +        resolve(config);
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    /** 请求拦截 */
 | 
	
		
			
				|  |  |    private httpInterceptorsRequest(): void {
 | 
	
		
			
				|  |  |      PureHttp.axiosInstance.interceptors.request.use(
 | 
	
		
			
				|  |  |        async (config: PureHttpRequestConfig) => {
 | 
	
		
			
				|  |  | -        const $config = config;
 | 
	
		
			
				|  |  |          // 开启进度条动画
 | 
	
		
			
				|  |  |          NProgress.start();
 | 
	
		
			
				|  |  |          // 优先判断post/get等方法是否传入回掉,否则执行初始化设置等回掉
 | 
	
		
			
				|  |  |          if (typeof config.beforeRequestCallback === "function") {
 | 
	
		
			
				|  |  | -          config.beforeRequestCallback($config);
 | 
	
		
			
				|  |  | -          return $config;
 | 
	
		
			
				|  |  | +          config.beforeRequestCallback(config);
 | 
	
		
			
				|  |  | +          return config;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (PureHttp.initConfig.beforeRequestCallback) {
 | 
	
		
			
				|  |  | -          PureHttp.initConfig.beforeRequestCallback($config);
 | 
	
		
			
				|  |  | -          return $config;
 | 
	
		
			
				|  |  | +          PureHttp.initConfig.beforeRequestCallback(config);
 | 
	
		
			
				|  |  | +          return config;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          /** 请求白名单,放置一些不需要token的接口(通过设置请求白名单,防止token过期后再请求造成的死循环问题) */
 | 
	
		
			
				|  |  |          const whiteList = ["/refreshToken", "/login"];
 | 
	
	
		
			
				|  | @@ -75,21 +91,30 @@ class PureHttp {
 | 
	
		
			
				|  |  |                  const now = new Date().getTime();
 | 
	
		
			
				|  |  |                  const expired = parseInt(data.expires) - now <= 0;
 | 
	
		
			
				|  |  |                  if (expired) {
 | 
	
		
			
				|  |  | -                  // token过期刷新
 | 
	
		
			
				|  |  | -                  useUserStoreHook()
 | 
	
		
			
				|  |  | -                    .handRefreshToken({ refreshToken: data.refreshToken })
 | 
	
		
			
				|  |  | -                    .then(res => {
 | 
	
		
			
				|  |  | -                      config.headers["Authorization"] =
 | 
	
		
			
				|  |  | -                        "Bearer " + res.data.accessToken;
 | 
	
		
			
				|  |  | -                      resolve($config);
 | 
	
		
			
				|  |  | -                    });
 | 
	
		
			
				|  |  | +                  if (!PureHttp.isRefreshing) {
 | 
	
		
			
				|  |  | +                    PureHttp.isRefreshing = true;
 | 
	
		
			
				|  |  | +                    // token过期刷新
 | 
	
		
			
				|  |  | +                    useUserStoreHook()
 | 
	
		
			
				|  |  | +                      .handRefreshToken({ refreshToken: data.refreshToken })
 | 
	
		
			
				|  |  | +                      .then(res => {
 | 
	
		
			
				|  |  | +                        const token = res.data.accessToken;
 | 
	
		
			
				|  |  | +                        config.headers["Authorization"] = formatToken(token);
 | 
	
		
			
				|  |  | +                        PureHttp.requests.forEach(cb => cb(token));
 | 
	
		
			
				|  |  | +                        PureHttp.requests = [];
 | 
	
		
			
				|  |  | +                      })
 | 
	
		
			
				|  |  | +                      .finally(() => {
 | 
	
		
			
				|  |  | +                        PureHttp.isRefreshing = false;
 | 
	
		
			
				|  |  | +                      });
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  resolve(PureHttp.retryOriginalRequest(config));
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  | -                  config.headers["Authorization"] =
 | 
	
		
			
				|  |  | -                    "Bearer " + data.accessToken;
 | 
	
		
			
				|  |  | -                  resolve($config);
 | 
	
		
			
				|  |  | +                  config.headers["Authorization"] = formatToken(
 | 
	
		
			
				|  |  | +                    data.accessToken
 | 
	
		
			
				|  |  | +                  );
 | 
	
		
			
				|  |  | +                  resolve(config);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                } else {
 | 
	
		
			
				|  |  | -                resolve($config);
 | 
	
		
			
				|  |  | +                resolve(config);
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |        },
 |