import axios from 'axios' import type { AxiosError, AxiosResponse } from 'axios' import { message as Message } from 'ant-design-vue' import qs from 'qs' import NProgress from 'nprogress' import 'nprogress/nprogress.css' import { redirectLogin } from '../../utils/utils' import type { ApiResponse } from '../../utils/utils' import { env } from './env' const axiosInstance = axios.create({ baseURL: env.apiBaseUrl, withCredentials: true, timeout: 30000, paramsSerializer: (params) => { return qs.stringify(params, { arrayFormat: 'repeat' }) }, }) const axiosRestInstance = axios.create({ baseURL: env.apiBaseUrl, withCredentials: true, timeout: 30000, paramsSerializer: (params) => { return qs.stringify(params, { arrayFormat: 'repeat' }) }, }) // 配置进度条参数 NProgress.configure({ showSpinner: false, minimum: 0.2, easing: 'swing', speed: 1000, trickleSpeed: 0.2, }) // 防止多次请求进度条重复加载 let loadingNum = 0 function startLoading() { if (loadingNum === 0) NProgress.start() loadingNum++ } function endLoading() { loadingNum-- if (loadingNum <= 0) NProgress.done() } // 请求拦截 axiosInstance.interceptors.request.use( (config) => { // 加载进度条 startLoading() return config }, (error) => { return Promise.reject(error) }, ) axiosInstance.interceptors.response.use( (response: AxiosResponse) => { endLoading() const { code, message, data = {} } = response.data if (code === 0) return data Message.error(message) console.error(response) return Promise.reject(new Error(message)) }, (error: AxiosError) => { const status = error.response?.status let message = error.response?.data.message || '' switch (status) { case 401: redirectLogin() return case 403: message = `拒绝访问${message}` break case 404: message = `请求地址错误${message}` break case 500: message = `服务器故障${message}` break default: message = `网络连接故障${message}` } Message.error(message) return Promise.reject(error) }, ) // 请求拦截 axiosRestInstance.interceptors.request.use( (config) => { // 加载进度条 startLoading() return config }, (error) => { return Promise.reject(error) }, ) axiosRestInstance.interceptors.response.use( (response: AxiosResponse) => { endLoading() return response.data }, (error: AxiosError) => { const status = error.response?.status let message = error.response?.data.message || '' switch (status) { case 401: redirectLogin() return case 403: message = `拒绝访问${message}` break case 404: message = `请求地址错误${message}` break case 500: message = `服务器故障${message}` break default: message = `网络连接故障${message}` } Message.error(message) return Promise.reject(error) }, ) export { axiosInstance, axiosRestInstance }