diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..a1d99e7 --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,96 @@ +import axios from "axios"; +import { AxiosCanceler } from "./axiosCanceler"; +import { ElMessageBox, ElNotification } from "element-plus"; +import { getToken, removeToken } from "./auth"; + +axios.defaults.headers['Content-Type']='application/json' + +const serveice = axios.create({ + baseURL: import.meta.env.VITE_BASE_URL, + timeout: 6000 +}) +const axiosCanceler = new AxiosCanceler() +serveice.interceptors.request.use(config=>{ + const ACCESS_TOKEN = getToken() || '' + if(ACCESS_TOKEN!==undefined && ACCESS_TOKEN!=='') { + config.headers['Authorization']=ACCESS_TOKEN + } + // 检查是否有重复请求, 有则取消掉 + axiosCanceler.removePendingRequest(config) + // 将请求加入pendingMap + axiosCanceler.addPendingRequest(config) + return config +},error=>{ + Promise.reject(error) +}) +serveice.interceptors.response.use(response=>{ + axiosCanceler.removePendingRequest(response.config) + //二进制数据直接返回 + if(response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') { + return response.data + } + return response.data +},error=>{ + let response = error.response + const status = response.status; + switch(status) { + case 401: + ElMessageBox.confirm('登录状态已过期,请重新登录','系统提示',{ + confirmButtonText: '重新登录', + cancelButtonText: '取消', + type: 'warning', + closeOnClickModal: false + }).then(()=>{ + removeToken() + window.location = '/login' + }) + return Promise.reject('会话已过期,请重新登录') + case 402: + break; + case 403: + console.log(response) + ElNotification({ + title: '系统提示', + message: response.data.msg, + type: 'warning' + }) + break; + case 404: + ElNotification({ + title: '系统提示', + message: '不存在的地址', + type: 'error' + }) + break; + case 405: + ElNotification({ + title: '系统提示', + message: '传输格式错误,请检查', + type: 'error' + }) + break; + case 511: + ElNotification({ + title: '系统提示', + message: '禁止访问', + type: 'error' + }) + removeToken() + window.location = '/forbidden' + break; + case 500: + if (response.data){ + return response.data + }else { + ElNotification({ + title: '系统提示', + message: '系统未知错误', + type: 'error' + }) + break; + } + } + return Promise.reject(error) +}) + +export default serveice