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