// 基础API服务 import axios from 'axios' import { ElMessage } from 'element-plus' // 创建axios实例 const api = axios.create({ baseURL: '/api', // API基础URL,使用相对路径,通过Vite代理转发 timeout: 10000, // 请求超时时间 withCredentials: true // 允许跨域请求携带凭证(如cookies) }) // 请求拦截器 api.interceptors.request.use( config => { // 从localStorage获取token let token = localStorage.getItem('token') if (token) { // 确保不重复添加Bearer前缀 if (!token.startsWith('Bearer ')) { config.headers['Authorization'] = `Bearer ${token}` } else { config.headers['Authorization'] = token } } return config }, error => { // 请求错误处理 console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 api.interceptors.response.use( response => { // 直接返回响应数据 return response.data }, error => { // 错误处理 console.error('响应错误:', error) let message = '请求失败' if (error.response) { // 服务器响应了但状态码不是2xx switch (error.response.status) { case 401: message = '未授权,请重新登录' // 可以在这里处理登出逻辑 localStorage.removeItem('token') // 跳转到登录页 window.location.href = '/login' break case 403: message = '拒绝访问' break case 404: message = '请求资源不存在' break case 500: message = '服务器错误' break default: message = error.response.data?.message || message } } else if (error.request) { // 请求已发出但没有收到响应 message = '网络错误,请检查网络连接' } // 使用Element Plus的消息组件显示错误信息 ElMessage.error(message) return Promise.reject(error) } ) export default api