/** * Created by zfw3288 on 2018/10/15. * * vue-reource 的配置信息 */ import Vue from 'vue' import axios from 'axios' import VueCookie from 'js-cookie' import router from '../router' Vue.prototype.$http = axios var store = { source: { token: null, cancel: null } } //默认谁头信息 const tokenHeaderName = 'X-ACCESS-TOKEN' //封装axios的接口请求,统一做异常处理与成功回调处理 Vue.prototype.getApiData = function(method:string, url:string, params:any, successBack:Function,errorBack:Function,config : any) { let startTime = new Date().getTime(); if(url.indexOf("?")>-1){ url=url+"×tamp="+startTime; }else{ url=url+"?timestamp="+startTime; } // axios.defaults.headers["Accept"]="application/json;charset=UTF-8" axios[method](this.$apiPrifixUri + url, params,config) .then((response:any) => { if(response.rtnCode == 0||response.code==0||response.status) { successBack(response) } else { console.error('ssss',this) if(!this.showDialog && this.$customs.flag) { (this.$globalFun() as any).getMethod('close') } if(errorBack){ errorBack&&errorBack(response); if(response.msg||response.message){ this.$tools.message('error',response.msg||response.message) } }else{ this.$tools.message('error',response.msg||response.message) } } }) .catch((reject:any) => { if(jq(".ivu-message-notice").length == 0) { if(reject.message){ this.$tools.message('error',reject.message) }else if(reject.response){ this.$tools.message('error',reject.response.data.message) } } errorBack&&errorBack(reject) }); } //封装axios的post下载文件接口 Vue.prototype.download = function(url:string, params:any, fileName:string,method:string="post") { axios({ method: method, url: this.$apiPrifixUri + url, data: params, responseType: 'blob', // headers:{ // "Content-Type":"application/octet-stream;charset=utf-8", // } }).then((data:any) => { // IE if(navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("NET") > -1) {  let type = data['type']    let blob = new Blob([data], { type: type })    if(window.navigator.msSaveBlob) {       window.navigator.msSaveBlob(blob, fileName )    } } else { 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() } }).catch((error) => { this.$tools.message('error','下载出错了') }) }, // http request 请求拦截器,有token值则配置上token值 axios.interceptors.request.use( (config:any) => { const token = VueCookie.get(tokenHeaderName); if(token) { // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了 config.headers[tokenHeaderName] = token; } config.cancelToken = store.source.token return config; }, err => { return Promise.reject(err); } ); // http response 服务器响应拦截器,在成功回调中将token的过期时间重新设置在30分钟后,err回调这里拦截401错误,并重新跳入登页重新获取token axios.interceptors.response.use( success => { if(Vue.prototype.$customs.flag) { // 海信的有效期设置为永不过期 VueCookie.set(tokenHeaderName, VueCookie.get(tokenHeaderName), -1); } else { VueCookie.set(tokenHeaderName, VueCookie.get(tokenHeaderName), {expires: 1/48}); } return success.data }, error => { if(error.response) { let path = router.currentRoute.fullPath; if(router.currentRoute.meta.noNeedLogin){ return Promise.reject({code:0}) }else{ if(error.response.status == 401 || error.response.status == 409) { VueCookie.remove(tokenHeaderName); if(path.indexOf("redirect") == -1 && path.indexOf("login") == -1) { router.replace({ path: '/login', query: { redirect: path } //登录成功后跳入浏览的当前页面 }) } } } /**转义Axios 请求状态的英文错误提示信息 */ let errMsgMap={400:'错误请求',401:'未登录或会话超时,请先登录',403:'拒绝访问',404:'请求错误,找不到该资源',405:'请求方法不被允许',500:'服务器出错',501:'网络未实现',502:'网络错误',503:'服务不可用',504:'网络超时',505:'http版本不支持该请求'} if(errMsgMap[error.response.status]){ error.message=errMsgMap[error.response.status] }else{ error.message=`请求出错,错误码为:${error.response.status}`; } }else{ if(!axios.isCancel(error)){ let errMsgMap={'Network Error':'网络出错'}; if(errMsgMap[error.message]){ error.message=errMsgMap[error.message] }else{ error.message='程序出错'; } } } return Promise.reject(error) } ); router.beforeEach((to, from, next) => { const CancelToken = axios.CancelToken store.source.cancel && (store.source as any).cancel() store.source =(CancelToken.source()) next() })