| | |
| | | ? BASE.API_DEV.manager |
| | | : BASE.API_PROD.manager) + BASE.PREFIX; |
| | | // 文件上传接口 |
| | | export const uploadFile = commonUrl + "/common/common/upload/file"; |
| | | export const uploadFile = commonUrl + "/common/lmk/file/upload"; |
| | | |
| | | |
| | | const service = axios.create({ |
| | | timeout: 8000, |
| | | 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, |
| | |
| | | } |
| | | switch (data.code) { |
| | | case 400: |
| | | if (data.message !== null) { |
| | | Message.error(data.message); |
| | | if (data.msg !== null) { |
| | | Message.error(data.msg); |
| | | } else { |
| | | Message.error("系统异常"); |
| | | } |
| | |
| | | Cookies.set("userInfoManager", ""); |
| | | setStore("accessToken", ""); |
| | | if (router.history.current.name != "login") { |
| | | if (data.message !== null) { |
| | | Message.error(data.message); |
| | | if (data.msg !== null) { |
| | | Message.error(data.msg); |
| | | } else { |
| | | Message.error("未知错误,请重新登录"); |
| | | } |
| | |
| | | break; |
| | | case 500: |
| | | // 系统异常 |
| | | if (data.message !== null) { |
| | | Message.error(data.message); |
| | | if (data.msg !== null) { |
| | | Message.error(data.msg); |
| | | } else { |
| | | Message.error("系统异常"); |
| | | } |
| | |
| | | } 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 { |
| | | // 其他错误处理 |
| | |
| | | // 原始的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); |
| | | } |
| | | }); |
| | | }; |
| | | } |
| | |
| | | }); |
| | | }; |
| | | |
| | | export const uploadFileByLmk = (params) =>{ |
| | | return service({ |
| | | url: "/common/upload/file", |
| | | method: "POST", |
| | | headers:{'Content-Type': 'multipart/form-data'}, |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * 无需token验证的请求 避免旧token过期导致请求失败 |
| | | * @param {*} url |