import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' import { ElMessage } from 'element-plus' // 创建 axios 实例 const service: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || '/api', timeout: 30000 }) // 请求拦截器 service.interceptors.request.use( (config) => { // 从 localStorage 获取 token const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = `Bearer ${token}` } return config }, (error) => { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const res = response.data // 根据后端约定的状态码判断 if (res.code !== 200 && res.code !== 0) { ElMessage.error(res.msg || res.message || '请求失败') // 401 未登录或 token 过期 if (res.code === 401) { localStorage.removeItem('token') window.location.href = '/login' } return Promise.reject(new Error(res.msg || '请求失败')) } return res }, (error) => { const message = error.response?.data?.msg || error.message || '网络错误' ElMessage.error(message) return Promise.reject(error) } ) // 封装请求方法 export const request = { get(url: string, params?: any, config?: AxiosRequestConfig): Promise { return service.get(url, { params, ...config }) }, post(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.post(url, data, config) }, put(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.put(url, data, config) }, delete(url: string, params?: any, config?: AxiosRequestConfig): Promise { return service.delete(url, { params, ...config }) } } export default service