89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								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
							 | 
						|||
| 
								 | 
							
								    
							 | 
						|||
| 
								 | 
							
								    // 如果响应码不是200,则判断为错误
							 | 
						|||
| 
								 | 
							
								    if (res.code !== 200) {
							 | 
						|||
| 
								 | 
							
								      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
							 |