import axios from 'axios' import { ElMessage } from 'element-plus' import { useLangStore } from '@/pinia/langStore' import { useAppStore } from '@/pinia/appStore' // 创建 axios 实例 const request = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 10000, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) // 请求拦截器 request.interceptors.request.use( config => { // 获取 token(假设存储在 localStorage 中) const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } const langStore = useLangStore(); config.headers['Accept-Language'] = langStore.currentLang==='en'?'en':'zh'; // 处理请求参数 if (config.method === 'get' && config.params) { // 过滤掉空值参数 // const filteredParams = {} // Object.keys(config.params).forEach(key => { // if (config.params[key] !== null && config.params[key] !== undefined && config.params[key] !== '') { // filteredParams[key] = config.params[key] // } // }) // config.params = filteredParams } // 支持 formData if (config.data instanceof FormData) { // 如果是 FormData 类型,移除默认的 Content-Type,让浏览器自动设置 delete config.headers['Content-Type'] } return config }, error => { console.error('请求错误:', error) return Promise.reject(error) } ) // 响应拦截器 request.interceptors.response.use( response => { const appStore = useAppStore(); // 根据后端约定的响应结构进行状态判断 const { code, data, msg } = response.data // 假设 code 为 200 表示成功 if (code === 200) { return response.data } else if ([410000, 410001, 410002, 401, 403].includes(code)){ appStore.LOGOUT(); localStorage.removeItem('token') //弹出登录框 appStore.showLoginDialog = true; // window.location.href = '/login' return response.data }else { ElMessage.error(msg|| '请求失败') return response.data } }, error => { console.error('响应错误:', error) // HTTP 状态码错误处理 if (error.response) { const { status, data } = error.response switch (status) { case 401: // 未授权 localStorage.removeItem('token') break case 403: // 禁止访问 console.error('禁止访问:', data.message) break case 404: // 资源不存在 console.error('请求资源不存在') break case 500: // 服务器内部错误 console.error('服务器内部错误') break default: console.error(`连接错误:${status}`) } } else if (error.request) { // 请求发出但没有收到响应 console.error('网络错误,请检查网络连接') } else { // 其他错误 console.error('请求失败:', error.message) } return Promise.reject(error) } ) /** * GET 请求 * @param {string} url 请求地址 * @param {object} params 请求参数 * @param {object} config 其他配置 */ export function get(url, params = {}, config = {}) { return request({ method: 'get', url, params, ...config }) } /** * POST 请求 * @param {string} url 请求地址 * @param {object} data 请求数据 * @param {object} config 其他配置 */ export function post(url, data = {}, config = {}) { return request({ method: 'post', url, data, ...config }) } /** * PUT 请求 * @param {string} url 请求地址 * @param {object} data 请求数据 * @param {object} config 其他配置 */ export function put(url, data = {}, config = {}) { return request({ method: 'put', url, data, ...config }) } /** * DELETE 请求 * @param {string} url 请求地址 * @param {object} params 请求参数 * @param {object} config 其他配置 */ export function del(url, params = {}, config = {}) { return request({ method: 'delete', url, params, ...config }) } export default { get, post, put, del }