import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
import { ElLoading } from "element-plus";
import { errorMsg } from '@/utils/msg'
import router from '@/router/index'
let win: any = window
let loadingCount = 0;
const startLoading = () => {
const loading = ElLoading.service({
lock: true,
text: '加载中……',
background: 'rgba(0, 0, 0, 0.7)',
})
setTimeout(() => {
loading.close()
}, 2000)
}
const endLoading = () => {
ElLoading.service().close();
};
export const showLoading = () => {
if (loadingCount === 0) {
startLoading();
}
loadingCount += 1;
};
export const hideLoading = () => {
if (loadingCount <= 0) {
return;
}
loadingCount -= 1;
if (loadingCount === 0) {
endLoading();
}
};
const request = axios.create({
baseURL: win.configs.HOST_URL,
timeout: 60 * 1000,
})
//请求拦截器
request.interceptors.request.use((config: AxiosRequestConfig) => {
showLoading();
if (config.headers) {
config.headers.Authorization = localStorage.getItem('token') || ''
}
return config
}, (error: any) => {
hideLoading();
return Promise.reject(error)
})
//响应拦截器
request.interceptors.response.use((response: AxiosResponse) => {
hideLoading();
switch (response.data.code) {
case 10001:
errorMsg(response.data.msg)
router.push({ path: '/login' })
break;
case 200:
break;
default:
errorMsg(response.data.msg)
}
return response.data
}, (error: any) => {
hideLoading();
if (error && error.response) {
// 1.公共错误处理
// 2.根据响应码具体处理
switch (error.response.status) {
case 400:
error.message = '错误请求'
break;
case 401:
error.message = '未授权,请重新登录'
break;
case 403:
error.message = '拒绝访问'
break;
case 404:
error.message = '请求错误,未找到该资源'
window.location.href = "/NotFound"
break;
case 405:
error.message = '请求方法未允许'
break;
case 408:
error.message = '请求超时'
break;
case 500:
error.message = '服务器端出错'
break;
case 501:
error.message = '网络未实现'
break;
case 502:
error.message = '网络错误'
break;
case 503:
error.message = '服务不可用'
break;
case 504:
error.message = '网络超时'
break;
case 505:
error.message = 'http版本不支持该请求'
break;
default:
error.message = `连接错误`
}
} else {
// 超时处理
if (JSON.stringify(error).includes('timeout')) {
errorMsg('服务器响应超时,请刷新当前页')
}
error.message = '连接服务器失败'
}
errorMsg(error.message)
return Promise.reject(error)
})
export default request
vue3+axios封装
最新推荐文章于 2024-05-20 14:04:24 发布