You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// src/utils/myAxios.js
import axios from 'axios'import { ElMessage } from 'element-plus'import router from '../router/index';
// 创建 axios 实例
const myAxios = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量获取基础地址(推荐)
timeout: 10000, // 超时时间(10秒)
headers: { 'Content-Type': 'application/json;charset=utf-8' // 默认请求头
}})
// 请求拦截器:添加 token、处理请求前逻辑
myAxios.interceptors.request.use( (config) => { const isLoginApi = config.url === '/login'; // 示例:从本地存储获取 token 并添加到请求头
if (!isLoginApi) { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } else { router.push('/login'); } } return config }, (error) => { // 请求错误时的处理(如参数错误)
ElMessage.error('请求参数错误') return Promise.reject(error) })
// 响应拦截器:处理响应数据、统一错误提示
myAxios.interceptors.response.use( (response) => { const res = response.data
// 假设后端接口规范:成功时 code=200,其他为错误
if (res.code !== 200) { // 错误提示(根据后端消息提示,或自定义)
ElMessage.error(res.message || '操作失败') return Promise.reject(new Error(res.message || 'Error')) } else { // 只返回数据部分(过滤响应体中的其他字段)
return res.data } }, (error) => { // 网络错误或服务器错误处理
let message = '网络异常,请稍后重试' if (error.response) { // 根据 HTTP 状态码自定义提示
switch (error.response.status) { case 401: message = '未授权,请重新登录' router.push('/login') break case 403: message = '没有权限访问' break case 404: message = '接口不存在' break case 500: message = '服务器内部错误' break default: message = `请求错误(${error.response.status})` } } ElMessage.error(message) return Promise.reject(error) })
export default myAxios
|