import axios from 'axios' import { ElMessage } from 'element-plus' import router from '../router' const api = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api', timeout: 30000, headers: { 'Content-Type': 'application/json', }, }) api.interceptors.request.use( (config) => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error) => Promise.reject(error), ) api.interceptors.response.use( (response) => response.data, (error) => { const message = error.response?.data?.error || error.message || 'Request failed' // 如果请求标记为静默失败,不显示任何消息 const silent = error.config?.silent if (error.response?.status === 401) { const isLoginRequest = error.config?.url?.includes('/auth/login') const isRegisterRequest = error.config?.url?.includes('/auth/register') const isPublicRequest = error.config?.url?.includes('/settings/public') || error.config?.url?.includes('/installed') || error.config?.url?.includes('/products') || error.config?.url?.includes('/categories') || error.config?.url?.includes('/brands') || error.config?.url?.includes('/banners') || error.config?.url?.includes('/articles') || error.config?.url?.includes('/lotteries') || error.config?.url?.includes('/cart') if (isLoginRequest || isRegisterRequest) { if (!silent) ElMessage.error(message) } else if (!isPublicRequest && !silent) { localStorage.removeItem('token') localStorage.removeItem('user') ElMessage.error('请先登录') router.push('/login') } // 公开接口或静默请求的 401 错误不显示消息也不跳转 } else if (!silent) { ElMessage.error(message) } return Promise.reject(error) }, ) // 扩展 axios 类型以支持 silent 选项 declare module 'axios' { interface AxiosRequestConfig { silent?: boolean } } export default api