// src/utils/request.ts import axios from 'axios' import { ElMessage } from 'element-plus' import type { AxiosInstance, AxiosResponse } from 'axios' // 创建 axios 实例 const service: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || '', // 从环境变量中读取 timeout: 10000, // 超时时间 withCredentials: true // 是否允许携带 cookie }) // 请求拦截器 service.interceptors.request.use( (config) => { // 可在此添加 token 到 headers 中 const token = localStorage.getItem('token') if (token) { config.headers!['Authorization'] = `${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) { ElMessage({ message: res.msg || '请求失败', type: 'error', duration: 5 * 1000 }) // 特殊状态码处理,如 token 失效等 if (res.code === 401) { // 跳转登录页 window.location.href = '/' } return Promise.reject(res.msg || '请求失败') } return res }, (error) => { // 网络错误、超时等处理 const message = error.message.includes('timeout') ? '请求超时' : '网络异常' ElMessage({ message, type: 'error' }) return Promise.reject(error) } ) // 常用请求方法封装 export const http = { get(url: string, params?: any): Promise { return service.get(url, { params }) }, post(url: string, data?: any): Promise { return service.post(url, data) }, put(url: string, data?: any): Promise { return service.put(url, data) }, delete(url: string, data?: any): Promise { return service.delete(url, { data }) } } export default service