import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios' import { getApiBaseUrl, getTimeout } from '../config' import { message } from 'antd' const apiBaseUrl = getApiBaseUrl() const timeout = getTimeout() const axiosInstance: AxiosInstance = axios.create({ baseURL: apiBaseUrl, timeout: timeout, headers: { 'Content-Type': 'application/json', }, }) axiosInstance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { const token = localStorage.getItem('token') if (token && config.headers) { config.headers.Authorization = `Bearer ${token}` } console.log(`[API Request] ${config.method?.toUpperCase()} ${config.url}`) return config }, (error) => { console.error('[API Request Error]', error) return Promise.reject(error) } ) axiosInstance.interceptors.response.use( (response: AxiosResponse) => { console.log(`[API Response] ${response.config.method?.toUpperCase()} ${response.config.url}`, response.data) return response }, (error) => { console.error('[API Response Error]', error) if (error.response) { const { status, data } = error.response switch (status) { case 401: message.error('认证失败,请重新登录') localStorage.removeItem('token') 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 || `请求失败 (${status})`) } } else if (error.request) { message.error('网络连接失败,请检查网络') } else { message.error('请求配置错误') } return Promise.reject(error) } ) export interface ApiResponse { code: number msg: string data: T } export const request = { get(url: string, config?: AxiosRequestConfig): Promise> { return axiosInstance.get(url, config).then((res) => res.data) }, post(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return axiosInstance.post(url, data, config).then((res) => res.data) }, put(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return axiosInstance.put(url, data, config).then((res) => res.data) }, delete(url: string, config?: AxiosRequestConfig): Promise> { return axiosInstance.delete(url, config).then((res) => res.data) }, patch(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return axiosInstance.patch(url, data, config).then((res) => res.data) }, } export default axiosInstance