import axios from 'axios' import { ElMessage } from 'element-plus' import { getSessionVar, clearSessionVar } from "@/utils/session"; import { useRouter } from "vue-router" const router = useRouter(); const NETWORK_ERROR = '网络错误,请稍后重试!' // 创建 axios 实例 const http = axios.create({ baseURL: '', // 设置基本 URL timeout: 60000, // 设置请求超时时间 }); // 请求拦截器 http.interceptors.request.use( (config) => { // 在发送请求之前做些什么 // console.log('请求被拦截:', config); // 例如:添加 token 到请求头 // config.headers['Authorization'] = 'Bearer your_token_here'; if (getSessionVar('session_id') != null && getSessionVar('username') != null) { config.headers.Authorization = 'Beaver ' + getSessionVar('username') + ' ' + getSessionVar('session_id'); } return config; // 必须返回 config,否则请求不会被发送 }, (error) => { // 请求错误时做些什么 ElMessage({ message: "请求错误:" + error, type: "warning" }) console.log('请求错误:', error); return Promise.reject(error); // 必须返回一个 rejected promise 否则请求会卡住 } ); // 响应拦截器 http.interceptors.response.use( (response) => { // 对响应数据做些什么,可以在此处理响应数据 const { data, code, message } = response.data if (code === 200) { return data || response.data } else { ElMessage({ message: message, type: "error" }) return Promise.reject(message) } // return response.data; // 这里直接返回 response.data,方便后续使用 }, (error) => { // 处理未登录 if (error.response.status == 401) { clearSessionVar() router.push("/login") return null } // 响应错误时做些什么,根据错误类型做相应处理 if (error.response) { // 请求已发出,服务器响应了状态码,但状态码超出了 2xx 的范围 ElMessage({ message: NETWORK_ERROR, type: "warning", plain: true, }) } else if (error.request) { // 请求已经发出,但没有收到响应 ElMessage({ message: "没有收到响应", type: "warning" }) } else if (error.code === 'ECONNABORTED') { ElMessage({ message: "请求超时,请稍后重试!", type: "warning" }) } else { // 其他错误 ElMessage({ message: error.message, type: "warning" }) } console.log('请求错误:', error.message); return Promise.reject(error); // 继续抛出错误 } ); export default http;