request.js 4.37 KB
import axios from "axios";
import settle from "axios/lib/core/settle";
import buildURL from "axios/lib/helpers/buildURL";
/* 格式化路径 */
axios.defaults.adapter = function (config) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      uni.showLoading({
        title: "加载中...",
      });
    }, 500);
    const request = uni.request({
      method: config.method.toUpperCase(),
      url:
        config.baseURL +
        buildURL(config.url, config.params, config.paramsSerializer),
      header: config.headers,
      data: config.data,
      dataType: config.dataType,
      responseType: config.responseType,
      sslVerify: config.sslVerify,
      complete(response) {
        clearTimeout(timer);
        uni.hideLoading();
        response = {
          data: response.data,
          status: response.statusCode,
          errMsg: response.errMsg,
          header: response.header,
          config: config,
        };
        settle(resolve, reject, response);
      },
    });
    if (config.cancelToken) {
      config.cancelToken.promise.then((cancel) => {
        if (!request) {
          return;
        }
        request.abort();
        reject(cancel);
      });
    }
  });
};


const instance = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 10000,
});
// 请求拦截器
instance.interceptors.request.use((config) => {
  if (requestUrlCheck(config.url)) {
    setRequestToken();
  }
  if (config.method.toLocaleLowerCase() == "get") {
    handleGet(config);
  }
  return config;
});
// 响应拦截器
instance.interceptors.response.use((response) => {

  // 没有网络时 message的内容为"Network Error"
  if (response.errMsg === "request:fail") {
    uni.$u.toast("网络错误~")
    return response;
  }
  if (response.data.code != 200) {
    // 对于匿名访问的页面,不处理401和403错误
    const url = response.config?.url || '';
    const isGuestAccess = url.startsWith("/order-info/order-other/webDetail/") ||
        url.startsWith("/order-info/order-driver/detail/guest/");

    if (response.data.code == 401 || response.data.code == 403) {
      if (!isGuestAccess) {
        reSetLoginStatus();
      }
    } else {
      uni.showToast({
        title: response.data.msg,
        icon: "none",
      });
    }
  }
  return response;
}, (error) => {
  // 对于匿名访问的页面,不处理401和403错误
  const url = error.config?.url || '';
  const isGuestAccess = url.startsWith("/order-info/order-other/webDetail/") ||
      url.startsWith("/order-info/order-driver/detail/guest/");

  if (error.response.status) {
    switch (error.response.status) {
      case 401:
      case 403:
        if (!isGuestAccess) {
          reSetLoginStatus();
        }
        break;
      default:
        break;
    }
  }
  return Promise.reject(error)
});
export default instance;

export function setRequestToken(token) {
  if (token) {
    instance.defaults.headers.common["Authorization"] = `${token}`;
  } else {
    delete instance.defaults.headers.common["Authorization"];
  }
}

const reSetLoginStatus = () => {
  setRequestToken();

  // uni确定是否需要跳转登录页
  uni.showModal({
    title: '提示',
    content: "请登录",
    success: function (res) {
      if (res.confirm) {
        // 重定向到登录页面

        uni.setStorageSync("cancelFlag", false);
        uni.reLaunch({
          url: "/pages/login/code",
        })

      } else if (res.cancel) {
        console.log('用户点击取消');
        // 设置本地缓存,表示已经登录
        uni.setStorageSync( "cancelFlag", true);
      }
    }
  });

  return
}
let urlRegex = /\/user\/send\/verify/;

/**
 * 检查需要被拦截的路径
 */
const requestUrlCheck = (url) => {
  // 使用正则表达式进行匹配
  return urlRegex.test(url);
}

const handleGet = (config) => {
  let strUrl = "";
  let params = config.params;
  let firstElement = true;
  for (const key in params) {
    if (firstElement) {
      firstElement = false;
      strUrl = "?" + key + "=" + params[key];
    } else {
      strUrl += "&" + key + "=" + params[key];
    }
  }
  config.url += strUrl;
  config.params = "";
  // 对于匿名访问的页面,移除Authorization头
  if (config.url.startsWith("/order-info/order-other/webDetail/") ||
      config.url.startsWith("/order-info/order-driver/detail/guest/")) {
    config.headers["Authorization"] = "";
  }
}