axios.js 2.74 KB
/*
 * @Author: hookehuyr hookehuyr@gmail.com
 * @Date: 2022-05-28 10:17:40
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2023-07-18 09:47:03
 * @FilePath: /map-demo/src/utils/axios.js
 * @Description:
 */
import axios from 'axios';
import router from '@/router';
import qs from 'Qs'
import { strExist } from '@/utils/tools'
// import { parseQueryString } from '@/utils/tools'

axios.defaults.params = {
  f: 'tools',
};

/**
 * @description 请求拦截器
 */
axios.interceptors.request.use(
  config => {
    // const url_params = parseQueryString(location.href);
    // GET请求默认打上时间戳,避免从缓存中拿数据。
    const timestamp = config.method === 'get' ? (new Date()).valueOf() : '';
    
    // 解析URL中的查询参数,提取并移除URL中的参数,避免重复
    const [baseUrl, queryString] = config.url.split('?');
    const urlParams = new URLSearchParams(queryString || '');
    const mergedParams = { ...axios.defaults.params };
    
    // 将URL中的所有参数提取到mergedParams中,URL参数优先级更高
    for (const [key, value] of urlParams.entries()) {
      mergedParams[key] = value;
    }
    
    // 清理URL,移除查询参数(因为参数会通过params传递)
    config.url = baseUrl;
    
    /**
     * POST PHP需要修改数据格式
     * 序列化POST请求时需要屏蔽上传相关接口,上传相关接口序列化后报错
     */
    config.data = config.method === 'post' && !strExist(['a=upload', 'upload.qiniup.com'], config.url) ? qs.stringify(config.data) : config.data;
    // 绑定默认请求头,确保URL参数优先级最高
    config.params = { ...config.params, ...mergedParams, timestamp }
    return config;
  },
  error => {
    // 请求错误处理
    return Promise.reject(error);
  });

/**
 * @description 响应拦截器
 */
axios.interceptors.response.use(
  response => {
    // 默认显示错误提示
    response.data.show = true;
    // 判断微信授权状态,进入页面时未授权需要授权跳转
    // C/B 授权拼接头特殊标识,openid_x
    let prefixAPI = router?.currentRoute.value.href?.indexOf('business') > 0 ? 'b' : 'c';
    if (response.data.code === 401) {
      // 特殊标识-带此标识报错不显示
      response.data.show = false;
      /**
       * 未授权跳转登录页
       * 带着上一个页面的信息, 授权完成后 返回当前页面
       */
      router.replace({ path: '/auth', query: { href: location.hash, prefixAPI } });
    }
    // 拦截B端未登录情况
    if (['老师请先登录!', '老师不存在!'].includes(response.data.msg)) { router.replace({ path: '/business/login' }); }
    return response;
  },
  error => {
    return Promise.reject(error);
  });

export default axios;