import axios from 'axios' import { showToast } from 'vant' import { useAuthStore } from '@/stores/auth' import router from '@/router' // 创建 axios 实例 const request = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 30000, headers: { 'Content-Type': 'application/json' } }) // 请求拦截器 request.interceptors.request.use( config => { // 添加 token 认证信息 const authStore = useAuthStore() if (authStore.token) { config.headers.Authorization = `Bearer ${authStore.token}` } return config }, error => { console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 request.interceptors.response.use( response => { const { data } = response // 统一处理业务错误 if (data.success === false) { showToast(data.message || '请求失败') return Promise.reject(new Error(data.message || '请求失败')) } return data }, error => { console.error('响应错误:', error) // 统一处理 HTTP 错误 if (error.response) { const { status, data } = error.response let message = '请求失败' switch (status) { case 400: message = data?.message || '请求参数错误' break case 401: message = '未授权,请重新登录' // 清除登录状态并跳转到登录页 const authStore = useAuthStore() authStore.logout() router.push({ name: 'login', query: { redirect: router.currentRoute.value.fullPath } }) break case 403: message = '拒绝访问' break case 404: message = '请求的资源不存在' break case 500: message = '服务器内部错误' break default: message = data?.message || `请求失败 (${status})` } showToast(message) } else if (error.request) { showToast('网络连接失败,请检查网络') } else { showToast(error.message || '请求失败') } return Promise.reject(error) } ) export default request