import axios from 'axios' // 引入axios import { ElMessage, ElMessageBox } from 'element-plus' import { store } from '@/store' import { emitter } from '@/utils/bus.js' const service = axios.create({ baseURL: import.meta.env.VITE_BASE_API, timeout: 99999 }) let acitveAxios = 0 let timer const showLoading = () => { acitveAxios++ if (timer) { clearTimeout(timer) } timer = setTimeout(() => { if (acitveAxios > 0) { emitter.emit('showLoading') } }, 400) } const closeLoading = () => { acitveAxios-- if (acitveAxios <= 0) { clearTimeout(timer) emitter.emit('closeLoading') } } // http request 拦截器 service.interceptors.request.use( config => { if (!config.donNotShowLoading) { showLoading() } const token = store.getters['user/token'] const user = store.getters['user/userInfo'] config.data = JSON.stringify(config.data) config.headers = { 'Content-Type': 'application/json', 'x-token': token, 'x-user-id': user.ID } return config }, error => { closeLoading() ElMessage({ showClose: true, message: error, type: 'error' }) return error } ) // http response 拦截器 service.interceptors.response.use( response => { closeLoading() if (response.headers['new-token']) { store.commit('user/setToken', response.headers['new-token']) } if (response.data.code === 0 || response.headers.success === 'true') { if (response.headers.msg) { response.data.msg = decodeURI(response.headers.msg) } return response.data } else { ElMessage({ showClose: true, message: response.data.msg||decodeURI(response.headers.msg), type: 'error' }) if (response.data.data && response.data.data.reload) { store.commit('user/LoginOut') } return response.data.msg ? response.data : response } }, error => { closeLoading() switch (error.response.status) { case 500: ElMessageBox.confirm(`

检测到接口错误${error}

错误码 500 :此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存

`, '接口报错', { dangerouslyUseHTMLString: true, distinguishCancelAndClose: true, confirmButtonText: '清理缓存', cancelButtonText: '取消' }) .then(() => { store.commit('user/LoginOut') }) break case 404: ElMessageBox.confirm(`

检测到接口错误${error}

错误码 404 :此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格

`, '接口报错', { dangerouslyUseHTMLString: true, distinguishCancelAndClose: true, confirmButtonText: '我知道了', cancelButtonText: '取消' }) break } return error } ) export default service