|
|
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
|
|
|
|