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('请选择公司以及考核月份')
}
}