You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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