import axios from 'axios' import { ElMessage } from 'element-plus' import { getToken, removeToken } from './auth' import router from '@/router' const service = axios.create({ baseURL: '/api', timeout: 10000 }) service.interceptors.request.use( config => { const token = getToken() if (token) { config.headers['Authorization'] = `Bearer ${token}` } return config }, error => { return Promise.reject(error) } ) service.interceptors.response.use( response => { // 如果是文件下载(blob类型),直接返回response if (response.config.responseType === 'blob' || response.data instanceof Blob) { return response.data } const res = response.data if (res.code === 401) { removeToken() router.push('/login') ElMessage.error(res.message || '登录已过期,请重新登录') return Promise.reject(new Error(res.message || '登录已过期')) } if (res.code !== 200) { ElMessage.error(res.message || '请求失败') return Promise.reject(new Error(res.message || '请求失败')) } return res }, error => { console.error('请求错误:', error) // 处理blob类型的错误响应(可能是文件下载失败) if (error.response && error.response.data instanceof Blob) { // 异步解析blob错误信息 error.response.data.text().then(text => { try { const errorData = JSON.parse(text) ElMessage.error(errorData.message || '请求失败') } catch (e) { ElMessage.error('请求失败') } }).catch(() => { ElMessage.error('请求失败') }) return Promise.reject(error) } if (error.code === 'ECONNREFUSED' || error.message.includes('ECONNREFUSED')) { ElMessage.error('无法连接到服务器,请确保后端服务正在运行') } else if (error.response) { // 服务器返回了错误响应 const message = error.response.data?.message || error.message || '请求失败' ElMessage.error(message) } else if (error.request) { // 请求已发送但没有收到响应 ElMessage.error('服务器无响应,请检查后端服务是否正常运行') } else { ElMessage.error(error.message || '请求失败') } return Promise.reject(error) } ) export default service