// src/utils/http.ts import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios' import axios from 'axios' // 可选:定义通用响应结构(根据后端约定调整) interface ApiResponse { code: number message: string data: T } const baseURL = import.meta.env.VITE_API_BASE_URL || 'http://192.168.0.129:8845/api' // 创建 axios 实例 const service: AxiosInstance = axios.create({ baseURL: baseURL, // 使用 Vite 环境变量 timeout: 10000, headers: { 'Content-Type': 'application/json', }, }) // 请求拦截器 service.interceptors.request.use( (config: InternalAxiosRequestConfig) => { // 添加 token 示例 const token = localStorage.getItem('access_token') if (token && config.headers) { config.headers.Authorization = `Bearer ${token}` } return config }, error => { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const { code, message, data } = response.data // 根据业务状态码判断 if (code === 200) { return data // 直接返回 data } else { // 业务错误(如 token 失效、权限不足等) console.error('业务错误:', message) return Promise.reject(new Error(message)) } }, error => { // 网络错误或 HTTP 状态码非 2xx if (error.response) { // 服务器返回了错误状态码 switch (error.response.status) { case 401: // 未授权,跳转登录 console.error('未授权的操作') break case 403: console.error('Forbidden') break case 500: console.error('服务器内部错误') break default: console.error('请求失败:', error.response.data) } } else if (error.request) { console.error('无响应:', error.request) } else { console.error('请求配置错误:', error.message) } return Promise.reject(error) } ) export default service