import axios, { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig } from 'axios'; import { message } from 'antd'; // 创建 axios 实例 const http: AxiosInstance = axios.create({ baseURL: '/api', // 根据实际后端 API 路径调整 timeout: 10000, headers: { 'Content-Type': 'application/json', }, }); // 请求拦截器 http.interceptors.request.use( (config: InternalAxiosRequestConfig) => { // 从 localStorage 获取 token const token = localStorage.getItem('token'); if (token && config.headers) { // 将 token 添加到请求头 config.headers['Authorization'] = `Bearer ${token}`; } return config; }, (error: AxiosError) => { return Promise.reject(error); } ); // 响应拦截器 http.interceptors.response.use( (response: AxiosResponse) => { // 处理成功响应 const { data } = response; // 如果后端规范定义了 code,可以在这里统一处理 // if (data.code !== 200) { // message.error(data.message || '请求失败'); // return Promise.reject(new Error(data.message || 'Error')); // } return data; }, (error: AxiosError) => { // 处理错误响应 if (error.response) { switch (error.response.status) { case 401: // 未授权,清除本地信息并跳转到登录页 localStorage.removeItem('token'); localStorage.removeItem('isAuthenticated'); localStorage.removeItem('user'); window.location.href = '/login'; message.error('会话已过期,请重新登录'); break; case 403: message.error('拒绝访问:权限不足'); break; case 404: message.error('资源不存在'); break; case 500: message.error('服务器内部错误'); break; default: message.error(error.message || '网络错误'); } } else { message.error('连接服务器失败'); } return Promise.reject(error); } ); export default http;