Files
emall-web/src/api/request.js
2025-10-16 16:21:56 +08:00

89 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
import { showFailToast } from 'vant'
// 创建axios实例
const api = axios.create({
baseURL: process.env.VUE_APP_API_BASE_URL || 'http://localhost:3000/api/v1',
timeout: 10000,
headers: {
'Content-Type': 'application/json'
}
})
// 请求拦截器
api.interceptors.request.use(
config => {
// 从localStorage获取token
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
return Promise.reject(error)
}
)
// 响应拦截器
api.interceptors.response.use(
response => {
const res = response.data
// 如果响应中的success不是true则判断为错误
if (res.success !== true) {
showFailToast(res.message || '请求失败')
// 401: 未登录或token过期
// 403: 权限不足
if (res.code === 401 || res.code === 403) {
// 清除用户信息并跳转到登录页
localStorage.removeItem('token')
localStorage.removeItem('refreshToken')
localStorage.removeItem('userInfo')
// 如果不在登录页,则跳转到登录页
if (window.location.hash !== '#/login') {
window.location.href = '#/login'
}
}
return Promise.reject(new Error(res.message || '请求失败'))
} else {
return res
}
},
error => {
console.error('请求错误:', error)
let message = '网络错误'
if (error.response) {
switch (error.response.status) {
case 400:
message = '请求参数错误'
break
case 401:
message = '未授权,请登录'
break
case 403:
message = '拒绝访问'
break
case 404:
message = '请求地址不存在'
break
case 500:
message = '服务器内部错误'
break
default:
message = `连接错误${error.response.status}`
}
} else if (error.request) {
message = '网络连接失败'
}
showFailToast(message)
return Promise.reject(error)
}
)
export default api