axios封装,导出excel

5 篇文章 0 订阅
import axios from 'axios'
import qs from 'qs'
import { message } from 'antd'
import { routerRedux } from 'dva/router'
import store from '../index'
import { filterNull } from '../utils'
import { getToken } from '../utils/token'
import { BaseApiURL } from '../../public/config'

const baseURL = BaseApiURL
axios.defaults.baseURL = baseURL

// 状态码错误信息
const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队(异步任务)。',
  204: '删除数据成功。',
  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限(令牌、用户名、密码错误)。',
  403: '用户得到授权,但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除,且不会再得到的。',
  422: '当创建一个对象时,发生一个验证错误。',
  500: '服务器发生错误,请检查服务器。',
  502: '网关错误。',
  503: '服务不可用,服务器暂时过载或维护。',
  504: '网关超时。'
}

// 全局请求拦截器
axios.interceptors.request.use(
  (config) => {
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 全局响应拦截器
axios.interceptors.response.use(
  (response) => {
    const { dispatch } = store
    const data = response.data
    if (data.code === 0) {
      return response
    }
    if (data.code === 6011) {
      return response
    }
    if (data.code === 90005) {
      return response
    }
    if (data.code === 401) {
      dispatch({
        type: 'login/exitLogin'
      })
    }
    if (response.status === 200 && response.config.responseType === 'blob') {
      console.log(response, 'response')
      return response
    } else {
      message.error(data.message || '请求失败')
    }
    return Promise.reject(response)
  },
  (error) => {
    const { dispatch } = store
    const response = error.response
    const status = response.status ? response.status : 500
    console.log(error)
    if (!(status && status === 200)) {
      message.error(response.message || '请求失败')
      dispatch({
        type: 'login/exitLogin'
      })
    }
    return Promise.reject(response)
  }
)

// axios请求方法封装
const apiAxios = (
  method,
  url,
  params,
  isFormdata,
  headers,
  responseType,
  timeout
) => {
  if (params) {
    params = filterNull(params)
  }

  const axiosFc = axios({
    responseType,
    method: method,
    url:
      method === 'GET'
        ? url.indexOf('?') > -1
          ? url + '&time=' + new Date().getTime()
          : url + '?time=' + new Date().getTime()
        : url,
    data:
      method === 'POST' ||
      method === 'PUT' ||
      method === 'DELETE' ||
      method === 'PATCH'
        ? isFormdata
          ? qs.stringify(params)
          : params
        : null,
    params:
      method === 'DELETE' || method === 'PUT'
        ? isFormdata
          ? params
          : null
        : method === 'GET'
        ? params
        : null,
    baseURL: baseURL,
    timeout: timeout && timeout.timeout ? timeout.timeout : 15000,
    headers: {
      token: getToken(),
      ...headers
    }
  })

  return axiosFc
}

export default apiAxios

请求修改header

export const getStaffExports = (params) => axios('GET', '/v1.0/workbench//getStaffExports', params, false,
  {
    'Content-Type': 'application/json;charset=utf-8'
  },
  'blob')

导出转换方法

const downloadXls = (res) => {
  let blob = res.data
  let name = decodeURI(decodeURI(res.headers['content-disposition']))
  const reader = new FileReader()
  if (res.data.type === 'application/json') {
    return
  }
  reader.readAsDataURL(blob) // 转换为base64,可以直接放入a标签href
  reader.onload = (e) => {
    // 转换完成,创建一个a标签用于下载
    let a = document.createElement('a')
    a.style.display = 'none'
    a.download = name.substring(name.indexOf('=') + 1)

    a.href = e.target.result
    const body = document.body
    document.body.appendChild(a) // 修复firefox中无法触发click
    a.click()
    document.body.removeChild(a)
  }
}

js代码

  /**
   * 导出列表
  */
  const ChangeExportEcharts = () => {
    if (appraiseId) {
      getStaffExports({ appraiseId }).then((res) => {
        // const { data: { code, data } } = res
        if (!res.data.data) {
          downloadXls(res)
        }
      })
    } else {
      message.warning('请选择公司以及考核月份')
    }

  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值