/** * Axios 基础配置 */ import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios' import { message } from 'ant-design-vue' import type { ApiResponse } from '@/types' // 创建axios实例 const service: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || '/api', timeout: 30000, headers: { 'Content-Type': 'application/json' } }) // 请求拦截器 service.interceptors.request.use( (config: InternalAxiosRequestConfig) => { // 从localStorage获取token const token = localStorage.getItem('token') if (token && config.headers) { config.headers.Authorization = `Bearer ${token}` } return config }, (error) => { console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const res = response.data // 根据业务状态码判断请求是否成功 if (res.code === 200 || res.success) { return response } // 处理业务错误 message.error(res.message || '请求失败') // 处理特定错误码 if (res.code === 401) { // token过期或未授权,跳转登录 localStorage.removeItem('token') window.location.href = '/login' } return Promise.reject(new Error(res.message || '请求失败')) }, (error) => { console.error('响应错误:', error) // 处理HTTP错误 let errorMessage = '网络错误,请稍后重试' if (error.response) { const { status } = error.response switch (status) { case 400: errorMessage = '请求参数错误' break case 401: errorMessage = '未授权,请重新登录' localStorage.removeItem('token') window.location.href = '/login' break case 403: errorMessage = '拒绝访问' break case 404: errorMessage = '请求资源不存在' break case 500: errorMessage = '服务器内部错误' break default: errorMessage = `请求失败(${status})` } } else if (error.code === 'ECONNABORTED') { errorMessage = '请求超时,请稍后重试' } message.error(errorMessage) return Promise.reject(error) } ) // 封装请求方法 export const request = { get(url: string, config?: AxiosRequestConfig): Promise>> { return service.get(url, config) }, post(url: string, data?: unknown, config?: AxiosRequestConfig): Promise>> { return service.post(url, data, config) }, put(url: string, data?: unknown, config?: AxiosRequestConfig): Promise>> { return service.put(url, data, config) }, delete(url: string, config?: AxiosRequestConfig): Promise>> { return service.delete(url, config) } } export default service