import axios from 'axios'; import { ElMessage } from 'element-plus'; import { useUserStore } from '../store/user'; import router from '../router'; const service = axios.create({ // 开发环境默认走 Vite /api 代理,生产环境可用环境变量覆盖。 baseURL: import.meta.env.VITE_API_BASE_URL || '/api', timeout: 10000, }); // 请求拦截:统一挂载 Bearer Token,避免各页面重复拼接鉴权头。 service.interceptors.request.use( (config) => { const userStore = useUserStore(); if (userStore.token) { config.headers['Authorization'] = `Bearer ${userStore.token}`; } return config; }, (error) => { return Promise.reject(error); }, ); // 响应拦截:对齐后端统一响应包裹 { code, msg, data }。 service.interceptors.response.use( (response) => { const res = response.data; // 后端成功响应统一为 code=0;这里兼容少量 code=2xx 的历史结构。 if (res.code === 0 || (res.code >= 200 && res.code < 300)) { return res.data; } else { ElMessage.error(res.msg || '请求失败'); return Promise.reject(new Error(res.msg || 'Error')); } }, (error) => { const userStore = useUserStore(); let message = error.message; if (error.response) { const { status, data } = error.response; message = data?.msg || message; if (status === 401) { // 401 统一视为登录态失效,先清理本地态再跳登录页。 userStore.logout(); router.push( `/login?redirect=${encodeURIComponent(router.currentRoute.value.fullPath)}`, ); ElMessage.error(message || '登录状态已过期,请重新登录'); return Promise.reject(new Error('Unauthorized')); } else if (status === 403) { ElMessage.error(message || '没有权限执行该操作'); } else { ElMessage.error(message || '请求失败'); } } else { ElMessage.error(message || '网络连接异常'); } return Promise.reject(error); }, ); export default service;