import axios from "axios"; import { authToken } from "@/store/index.js" import { MessagePlugin } from "tdesign-vue-next" import router from "@/router/index.js" function get_api_url() { if (import.meta.env.MODE === 'development' || (import.meta.env.MODE === 'production' && window.location.host.indexOf('localhost') > -1)) { return import.meta.env.VITE_API_BASEURL } return 'http://' + window.location.host + '/api' } const instance = axios.create({ baseURL: get_api_url(), headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) instance.interceptors.request.use( config => { const token = authToken.access if (token) { config.headers['Authorization'] = `Bearer ${token}` } config._err_i = config._err_i !== false; // 默认 true return config; }, error => { MessagePlugin.error(error.message) return Promise.reject(error); } ) instance.interceptors.response.use( response => { return response.data }, error => { let err_msg = "请求错误"; if (error.response) { const status = error.response.status; const url = error.config?.url || ''; switch (status) { case 401: if (authToken.access) { authToken.access = null } if (authToken.refresh) { authToken.refresh = null } if (!url.includes('/login')) { // 避免重复跳转 if (!window.location.pathname.includes('/login')) { router.replace('/login'); } } break; default: err_msg = error.response?.data?.err_msg || "内部错误" } } else if (error.request) { err_msg = '网络连接失败,请检查网络'; } if (error.config._err_i) { MessagePlugin.error(err_msg); } return Promise.reject(error) } ) const http = { get: (url, params={}, err_i=true) => instance.get(url, { params, err_i }), post: (url, data={}, err_i=true) => instance.post(url, data, err_i), put: (url, data={}, err_i=true) => instance.put(url, data, err_i), delete: (url, err_i=true) => instance.delete(url, err_i), postForm: (url, data, onProgress=null, err_i=true) => instance.post(url, data, { headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: onProgress, err_i}) }; export default http;