import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios' import { ElMessage } from 'element-plus' /** * 后端统一响应格式 * code === 0 表示成功,data 为业务数据 */ export interface ApiResult { code: number message?: string data: T } const service: AxiosInstance = axios.create({ // 统一走相对路径,由 Vite 代理转发到 http://localhost:7861 baseURL: '/api', timeout: 30000, }) // 安装 mock adapter(拦截所有 axios 请求返回 mock 数据,方便前端独立开发调试) import { installMockAdapter } from '@/mock/adapter' installMockAdapter(service) // 请求拦截器 service.interceptors.request.use( (config) => config, (error) => Promise.reject(error), ) // 响应拦截器:统一解包 { code, data, message } service.interceptors.response.use( (response) => { const res = response.data as ApiResult // 二进制流等非 JSON 响应直接返回 if (response.config.responseType === 'blob' || response.config.responseType === 'arraybuffer') { return response } if (res.code === 0) { return res.data } // 业务错误 const message = res.message || '请求失败' ElMessage.error(message) return Promise.reject(new Error(message)) }, (error) => { const message = error.response?.data?.message || error.message || '网络异常' ElMessage.error(message) return Promise.reject(error) }, ) /** GET 请求,返回已解包的 data */ export function get(url: string, params?: any, config?: AxiosRequestConfig): Promise { return service.get(url, { params, ...config }) as unknown as Promise } /** POST 请求 */ export function post(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.post(url, data, config) as unknown as Promise } /** PUT 请求 */ export function put(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.put(url, data, config) as unknown as Promise } /** DELETE 请求 */ export function del(url: string, params?: any, config?: AxiosRequestConfig): Promise { return service.delete(url, { params, ...config }) as unknown as Promise } export default service