81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
|
||
import envConfig from '../../env';
|
||
import Cookies from 'js-cookie';
|
||
import { message } from 'antd';
|
||
|
||
const API_BASE_URL = envConfig.baseURL;
|
||
|
||
const api = axios.create({
|
||
baseURL: API_BASE_URL,
|
||
timeout: 50000,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
withCredentials: true,
|
||
});
|
||
|
||
// 请求拦截器
|
||
api.interceptors.request.use(
|
||
(config: InternalAxiosRequestConfig) => {
|
||
const token = localStorage.getItem('token');
|
||
if (token && config.headers) {
|
||
config.headers['Authorization'] = `Bearer ${token}`;
|
||
}
|
||
return config;
|
||
},
|
||
(error: AxiosError) => {
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
// 响应拦截器(处理 401 + 网络错误 + 服务挂了)
|
||
api.interceptors.response.use(
|
||
(response) => {
|
||
return response.data;
|
||
},
|
||
async (error: AxiosError) => {
|
||
// ==============================================
|
||
// 👇 这里处理:服务挂了 / 断网 / 请求失败 / 500
|
||
// ==============================================
|
||
if (!error.response) {
|
||
message.error('服务异常或网络断开,即将重新登录');
|
||
localStorage.clear();
|
||
Cookies.remove('userId');
|
||
Cookies.remove('Admin-Token');
|
||
|
||
// 动态加载 store 避免循环引用
|
||
const store = await import('../store');
|
||
const { logout } = await import('../store/userSlice');
|
||
store.default.dispatch(logout());
|
||
|
||
setTimeout(() => {
|
||
window.location.href = '/login';
|
||
}, 800);
|
||
return Promise.reject(error);
|
||
}
|
||
|
||
// ==============================================
|
||
// 👇 这里处理:401 未授权 / token 过期
|
||
// ==============================================
|
||
if (error.response.status === 401) {
|
||
localStorage.clear();
|
||
Cookies.remove('userId');
|
||
Cookies.remove('Admin-Token');
|
||
|
||
const store = await import('../store');
|
||
const { logout } = await import('../store/userSlice');
|
||
store.default.dispatch(logout());
|
||
|
||
message.error('登录已过期,请重新登录');
|
||
setTimeout(() => {
|
||
window.location.href = '/login';
|
||
}, 800);
|
||
}
|
||
|
||
// 其他错误(500等)不跳转,只返回错误
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
export default api;
|