fetch-api-new.js 8.16 KB
import axios from 'axios';
// import router from './../router'
import router from '@/router/index'
import {
  Message
} from 'element-ui'
import {
  getToken,
  setToken,
  removeToken
} from '@/utils/auth'


// 可以使用
import {
  MessageBox
} from 'element-ui'

/**
 * 提示方法,自行处理
 * 可以使用  MessageBox
 *
 * @param {*} data
 */
let alreadyToast = false

function Toast(data) {
  if (alreadyToast) {
    return;
  }
  alreadyToast = true;
  MessageBox.alert(data.message, '警告', {
    confirmButtonText: '确定',
    callback: action => {
      alreadyToast = false;
      // this.$message({
      //   type: 'info',
      //   message: `action: ${action}`
      // })
    }
  })
}

// axios的默认url
// axios.defaults.baseURL = ""
let base = 'https://api.k.wxpai.cn/bizproxy/tianbaoServiceApi';

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

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      if (response.config.responseType == 'blob') {
        return Promise.resolve(response)
      } else if (response.data.code === 200) {
        return Promise.resolve(response);
      } else if (response.data.code == 404) {
        Toast({
          message: '登录过期,请重新登录',
          duration: 1000,
          forbidClick: true
        });
        removeToken();
        setTimeout(() => {
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
        }, 1000);
      } else {
        Message({
          showClose: true,
          message: response.data.errMsg,
          type: 'error',
          duration: 3000
        })
        return Promise.reject(response);
      }
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
          break;
        case 404:
          // Toast({
          //   message: '登录过期,请重新登录',
          //   duration: 1000,
          //   forbidClick: true
          // });
          // removeToken();
          // setTimeout(() => {
          //   router.replace({
          //     path: '/login',
          //     query: {
          //       redirect: router.currentRoute.fullPath
          //     }
          //   });
          // }, 1000);
          break;
          // 405请求不存在
        case 405:
          Toast({
            message: '网络请求不存在',
            duration: 1500,
            forbidClick: true
          });
          break;
          // 其他错误,直接抛出错误提示
        default:
          Toast({
            message: error.response.data.errMsg,
            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 (opt.dec) {
    data = makerypt(data);
  }
  let reqUrl = `${base}${url}`;
  if (mode == "custom") {
    reqUrl = `${url}`
  }
  let headers = {}
  if (sid) {
    // headers.sessionId = getToken();
    headers.adminSessionId = getAdminToken();
  }

  // console.log({
  //   reqUrl,
  //   data,
  //   headers,
  //   opt,
  //   method,
  //   config
  // });
  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);
  // headers["Content-Type"] = "application/json"
  return axios.delete(reqUrl, {
    data,
    headers,
    opt
  }).then(res => res.data.content);
}

/**
 * 请求封装
 * 默认 post  可通过 method设置为get
 *
 * @param {*} params
 * @returns
 */
export const request = params => {
  let {
    reqUrl,
    data,
    headers,
    opt,
    method
  } = analysisParams(params);

  if (method.toLowerCase() == "post") {
    return axios.post(reqUrl, data, {
      headers,
      opt
    }).then(res => res.data.content);
  } else {
    return axios.get(reqUrl, {
      params: 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 httpFormdata = params => {
  let {
    reqUrl,
    data,
    headers,
    opt,
    method
  } = analysisParams(params);
  headers["Content-Type"] = "multipart/form-data";
  return axios.post(reqUrl, data, {
    headers
  }).then(res => res.data.content);
}

export const downloadExcel = (params, fileName) => {
  let {
    reqUrl,
    data,
    headers,
    config
  } = analysisParams(params);
  return axios({
    method: 'get',
    url: reqUrl,
    params: data,
    headers: headers,
    responseType: 'blob',
    ...config
  }).then(res => {
    let blob = new Blob([res.data], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
    })
    let downloadElement = document.createElement('a')
    let href = window.URL.createObjectURL(blob)
    downloadElement.style.display = 'none'
    downloadElement.href = href
    downloadElement.download = fileName //下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() //点击下载
    document.body.removeChild(downloadElement) //下载完成移除元素
    window.URL.revokeObjectURL(href) //释放掉blob对象
  }).catch(err => {
    console.log('err', err)
    Toast({
      message: '下载失败,请重新下载'
    })
  })
}

function getAdminToken() {
  try {
    let token = getToken();
    if (token != null && token != undefined) {
      return token.adminSessionId;
    }
    return "";
  } catch (e) {
    console.error(e);
    return "";
  }
}

export function getHeaders() {
  return {
    'adminSessionId': getAdminToken(),
  }
}

// 导出表格
export const buildExcelHeader = params => {
  let {
    reqUrl,
    data,
    headers
  } = analysisParams(params);
  let {
    filename
  } = params;
  return axios({
    method: 'get',
    url: reqUrl,
    params: data,
    headers: headers,
    responseType: 'blob'
    // onDownloadProgress:?config.onDownloadProgress
  }).then(res => {
    let blob = new Blob([res.data], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
    })
    let downloadElement = document.createElement('a')
    let href = window.URL.createObjectURL(blob)
    downloadElement.style.display = 'none'
    downloadElement.href = href
    downloadElement.download = filename //下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() //点击下载
    document.body.removeChild(downloadElement) //下载完成移除元素
    window.URL.revokeObjectURL(href) //释放掉blob对象
  }).catch(err => {
    console.log("err", err)
    Toast({
      message: '下载失败,请重新下载'
    })
  })
}