zxl
4 天以前 6933522e3f1ffe8f8b1b7e169e2c54a7d24f0443
Merge remote-tracking branch 'origin/dev' into dev
2个文件已修改
132 ■■■■■ 已修改文件
manager/src/libs/axios.js 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/order/order/orderList.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/libs/axios.js
@@ -21,15 +21,19 @@
const service = axios.create({
  timeout: 8000,
  baseURL: managerUrl,
  headers: {
    accessToken: getStore("accessToken")
  },
  baseURL: managerUrl
  // 移除固定的accessToken设置,改在请求拦截器中动态设置
});
var isRefreshToken = 0;
const refreshToken = getTokenDebounce();
service.interceptors.request.use(
  config => {
    // 动态设置accessToken
    const accessToken = getStore("accessToken");
    if (accessToken) {
      config.headers.accessToken = accessToken;
    }
    if (config.method == "get") {
      config.params = {
        _t: Date.parse(new Date()) / 1000,
@@ -101,24 +105,34 @@
      } else if (error.response.status === 404) {
        // 避免刷新token报错
      } else if (error.response.status === 403 || error.response.data.code === 20004) {
        isRefreshToken++;
        if (isRefreshToken === 1) {
        // 改进的token刷新机制,避免竞态条件
        if (isRefreshToken === 0) {
          isRefreshToken = 1;
          const getTokenRes = await refreshToken();
          if (getTokenRes === "success") {
            // 刷新token
            if (isRefreshToken === 1) {
              error.response.config.headers.accessToken = getStore(
                "accessToken"
              );
              return service(error.response.config);
            } else {
              router.go(0);
            }
            // 刷新token成功,重新发起请求
            error.response.config.headers.accessToken = getStore("accessToken");
            isRefreshToken = 0;
            return service(error.response.config);
          } else {
            // 刷新失败,跳转到登录页
            isRefreshToken = 0;
            Cookies.set("userInfoManager", "");
            setStore("accessToken", "");
            setStore("refreshToken", "");
            router.push("/login");
          }
          isRefreshToken = 0;
        } else {
          // 如果已经有请求在刷新token,等待一小段时间后重试
          await new Promise(resolve => setTimeout(resolve, 100));
          if (isRefreshToken === 0) {
            // token刷新完成,重新发起请求
            error.response.config.headers.accessToken = getStore("accessToken");
            return service(error.response.config);
          } else {
            // 超时或其他错误,跳转到登录页
            router.push("/login");
          }
        }
      } else {
        // 其他错误处理
@@ -133,46 +147,46 @@
// 原始的axios暴露出去用即可
export default service
// 防抖闭包来一波
// 改进的防抖机制
function getTokenDebounce() {
  let lock = false;
  let success = false;
  let resolveCallbacks = []; // 存储等待的回调
  return function() {
    if (!lock) {
      lock = true;
      let oldRefreshToken = getStore("refreshToken");
      handleRefreshToken(oldRefreshToken)
        .then(res => {
          if (res.success) {
            let { accessToken, refreshToken } = res.result;
            setStore("accessToken", accessToken);
            setStore("refreshToken", refreshToken);
            success = true;
            lock = false;
          } else {
            success = false;
            lock = false;
            router.push("/login");
          }
        })
        .catch(err => {
          success = false;
          lock = false;
        });
    }
    return new Promise(resolve => {
      // 一直看lock,直到请求失败或者成功
      const timer = setInterval(() => {
        if (!lock) {
          clearInterval(timer);
          if (success) {
            resolve("success");
          } else {
            resolve("fail");
          }
        }
      }, 500); // 轮询时间间隔
      if (!lock) {
        lock = true;
        resolveCallbacks = [resolve]; // 初始化回调数组
        let oldRefreshToken = getStore("refreshToken");
        handleRefreshToken(oldRefreshToken)
          .then(res => {
            if (res.success) {
              let { accessToken, refreshToken } = res.result;
              setStore("accessToken", accessToken);
              setStore("refreshToken", refreshToken);
              success = true;
            } else {
              success = false;
              router.push("/login");
            }
          })
          .catch(err => {
            console.error('Token刷新失败:', err);
            success = false;
          })
          .finally(() => {
            lock = false;
            // 同时解决所有等待的Promise
            const result = success ? "success" : "fail";
            resolveCallbacks.forEach(callback => callback(result));
            resolveCallbacks = [];
          });
      } else {
        // 如果正在刷新,将回调加入等待队列
        resolveCallbacks.push(resolve);
      }
    });
  };
}
manager/src/views/order/order/orderList.vue
@@ -395,6 +395,7 @@
          key: "action",
          align: "center",
          width: 150,
          fixed:"right",
          render: (h, params) => {
            const buttons = [];
@@ -641,21 +642,22 @@
    deliverOrder(order) {
      console.log('------------->获取订单信息',order);
      console.log('订单sn编号',order.sn);
      // 这里可以调用相关的API进行发货操作
      // 调用发货API
      API_Order.sendMessage(order.sn).then((res) => {
        console.log('-------------->',res);
        if (res.success) {
          this.$Message.success('更新状态成功');
          this.getDataList(); // 刷新列表
          // 延迟5秒刷新列表mq消息是异步的无法实时同步需要执行延迟刷新
          setTimeout(() => {
            this.getDataList();
          }, 5000);
        } else {
          this.$Message.error('更新状态失败');
        }
      }).catch((error) => {
        console.error('更新状态失败:', error);
        this.$Message.error('更新状态失败,请重试');
      });
      // 暂时模拟操作
      this.$Message.success(`订单 ${order.sn} 更新状态成功!`);
      // 刷新列表数据
      this.getDataList();
    },
    // 导出订单
    async exportOrder() {