/* src/utils/request.js */ import axios from 'axios' // 如果你用了 Vant UI,可以把下面这行解开,用来弹窗提示错误 import { showToast, showFailToast } from 'vant'; import 'vant/es/toast/style'; // 1. 创建 axios 实例 const service = axios.create({ // 基础 URL,通常在 .env 文件中配置 VUE_APP_BASE_API baseURL: process.env.VUE_APP_BASE_API || '/api', // 请求超时时间 (毫秒),交易类应用建议设置短一点,比如 10秒 timeout: 10000, headers: { 'Content-Type': 'application/json;charset=utf-8' } }) // 2. 请求拦截器 (Request Interceptor) // 在发送请求之前做些什么,比如加 Token service.interceptors.request.use( config => { // 假设你的 token 存在 localStorage 里 const token = localStorage.getItem('token') if (token) { // 让每个请求携带自定义 token 请根据实际情况修改 // 例如:config.headers['Authorization'] = 'Bearer ' + token config.headers['token'] = token } return config }, error => { // 对请求错误做些什么 console.log(error) return Promise.reject(error) } ) // 3. 响应拦截器 (Response Interceptor) // 对响应数据做点什么 service.interceptors.response.use( response => { const res = response.data // 这里根据后端返回的状态码来判断请求是否成功 // 假设后端约定 code === 00000 为成功 if (res.code !== "00000") { // 如果不是 200,说明业务逻辑有错,比如“余额不足” // showFailToast(res.msg || 'Error') // 如果用了 Vant,可以用这个提示 console.error('业务报错:', res.msg) // 特殊处理:比如 401 表示 Token 过期,需要跳回登录页 if (res.code === 401) { //以此处逻辑为准:清除本地数据,强制刷新或跳转 localStorage.removeItem('token') location.reload() } return Promise.reject(new Error(res.msg || 'Error')) } else { // 成功,直接把数据剥离出来 return res.data } }, error => { console.log('网络报错' + error) // for debug let message = error.message if (message == 'Network Error') { message = '后端接口连接异常' } else if (message.includes('timeout')) { message = '系统接口请求超时' } else if (message.includes('Request failed with status code')) { message = '系统接口' + message.substr(message.length - 3) + '异常' } showFailToast(message) return Promise.reject(error) } ) export default service