import axios from "axios"; import { ElMessage } from 'element-plus' // 创建一个axios实例 const request = axios.create({ baseURL: import.meta.env.VITE_APP_API_URL, timeout:20000, //请求超时时间 20秒 }) // 对于重复的post请求,只处理第一次请求,后续重复的请求在上一次返回之前都取消 const postRequestList=new Set() // 需要储存每次请求对应的取消方法 let lastGetRequestList=new Map() // 取消方法 const removePreRequest=(Url,fun)=>{ // console.log(lastGetRequestList); if(lastGetRequestList.has(Url)){ // 取消上一次请求 lastGetRequestList.get(Url)(`${Url}---重复请求被中断`) // 设置 新的取消方法 lastGetRequestList.set(Url,fun) } } request.interceptors.request.use( config=>{ config.headers['Authorization'] = localStorage.getItem('fsms_token') || '' // 不处理get请求 if (config.method !== 'get') { // 利用axios cancelToken 先取消请求 config.cancelToken = new axios.CancelToken(e => { // 在这里取消重复请求,上个请求未完成时,相同的请求不会再次执行 postRequestList.has(config.url) ? e(`${config.url}---重复请求被中断`) : postRequestList.add(config.url) }) }else if(config.params?.takeLastRequestResult){ // 对于get请求中的参数有 takeLastRequestResult 且值为真 进行特殊处理,若重名 请不要更改这个名字 config.cancelToken = new axios.CancelToken((c)=>{ lastGetRequestList.has(config.url) ? removePreRequest(config.url,c) : lastGetRequestList.set(config.url,c) }); // 去除参数中的 takeLastRequestResult if(config.params){ config.params.takeLastRequestResult=undefined } } return config }, err=>{ console.log(err); return Promise.reject(err) } ) request.interceptors.response.use( res=>{ postRequestList.delete(`${res.config.url}`) lastGetRequestList.delete(`${res.config.url}`) if(res.request.responseType.toLowerCase()==='blob'){ // 字节流 if(res.status === 200){ return res.data } }else if(res.data.code==200){ return res.data }else if(res.data.code==4010 || res.data.code==401){ // 4010 禁用操作 401 token过期 ElMessage({ message:res.data.msg || '未知错误,请重新登录', type:'error', duration:1500 }) localStorage.removeItem('fsms_token') localStorage.removeItem('userInfo') setTimeout(()=>{ location.reload() },1500) return Promise.reject(new Error(res.data.msg ||'未知错误,请重新登录')) }else{ ElMessage({ message:(res.data && res.data.msg) ? res.data.msg : '网络异常', type:'error', duration:3*1000 }) return Promise.reject(new Error(res.data.msg ||'网络异常')) } }, err=>{ const {message} = err console.log(message,'--错误信息'); if(!err.__CANCEL__){ // 清除 postRequestList.clear() lastGetRequestList.clear() // 多次点击由CancelToken取消的请求不给错误提示 ElMessage({ message: message || '网络异常', type: 'error', duration: 3 * 1000 }) } return Promise.reject(err) } ) export default request