smart-admin/smart-admin-web/src/lib/http.js
2020-04-20 17:08:42 +08:00

162 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Axios from 'axios';
import config from '@/config';
import { Message, Spin } from 'view-design';
import cookie from '@/lib/cookie';
// 之所以封装这个axios是因为在一些请求中无法上传信息很尴尬估计原因是继承的有问题无法携带headers
export const baseUrl = config.baseUrl.apiUrl;
export const socketBaseUrl = config.baseUrl.webSocketUrl;
let axios = Axios.create({
baseURL: baseUrl,
timeout: 30000,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
});
axios.interceptors.request.use(
function (config) {
// 在发送请求之前做些什么
if (cookie.getToken()) {
config.headers['x-access-token'] = cookie.getToken();
}
return config;
},
function (error) {
// 对请求错误做些什么
Spin.hide();
return Promise.reject(error);
}
);
// 添加响应拦截器
axios.interceptors.response.use(
res => {
if (res.config.responseType === 'blob') {
let isReturnJson = res.headers && res.headers['content-type'] && res.headers['content-type'].indexOf("json") > -1;
//后端返回错误信息
if (isReturnJson) {
let reader = new FileReader()
reader.onload = function (event) {
let content = reader.result
let parseRes = JSON.parse(content) // 错误信息
return validateResponseCode({
data: parseRes
});
}
reader.readAsText(res.data);
return true
} else {
//下载文件
download(res);
}
} else {
//正常json请求
return validateResponseCode(res);
}
},
error => {
Spin.hide();
Message.error('服务内部错误');
console.log('1111', error);
// 对响应错误做点什么
return Promise.reject(error);
}
);
function validateResponseCode (res) {
let { data } = res;
if (data && data.code && data.code !== 1) {
if (data.code === 1001) {
cookie.clearToken();
localStorage.clear();
window.location.href = window.location.pathname + '#/login';
Message.error('未登录,或登录失效,请登录');
return;
} else if (data.code === 502) {
window.location.href = window.location.pathname + '#/500';
return;
} else {
Spin.hide();
Message.error(data.msg);
return Promise.reject(res);
}
}
return Promise.resolve(data);
}
function blobToText (blob) {
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.readAsText(blob);
fileReader.onload = function () {
try {
const result = JSON.parse(this.result);
if (result && result['resultCode'] === 'fail') {
resolve(result);
} else {
reject();
}
} catch (e) {
//TODO handle the exception
reject();
}
}
})
}
export const postAxios = (url, data) => {
return axios.post(url, data);
};
export const postFileUploadAxios = (url, data) => {
return axios.post(url, data, { headers: { 'Content-Type': 'multipart/form-data' } });
};
export const getDownloadAxios = (url) => {
return axios.get(url, { responseType: 'blob' });
};
export const postDownloadAxios = (url, data) => {
return axios.post(url, data, { responseType: 'blob' });
};
export const getAxios = (url, data) => {
return axios.get(url, {
params: data
});
};
function download (res) {
let reader = new FileReader();
let data = res.data;
reader.onload = e => {
if (e.target.result.indexOf('Result') != -1 && JSON.parse(e.target.result).Result == false) {
// 进行错误处理
} else {
let fileName = "download";
let contentDisposition = res.headers['Content-Disposition'];
contentDisposition = contentDisposition ? contentDisposition : res.headers['content-disposition'];
if (contentDisposition) {
fileName = window.decodeURI(contentDisposition.split('=')[1], "UTF-8");
}
executeDownload(data, fileName);
}
};
reader.readAsText(data);
}
// 模拟点击a 标签进行下载
function executeDownload (data, fileName) {
if (!data) {
return
}
let url = window.URL.createObjectURL(new Blob([data]));
let link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}