import axios from 'axios'; // 获取API基础URL;开发环境可在 .env.development 留空,配合 Vite 代理访问 /platform const apiBaseURL = import.meta.env.VITE_API_BASE_URL ?? ""; // 创建axios实例(普通接口 5min;大文件上传在 api/file.js 单独更长 timeout) const service = axios.create({ baseURL: apiBaseURL, timeout: 300000, withCredentials: false // JWT 不需要 Cookie }); // 请求拦截器 service.interceptors.request.use( config => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } // 对于有 body 的请求(POST、PUT、PATCH),默认 JSON;FormData 由浏览器带 multipart boundary,不可手写 Content-Type if (config.data && ['post', 'put', 'patch'].includes(config.method?.toLowerCase())) { if (config.data instanceof FormData) { delete config.headers['Content-Type']; delete config.headers['content-type']; } else if (!config.headers['Content-Type'] && !config.headers['content-type']) { config.headers['Content-Type'] = 'application/json'; } } return config; }, error => { return Promise.reject(error); } ); // 响应拦截器 service.interceptors.response.use( response => { return response.data; }, error => { if (error.response) { switch (error.response.status) { case 401: console.error('未授权,请重新登录'); localStorage.removeItem('token'); localStorage.removeItem('userInfo'); if (window.location.hash !== '#/login') { window.location.href = '#/login'; } return Promise.reject(new Error('token无效')); case 404: console.error('请求的资源不存在'); break; default: console.error('请求失败,请稍后再试'); } } else if (error.request) { console.error('请求失败,请检查网络连接'); } else { console.error('请求配置错误'); } return Promise.reject(error); } ); export default service;