import axios from "axios"; import { ElMessage } from "element-plus"; import { useUserStore } from "@/store/user"; import router from "@/router"; let hasShown401 = false; const axiosInstance = axios.create({ // baseURL: "http://127.0.0.1:8084/api", baseURL: process.env.PUBLIC_API_BASE_URL, timeout: 30000, }); axiosInstance.interceptors.request.use( (config) => { const userStore = useUserStore(); const token = userStore.userInfo.token; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error), ); axiosInstance.interceptors.response.use( (response) => { const resData = response.data; resData.success = resData.code === 200; if (resData.code === 401) { if (!hasShown401) { hasShown401 = true; const userStore = useUserStore(); ElMessage.warning("登录已过期,请重新登录"); userStore.resetUserInfo(); router.replace("/login"); } } else if (resData.code === 500) { // 系统异常 ElMessage.error(resData.message || "系统异常,请稍后再试"); } else if (resData.code === 1000) { // 业务异常 ElMessage.error(resData.message || "业务异常,请稍后再试"); } return response; }, (error) => { let message = "请求失败"; if (error.code === "ECONNABORTED") { message = "请求超时,请稍后重试"; } else if (error.message === "Network Error") { message = "网络异常,请检查网络连接"; } else if (error.response) { const status = error.response.status; switch (status) { case 400: message = "请求参数错误"; break; case 404: message = "请求接口不存在"; break; case 500: message = "服务器异常"; break; default: message = error.response.data?.msg || `请求失败 (${status})`; } } // ElMessage.error(message); return Promise.reject(error); }, ); /** * 通用 API 响应类型 * @template T * @typedef {Object} ApiResponse * @property {boolean} success - 请求是否成功 * @property {number} code - 状态码 * @property {string} message - 消息 * @property {T} data - 数据 */ /** * 通用 HTTP POST 请求 * @template T * @param {string} url * @param {any} data * @param {any} config * @returns {Promise>} */ export function httpPost(url, data, config) { return axiosInstance .post(url, data, { headers: { "Content-Type": "application/json", }, ...config, }) .then((res) => res.data); } export function reset401Flag() { hasShown401 = false; } export default axiosInstance;