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); } ); // 统一登出跳转方法 const handleLogoutAndRedirect = () => { localStorage.clear(); Cookies.remove('userId'); Cookies.remove('Admin-Token'); // 动态导入避免循环依赖 import('../store').then(store => { import('../store/userSlice').then(({ logout }) => { store.default.dispatch(logout()); }); }); message.error('登录已过期,请重新登录'); setTimeout(() => { window.location.href = '/login'; }, 800); }; // 响应拦截器 api.interceptors.response.use( (response: AxiosResponse) => { const data = response.data; // ============================================== // 👇 重点:如果接口返回 code = 401,直接跳转登录 // ============================================== if (data?.code == 401) { handleLogoutAndRedirect(); return Promise.reject(new Error('登录已过期')); } return data; }, async (error: AxiosError) => { // 网络异常 / 服务器挂了 if (!error.response) { message.error('服务异常或网络断开,即将重新登录'); handleLogoutAndRedirect(); return Promise.reject(error); } // HTTP 401 if (error.response.status === 401) { handleLogoutAndRedirect(); return Promise.reject(error); } return Promise.reject(error); } ); export default api;