import axios from 'axios'
|
import beforeSend from './modules/beforeSend.js'
|
|
const parseThirdOptions = Symbol('parseThirdOptions');
|
|
class CreateApi {
|
constructor(store,ui,config,router){
|
this.$store = store;
|
this.$ui = ui;
|
this.$config = config;
|
this.$router = router;
|
this.$loginPath = '/login'
|
this.$noTokenMsg = 'Token丢失!';
|
this.$invalidTokenMsg = '登录已超时,请重新登录!';
|
|
axios.interceptors.request.use(config => {
|
// Do something before request is sent
|
return config;
|
}, (error) => {
|
return Promise.reject(this.$config.ajax.errMsg);
|
});
|
|
// Add a response interceptor
|
axios.interceptors.response.use((response) => {
|
if (response.status===200) {
|
if (response.config.ajaxConfig.download) {
|
return Promise.resolve(response.data);
|
} else {
|
if (response.data.success && response.status===200) {
|
return Promise.resolve(response.data.data);
|
} else {
|
console.log('Ajax backstage Error, return: ',response.data)
|
let eMsg = response.data.msg;
|
if (!eMsg) eMsg = this.$config.ajax.errMsg;
|
return Promise.reject(eMsg);
|
}
|
}
|
} else {
|
console.log('Ajax Error Code: '+response.status)
|
return Promise.reject(this.$config.ajax.errMsg);
|
}
|
}, (error) => {
|
let msg = '';
|
if (typeof error === 'string') {
|
console.log('error:',error)
|
msg = error;
|
} else {
|
console.log('Ajax Error:',error)
|
msg = this.$config.ajax.errMsg;
|
}
|
return Promise.reject(msg);
|
});
|
}
|
|
getHeader(opts,isInside=false){
|
if (!isInside) {
|
opts = this[parseThirdOptions](opts)
|
}
|
return beforeSend.getHeader(opts,this.$store);
|
}
|
|
getUrl(method,opts,self=false){
|
let res = method;
|
if (!self) {
|
opts = this[parseThirdOptions](opts)
|
}
|
res = this.$config.base.host[opts.host] + this.$config.ajax.block[opts.block] + res;
|
return res;
|
}
|
|
/*
|
内部方法,获取object对象类型
|
*/
|
getObjectType(obj){
|
if (typeof obj !== 'object') {
|
return null;
|
} else {
|
let objTypeStr = Object.prototype.toString.call(obj).toLowerCase().trim();
|
objTypeStr = objTypeStr.substr(1,objTypeStr.length-2)
|
let tempA = objTypeStr.split(" ");
|
return tempA[1];
|
}
|
}
|
|
/*
|
内部方法,解析额外设置
|
*/
|
[parseThirdOptions](opts){
|
const defaultOpts = {
|
warn:true,
|
host:'default',
|
block:'default',
|
needToken:true,
|
warnType:'message'
|
}
|
let result = {...defaultOpts}
|
if (opts) {
|
if (typeof opts === 'string') {
|
result.block = opts
|
} else if (this.getObjectType(opts)==='object') {
|
result = {...result,...opts}
|
}
|
}
|
return result;
|
}
|
|
/*
|
httpMethod: get post put dellete patch
|
method:接口方法名
|
params:传递给后端的数据(JSON)
|
opts:接口调用方法额外设置
|
paramsX:post put patch时,如果需要url后面带的其他参数,JSON格式
|
*/
|
base(httpMethod,method,params={},opts,paramsX){
|
return new Promise((resolve, reject)=>{
|
window.setTimeout(()=>{
|
opts = this[parseThirdOptions](opts)
|
let url = this.getUrl(method,opts,true);
|
let ajaxOptions = {
|
method:httpMethod,
|
url:url
|
}
|
if (opts.download) {
|
ajaxOptions.responseType = 'blob'
|
}
|
ajaxOptions.ajaxConfig = opts;
|
if (httpMethod==='post'||httpMethod==='put'||httpMethod==='patch') {
|
ajaxOptions.data = params;
|
if (paramsX) ajaxOptions.params = paramsX;
|
} else {
|
ajaxOptions.params = {...params,...{timekey:new Date().getTime()}};
|
}
|
|
let headerRes = this.getHeader(opts,true);
|
|
if (!headerRes.flag) {
|
if (this.$router.currentRoute._value.path!==this.$loginPath) {
|
this.$router.push(this.$loginPath)
|
}
|
this.$ui.ElMessage.error(this.$noTokenMsg)
|
reject(this.$noTokenMsg)
|
} else {
|
ajaxOptions.headers = headerRes.data
|
axios(ajaxOptions).then((d)=>{
|
resolve(d)
|
}).catch((err)=>{
|
this.$ui.ElMessage.error(err)
|
reject(err)
|
})
|
}
|
})
|
},500)
|
}
|
}
|
|
CreateApi.prototype.get = function(method,params,opts,paramsX){
|
return this.base('get',method,params,opts,paramsX)
|
}
|
CreateApi.prototype.post = function(method,params,opts,paramsX){
|
return this.base('post',method,params,opts,paramsX)
|
}
|
CreateApi.prototype.put = function(method,params,opts,paramsX){
|
return this.base('put',method,params,opts,paramsX)
|
}
|
CreateApi.prototype.delete = function(method,params,opts,paramsX){
|
return this.base('delete',method,params,opts,paramsX)
|
}
|
CreateApi.prototype.downFile = function(method,params,opts,paramsX,type='get'){
|
let newOpt = {}
|
if (typeof opts === 'string') {
|
newOpt.block = opts
|
} else if (this.getObjectType(opts)==='object') {
|
newOpt = {...opts}
|
}
|
newOpt.download = true;
|
return this.base(type,method,params,newOpt,paramsX)
|
}
|
|
export default CreateApi
|