import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; import { message } from 'ant-design-vue'; // 创建axios实例 const request: AxiosInstance = axios.create({ baseURL: '/api/v1', // 使用 /api/v1,代理会保留完整路径 timeout: 30000, headers: { 'Content-Type': 'application/json', }, }); // 请求拦截器 request.interceptors.request.use( (config) => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { return Promise.reject(error); } ); // 响应拦截器 request.interceptors.response.use( (response: AxiosResponse) => { const { data } = response; // 如果是标准响应格式 { code, message, data },返回 data 字段 if (typeof data === 'object' && data !== null && 'code' in data && 'data' in data) { return data.data; } // 否则直接返回响应数据 return data; }, (error) => { const { response } = error; if (response) { const { status, data } = response; switch (status) { case 401: message.error('登录已过期,请重新登录'); localStorage.removeItem('token'); localStorage.removeItem('user'); localStorage.removeItem('role'); localStorage.removeItem('name'); window.location.href = '/login'; break; case 403: message.error('没有权限访问'); break; case 404: message.error('请求的资源不存在'); break; case 500: message.error('服务器错误'); break; default: message.error(data?.message || '请求失败'); } } else if (error.code === 'ECONNABORTED') { message.error('请求超时'); } else { message.error('网络错误'); } return Promise.reject(error); } ); // 导出请求方法 export default request; // 通用请求方法 export const http = { get(url: string, config?: AxiosRequestConfig): Promise { return request.get(url, config); }, post(url: string, data?: any, config?: AxiosRequestConfig): Promise { return request.post(url, data, config); }, put(url: string, data?: any, config?: AxiosRequestConfig): Promise { return request.put(url, data, config); }, delete(url: string, config?: AxiosRequestConfig): Promise { return request.delete(url, config); }, patch(url: string, data?: any, config?: AxiosRequestConfig): Promise { return request.patch(url, data, config); }, };