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

import {
  Toast
} from 'vant';

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;
const ENV = process.env.VUE_APP_ENV;
const MODULE_CODE = process.env.VUE_APP_MODULE_CODE;
const IS_POST_ENC = process.env.VUE_APP_IS_POST_ENC;
// 默认超时
axios.defaults.timeout = 5000;


// 请求拦截器
// axios.interceptors.request.use(
//   config => {
//     // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
//     // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
//     const token = "token"; //这里写入token
//     token && (config.headers.Authorization = token);
//     return config;
//   },
//   error => {
//     return Promise.error(error);
//   })

// 响应拦截器
axios.interceptors.response.use(
  response => {
    let {
      config
    } = response;
    let {
      opt
    } = config;
    // 服务器状态码
    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') {
      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);
}


/**
 * 封装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);
}



/**
 * 打点
 * @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);;
}