fork-reap-design
Version:
A high quality UI components Library with Vue.js
142 lines (135 loc) • 5.4 kB
JavaScript
/**
* @author jonasli
* @module ajax 封装
* @date 2018/09/09
*/
/* eslint-disable */
import axios from 'axios'; // 0.2M
import epaasTools from 'epaas-private-tools';
export function setDefault(options) {
if (options && options.defaults && options.defaults.baseURL) {
Reap.root = options.defaults.baseURL;
}
// axios.defaults.baseURL = eduBaseUrl;
axios.defaults.headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
// 接口默认超时 10s;timeout => 0:不需要超时; !0 自定义超时时间
axios.defaults.timeout = 30 * 1000;
axios.defaults.transformRequest = [function (data) {
// 检测 request是否为 FormData ,则不做任何序列化操作
if (data && data.entries) return data;
// 2.0正常接口需要序列化
return JSON.stringify(data);
}];
// request 拦截 1.设置登录态token 2.post Content-Type = 'application/json'
// 开放平台扫码登录:https://te.qq.com/open/app/2345
// openuserid: 1094577996007748608
axios.interceptors.request.use(
response => {
let url = response.url.toLocaleLowerCase().split('?');
console.log('axios response', url);
// 接口权限
// token 改造,当有 50000 登录态的时候用 50000 登录态,如果没有的话用 10000
const mapiToken = window.localStorage.getItem('views.login.mapiToken');
console.log('mapiToken', mapiToken);
let token = mapiToken;
let method = response.method;
response.headers.Authorization = token;
epaasTools.checkParams(response);
// 接口为上传,导入,导出,下载等接口不进行超时限制
if (url[0].match(/upload|export|import|download/)) {
response.timeout = 0;
}
if (['post', 'put'].includes(method)) {
response.headers['Content-Type'] = 'application/json';
}
return response;
},
error => {
return error;
}
);
// response 拦截
axios.interceptors.response.use(
response => {
return response;
},
error => {
let response = {};
// response 整个对象
if (error.response) {
response = error.response;
// 网络转态码:
// 401:登录态过期
// 更多错误码
let status = response.status;
if (status === 401) {
// TODO 需要执行重定向到首页操作,暂时不操作
// Vue.prototype.$Message.error('登录态已过期,请重新登录');
console.log('登录态过期,请重新登录');
// redirect();
}
if (status >= 500) {
// Vue.prototype.$Message.error('网络开小差了');
if (status === 504) {
console.log('接口服务宕机');
// redirect();
}
}
} else {
// 前端模拟404错误:404 接口不会捕获到错误信息的问题
if (error.config) {
response.status = 404;
response.statusText = "API Not Found"
}
// Vue.prototype.$Message.error('网络开小差了');
}
// 接口错误前端模拟错误供每个页面接口捕获
throw response;
return error;
}
);
if (options) {
Object.assign(axios, options);
}
}
// 项目登出
export const redirect = () => {
console.log('axios.js redirect');
// let platformParams = {
// env: 'online',
// appid: '10000'
// };
// let params = JSON.parse(window.localStorage.getItem('views.login.platformParams')) || platformParams;
// let env = params.env;
// let appid = params.appid;
// let url = `https://sso.qq.com/open/logout/${appid}?callback=https://sso.qq.com/open/app/${appid}`;
// window.sessionStorage.clear();
// window.localStorage.clear();
// // 清除线上登陆态
// if (env === 'dev') url = `https://dev-sso.qq.com/open/logout/${appid}?callback=https://dev-sso.qq.com/open/app/${appid}`;
// if (env === 'test') url = `https://test-sso.qq.com/open/logout/${appid}?callback=https://test-sso.qq.com/open/app/${appid}`;
// if (env === 'pre') url = `https://pre-sso.qq.com/open/logout/${appid}?callback=https://pre-sso.qq.com/open/app/${appid}`;
// window.location.href = url;
};
// =================== ajax封装 ==================
function request (url, params, method) {
return new Promise((resolve, reject) => {
axios[method](url, params)
.then((res) => {
let code = res.data.ErrorCode;
if (code && typeof(code) === 'string') {
res.data.ErrorCode = code.toLocaleUpperCase();
}
resolve(res.data)
})
.catch((resp) => {
reject(resp)
});
})
}
export function ajaxRequest(url, params, method) {
return request(url, params, method)
}
export default axios;