72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
import axios from 'axios'
|
|
import { ElMessage } from 'element-plus'
|
|
import { getToken, clearAuth } from '@/utils/auth'
|
|
|
|
// 创建 axios 实例
|
|
const request = axios.create({
|
|
baseURL: '/api',
|
|
timeout: 10000
|
|
})
|
|
|
|
// 请求拦截器
|
|
request.interceptors.request.use(
|
|
config => {
|
|
const token = getToken()
|
|
const url = config.url || ''
|
|
if (token && !url.includes('/auth/login')) {
|
|
config.headers.Authorization = `Bearer ${token}`
|
|
}
|
|
return config
|
|
},
|
|
error => {
|
|
console.error('请求错误:', error)
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
// 响应拦截器
|
|
request.interceptors.response.use(
|
|
response => {
|
|
const res = response.data
|
|
|
|
// 如果响应码为 0,表示错误(可由调用方自行提示,如推送进度弹窗)
|
|
if (res.code === 0) {
|
|
if (!response.config.skipErrorToast) {
|
|
ElMessage.error(res.msg || '请求失败')
|
|
}
|
|
const err = new Error(res.msg || '请求失败')
|
|
err.responseData = res
|
|
return Promise.reject(err)
|
|
}
|
|
|
|
return res
|
|
},
|
|
error => {
|
|
const status = error.response?.status
|
|
if (status === 401) {
|
|
clearAuth()
|
|
const detail = error.response?.data?.detail
|
|
if (detail) {
|
|
ElMessage.warning(typeof detail === 'string' ? detail : '登录已失效')
|
|
}
|
|
const path = window.location.pathname || ''
|
|
if (!path.startsWith('/login')) {
|
|
window.location.assign(
|
|
`/login?redirect=${encodeURIComponent(path + (window.location.search || ''))}`
|
|
)
|
|
}
|
|
return Promise.reject(error)
|
|
}
|
|
if (status === 403) {
|
|
const detail = error.response?.data?.detail
|
|
ElMessage.warning(typeof detail === 'string' ? detail : '无权限执行此操作')
|
|
return Promise.reject(error)
|
|
}
|
|
console.error('响应错误:', error)
|
|
ElMessage.error(error.message || '网络错误')
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
export default request
|