80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
// 基础API服务
|
||
import axios from 'axios'
|
||
import { ElMessage } from 'element-plus'
|
||
|
||
// 创建axios实例
|
||
const api = axios.create({
|
||
baseURL: '/api', // API基础URL,使用相对路径,通过Vite代理转发
|
||
timeout: 10000, // 请求超时时间
|
||
withCredentials: true // 允许跨域请求携带凭证(如cookies)
|
||
})
|
||
|
||
// 请求拦截器
|
||
api.interceptors.request.use(
|
||
config => {
|
||
// 从localStorage获取token
|
||
let token = localStorage.getItem('token')
|
||
if (token) {
|
||
// 确保不重复添加Bearer前缀
|
||
if (!token.startsWith('Bearer ')) {
|
||
config.headers['Authorization'] = `Bearer ${token}`
|
||
} else {
|
||
config.headers['Authorization'] = token
|
||
}
|
||
}
|
||
return config
|
||
},
|
||
error => {
|
||
// 请求错误处理
|
||
console.error('请求错误:', error)
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
|
||
// 响应拦截器
|
||
api.interceptors.response.use(
|
||
response => {
|
||
// 直接返回响应数据
|
||
return response.data
|
||
},
|
||
error => {
|
||
// 错误处理
|
||
console.error('响应错误:', error)
|
||
|
||
let message = '请求失败'
|
||
|
||
if (error.response) {
|
||
// 服务器响应了但状态码不是2xx
|
||
switch (error.response.status) {
|
||
case 401:
|
||
message = '未授权,请重新登录'
|
||
// 可以在这里处理登出逻辑
|
||
localStorage.removeItem('token')
|
||
// 跳转到登录页
|
||
window.location.href = '/login'
|
||
break
|
||
case 403:
|
||
message = '拒绝访问'
|
||
break
|
||
case 404:
|
||
message = '请求资源不存在'
|
||
break
|
||
case 500:
|
||
message = '服务器错误'
|
||
break
|
||
default:
|
||
message = error.response.data?.message || message
|
||
}
|
||
} else if (error.request) {
|
||
// 请求已发出但没有收到响应
|
||
message = '网络错误,请检查网络连接'
|
||
}
|
||
|
||
// 使用Element Plus的消息组件显示错误信息
|
||
ElMessage.error(message)
|
||
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
|
||
export default api |