fetch-api.js 5.98 KB
import axios from 'axios';

import {
  Toast
} from 'vant';
Toast.allowMultiple();
let loadingToast;

import router from '@/router'
import {
  getToken,
  setToken,
  removeToken
} from '@/utils/auth'

import {
  makeEncrypt
} from '@/utils/encrypt-util'

import api from '@/api/api';


// axios的默认url
// axios.defaults.baseURL = ""
let base = process.env.VUE_APP_BASE_API;
let MODULE_CODE = process.env.VUE_APP_MODULE_CODE;
const IS_POST_ENC = process.env.VUE_APP_IS_POST_ENC;
let ENV = process.env.VUE_APP_ENV;

// 配置环境
// let host = location.host;
if (location.host.indexOf("192.168.") != -1 || location.host.indexOf("172.20.") != -1 || location.host.indexOf('dev.h5.kdao.xin') != -1) {
  // 测试环境
  ENV = "demo";
} else {
  // if (location.host.indexOf("prod.h5.kdao.xin") != -1) {
  //   // 恪道正式环境
  // }
}


// 默认超时
axios.defaults.timeout = 5000;


// 请求拦截器
axios.interceptors.request.use(
  config => {
    let {
      opt
    } = config;
    if (opt && opt.loading) {
      loadingToast = Toast.loading({
        message: '加载中...',
        forbidClick: true,
      });
    }
    return config;
  },
  error => {
    return Promise.error(error);
  })

// 响应拦截器
axios.interceptors.response.use(
  response => {
    let {
      config
    } = response;
    let {
      opt
    } = config;
    if (loadingToast) loadingToast.clear();

    // 服务器状态码
    if (response.status === 200) {

      // 业务状态码
      if (response.data.code === 200) {
        return Promise.resolve(response);
      } else {
        if (typeof (opt) == "undefined" || typeof (opt.toast) == "undefined" || opt.toast) {
          Toast(response.data.errMsg);
        }
        switch (response.data.code) {

          /**
           * 登陆失败
           * 清除cookies
           * 根据业务可能要引导回登陆页
           */
          case 403:
            removeToken();
            break;

          default:
            break;
        }

        return Promise.reject(response);
      }
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 其他错误,直接抛出错误提示
        default:
          Toast({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true
          });
      }
      return Promise.reject(error.response);
    }
  }
);


/**
 * 分解参数&拦截请求
 */
function analysisParams(params) {
  let {
    url,
    data,
    mode,
    opt = Object.assign({}, params.opt),
    sid = true,
    config,
    method
  } = params;
  if (IS_POST_ENC == 'true') {
    if (method == 'post' || method == 'delete' || method == 'DELETE') {
      data = makeEncrypt(data);
    }
  } else {
    if (opt.enc) {
      data = makeEncrypt(data);
    }
  }

  if (opt.dec) {
    data = makerypt(data);
  }
  let reqUrl = `${base}${url}`;
  if (mode == "custom") {
    reqUrl = `${url}`
  }
  let headers = {}
  if (sid) {
    headers.sessionId = getToken();
    headers['-kd-platform-module'] = MODULE_CODE
    headers['-kd-platform-env'] = ENV
  }
  return {
    reqUrl,
    data,
    headers,
    opt,
    method,
    config
  }
}

/**
 * 封装get方法
 * @param {*} params
 */
export const httpGet = params => {
  params.method = 'get';
  let {
    reqUrl,
    data,
    headers,
    opt,
    method
  } = analysisParams(params);
  return axios.get(reqUrl, {
    params: data,
    headers,
    opt
  }).then(res => res.data.content);
}

/**
 * 封装post方法
 * mode为custom时,忽略baseUrl
 * @param {*} params
 */
export const httpPost = params => {
  params.method = 'post';
  let {
    reqUrl,
    data,
    headers,
    opt,
    method
  } = analysisParams(params);
  return axios.post(reqUrl, data, {
    headers,
    opt
  }).then(res => res.data.content);
}
export const httpDelete = params => {
  params.method = 'delete';
  let {
    reqUrl,
    data,
    headers,
    opt,
    method
  } = analysisParams(params);
  return axios.delete(reqUrl, {
    data: data,
    headers: headers,
  }).then(res => res.data.content);
}


/**
 * 封装post方法
 * @param {*} params
 * data数据是 formdata格式
 * 例如:
 *          this.file = file
 let data = new FormData() //使用formData对象
 data.append('path', '/pro/mzczcradmin/')
 data.append('file', file.file)
 */
// export const formdata = params => {
//   let {
//     url,
//     data,
//   } = params;

//   let formData = new FormData(); //使用formData对象
//   for (let key in data) {
//     formData.append(key, data[key]);
//   }
//   return axios.post(`${base}${url}`, formData, {
//     headers: {
//       "Content-Type": "multipart/form-data"
//     }
//   }).then(res => res.data.content);
// }
export const formdata = params => {
  let {
    url,
    data,
  } = params;

  let formData = new FormData(); //使用formData对象
  for (let key in data) {
    formData.append(key, data[key]);
  }
  return axios.post(`${base}${url}`, formData, {
    headers: {
      "Content-Type": "multipart/form-data",
      "-kd-platform-module": MODULE_CODE,
      "-kd-platform-env": ENV
    }
  }).then(res => res.data.content);
}


/**
 * 获取bolb对象的图片
 * @param {*} params 
 * @returns 
 */
export const getBlob = params => {
  let {
    reqUrl,
    data,
    headers,
  } = analysisParams(params);

  return axios({
    url: reqUrl,
    method: 'get',
    params: data,
    headers: headers,
    responseType: 'blob' // 改参数会以blob流格式返回
  }).then((res) => {
    let blob = new Blob([res.data])
    let url = URL.createObjectURL(blob);
    return url;
  });
}



/**
 * 打点
 * @param {*} params
 */
export const stat = data => {
  data.s = encodeURIComponent(getToken());
  let reqUrl = `${base}${api.stat}`;
  let opt = {
    toast: false
  }
  let headers = {}
  // headers.sessionId = getToken();
  return axios.get(reqUrl, {
    params: data,
    headers,
    opt
  }).then(res => res.data.content);;
}