import axios from 'axios'; import Vue from 'vue'; const ignoreResponseTransformMatch = [ '/pre_interface/V5.0/insertBasicInfo', '/pre_interface/V5.0/getPreItem', '/pre_interface/V5.0/setStatus', '/captchaImage', ]; const magicCode = [-5, -9, -8]; const shareRequest = new Map(); const http = axios.create({ baseURL: process.env.VUE_APP_BASE_API, withCredentials: true, timeout: 60 * 1000, }); http.interceptors.request.use(config => { const token = localStorage.getItem('token'); if (token) config.headers.Authorization = token; if (config['meta'] && config['meta'].share && !config.signal) { const key = config.url; let controller = shareRequest.get(key); if (controller) controller.abort(); shareRequest.set(key, controller = new AbortController()); config.signal = controller.signal; } return config; }); http.interceptors.response.use( response => { const res = response.data; // 设置 cookie if (response.headers['access-control-expose-headers']) { const cookie = response.headers['access-control-expose-headers'].split(';')[0]; if (cookie) document.cookie = cookie; } // 直接返回响应数据 try { const {url, meta = {}} = response.config; if (meta.share && shareRequest.has(url)) shareRequest.delete(url); if (ignoreResponseTransformMatch.includes(url) || meta.ignoreResponseTransform) return res; } catch (e) {} const { ResultCode = 0, ResultInfo, Data, code = ResultCode, message = ResultInfo, data = Data, } = res; if (code === 0) return {code, data, message}; try { if (magicCode.includes(code)) { Vue.prototype.$router1.replace('/'); throw message; } else if (code === 401) { const isAllow = sessionStorage.getItem('isAllow') || 'true'; if (isAllow) Vue.prototype.$router1.replace('/'); throw `登录过期,请重新登录`; } else { throw message || `错误,请重试!`; } } catch (error) { Vue.prototype.$message({ message: error, type: 'error', showClose: true, }); } return Promise.reject(new Error(message || `错误,请重试!`)); }, error => { if (error.message !== 'canceled') Vue.prototype.$message({ message: error.message, type: 'error', }); return Promise.reject(error); }, ); export default http;