import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios' import { ElMessage } from 'element-plus' import router from '@/router' import { getEnvConfig } from '@/config/env' // 获取环境配置 const envConfig = getEnvConfig() // 创建 axios 实例 const service: AxiosInstance = axios.create({ baseURL: envConfig.baseURL, timeout: envConfig.timeout, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) // 请求拦截器 service.interceptors.request.use( (config) => { // 从 localStorage 获取 token const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error: AxiosError) => { console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const res = response.data // 根据后端返回的状态码进行处理 // 这里假设后端返回格式为 { code: number, data: any, message: string } if (res.code !== undefined && res.code !== 200 && res.code !== 0) { ElMessage.error(res.message || '请求失败') // 401: 未授权,跳转到登录页 if (res.code === 401) { localStorage.removeItem('token') router.push('/login') } return Promise.reject(new Error(res.message || '请求失败')) } return res }, (error: AxiosError) => { console.error('响应错误:', error) if (error.response) { const status = error.response.status switch (status) { case 401: ElMessage.error('未授权,请重新登录') localStorage.removeItem('token') router.push('/login') break case 403: ElMessage.error('拒绝访问') break case 404: ElMessage.error('请求的资源不存在') break case 500: ElMessage.error('服务器内部错误') break case 502: ElMessage.error('网关错误') break case 503: ElMessage.error('服务不可用') break case 504: ElMessage.error('网关超时') break default: ElMessage.error(error.message || '请求失败') } } else if (error.request) { ElMessage.error('网络错误,请检查网络连接') } else { ElMessage.error('请求配置错误') } return Promise.reject(error) } ) // 通用请求方法 export interface ResponseData { code: number data: T message: string } // GET 请求 export function get( url: string, params?: unknown, config?: AxiosRequestConfig ): Promise> { return service.get(url, { params, ...config }) } // POST 请求 export function post( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise> { return service.post(url, data, config) } // PUT 请求 export function put( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise> { return service.put(url, data, config) } // DELETE 请求 export function del( url: string, params?: unknown, config?: AxiosRequestConfig ): Promise> { return service.delete(url, { params, ...config }) } // 导出 axios 实例 export default service