import axios from 'axios' import { ElMessage } from 'element-plus' import { useUserStore } from '@/stores/user' import router from '@/router' // 创建 axios 实例 const request = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: Number(import.meta.env.VITE_API_TIMEOUT) || 15000, headers: { 'Content-Type': 'application/json' } }) // 请求拦截器 request.interceptors.request.use( (config) => { const userStore = useUserStore() // 如果有 token 则携带 if (userStore.token) { config.headers.Authorization = `Bearer ${userStore.token}` } return config }, (error) => { console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 request.interceptors.response.use( (response) => { const res = response.data // 根据后端约定的数据结构判断 // 假设后端返回格式: { code: 200, data: {...}, message: 'success' } if (res.code === 200 || res.code === 0) { return res.data } // 业务错误 ElMessage.error(res.message || '请求失败') return Promise.reject(new Error(res.message || '请求失败')) }, (error) => { const { response } = error if (response) { const { status, data } = response switch (status) { case 401: // token 过期或未登录 ElMessage.error('登录已过期,请重新登录') const userStore = useUserStore() userStore.logout() router.push({ name: 'Login', query: { redirect: router.currentRoute.value.fullPath } }) break case 403: ElMessage.error('没有权限访问该资源') break case 404: ElMessage.error('请求的资源不存在') break case 500: ElMessage.error('服务器内部错误') break default: ElMessage.error(data?.message || `请求错误 (${status})`) } } else if (error.code === 'ECONNABORTED') { ElMessage.error('请求超时,请检查网络连接') } else { ElMessage.error('网络异常,请检查网络连接') } return Promise.reject(error) } ) export default request