128 lines
3.2 KiB
JavaScript
Raw Normal View History

2025-01-23 01:10:59 +00:00
import axios from 'axios';
import { ElNotification } from 'element-plus';
import router from '@/router';
import { isEmpty } from '@/utils';
import { useUserStore } from '@/store/modules/user';
const { VITE_APP_BASE_API, VITE_APP_UPLOAD_API, VITE_APP_DICDATA_API } = import.meta.env;
2025-01-23 01:10:59 +00:00
/**
* 创建axios实例
*/
const publicAxios = axios.create({
baseURL: VITE_APP_BASE_API, // API请求的默认前缀
2025-06-05 17:40:58 +08:00
timeout: 10000, // 10秒超时
2025-01-23 01:10:59 +00:00
});
/**
* 异常拦截处理器
* @param error
* @returns
*/
const errorHandler = async (error) => {
2025-06-05 17:40:58 +08:00
const { response, code, message } = error;
2025-01-23 01:10:59 +00:00
const UserStore = useUserStore();
2025-06-05 17:40:58 +08:00
// 1. 处理超时错误
2025-06-08 20:18:35 +08:00
if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
ElNotification.error({
message: '请求超时',
description: '请检查网络或稍后重试',
});
2025-06-05 17:40:58 +08:00
return Promise.reject({ code: 'TIMEOUT', message: '请求超时' });
}
// 2. 处理HTTP状态码错误
2025-01-23 01:10:59 +00:00
if (response && response.status) {
switch (response.status) {
case 401:
await UserStore.logout();
router.push('/login');
break;
default:
break;
}
}
2025-06-05 17:40:58 +08:00
// 3. 其他错误传递到业务层
2025-01-23 01:10:59 +00:00
return Promise.reject(error?.response?.data);
};
/**
* 请求拦截器
*/
publicAxios.interceptors.request.use(async (config) => {
const UserStore = useUserStore();
2025-02-10 05:54:41 +00:00
switch (config.apisType) {
case 'upload': {
config.baseURL = VITE_APP_UPLOAD_API;
config.headers['Content-Type'] = config.uploadType;
break;
}
default: {
config.baseURL = VITE_APP_BASE_API;
}
}
2025-01-23 01:10:59 +00:00
if (UserStore.hasToken()) {
2025-02-10 05:54:41 +00:00
config.headers['authorization'] = config.headers['authorization'] ?? UserStore.token;
2025-01-23 01:10:59 +00:00
config.headers['cache-control'] = 'no-cache';
config.headers.Pragma = 'no-cache';
}
if (config.method === 'POST' || config.method === 'DELETE') {
config.headers.Accept = 'application/json';
}
return config;
}, errorHandler);
/**
* 返回结果处理
* @param res
* @returns
*/
2025-02-27 14:57:30 +08:00
const formatResult = async (res) => {
2025-01-23 01:10:59 +00:00
const code = res.data.code || res.status;
2025-02-27 14:57:30 +08:00
// console.info('formatResult', code)
const UserStore = useUserStore();
2025-01-23 01:10:59 +00:00
switch (code) {
case 200:
case 0:
// code === 0 或 200 代表没有错误
return res.data || res.data.data || res;
case 500:
case 1:
// code === 1 或 500 代表存在错误
2025-02-10 05:54:41 +00:00
ElNotification.error(res.data.msg);
2025-01-23 01:10:59 +00:00
break;
2025-02-27 14:57:30 +08:00
case 401:
// code === 401 代表登录过期
await UserStore.logout();
router.push('/login');
break;
2025-01-23 01:10:59 +00:00
default:
2025-02-10 05:54:41 +00:00
ElNotification.error(res.data.msg);
2025-01-23 01:10:59 +00:00
break;
}
};
/**
* 响应拦截器
*/
2025-06-05 17:40:58 +08:00
publicAxios.interceptors.response.use(
(response) => {
const { config } = response;
if (config?.responseType) {
return response;
}
const token = response?.headers['authorization'];
if (!isEmpty(token)) {
const UserStore = useUserStore();
UserStore.setToken(token);
}
const result = formatResult(response);
if (result) {
return result;
}
throw new Error(response.data.msg);
},
(error) => {
2025-06-08 20:18:35 +08:00
// 处理错误
2025-06-05 17:40:58 +08:00
return errorHandler(error);
2025-01-23 01:10:59 +00:00
}
2025-06-05 17:40:58 +08:00
);
2025-01-23 01:10:59 +00:00
export default publicAxios;