/** * Copyright (c) 2013-Now http://jeesite.com All rights reserved. */ import errorCode from "./errorCode"; import config from "./config"; // 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作 const install = (Vue, vm) => { // 通用请求头设定 const ajaxHeader = 'x-ajax'; const sessionIdHeader = 'Authorization'; const rememberMeHeader = 'x-remember'; // 请求参数默认配置 Vue.prototype.$u.http.setConfig({ baseUrl: vm.vuex_config.baseUrl, originalData: true, // 默认头部,http2约定header名称统一小写 ThinkGem header: { 'x-requested-with': 'XMLHttpRequest' } }); // 请求拦截,配置Token等参数 Vue.prototype.$u.http.interceptor.request = (req) => { if (!req.header) { req.header = []; } // 默认指定返回 JSON 数据 if (!req.header[ajaxHeader]) { req.header[ajaxHeader] = 'json'; } // 设定传递 Token 认证参数 ThinkGem if (!req.header[sessionIdHeader] && vm.vuex_token) { req.header[sessionIdHeader] = 'Bearer ' + vm.vuex_token; } // 为节省流量,记住我数据不是每次都发送的,当会话失效后,尝试重试登录 ThinkGem if (!req.header[rememberMeHeader] && vm.vuex_remember && req.remember) { req.header[rememberMeHeader] = vm.vuex_remember; req.remember = false; } //传递APP版本号 //req.header['APP-VERSION'] = config.appv; // console.log('request', req); return req; } // 响应拦截,判断状态码是否通过 Vue.prototype.$u.http.interceptor.response = async (res, req) => { const status = Number(res.statusCode) || 200 const message = res.data.msg || errorCode[status] || errorCode['default'] //判断版本 if ((status == 200 || res.data.code === 1) && message.split("@")[0]=='APP-VERSION') { vm.$u.toast(message.split("@")[1]); return Promise.reject(new Error(message.split("@")[1])) } //返回用户凭证已过期时,刷新token跳转至应用首页 if(message=='用户凭证已过期'){ let currRefreshToken=vm.vuex_refresh_token let refreshTokenParam={ grant_type:'refresh_token', refresh_token:currRefreshToken, client_id:'pig', client_secret:'pig' } //清空存储信息 vm.$u.vuex('vuex_token', '') vm.$u.vuex('vuex_refresh_token', '') vm.$u.vuex('vuex_username', '') vm.$u.vuex('vuex_userId', '') vm.$u.vuex('vuex_client_id', '') vm.$u.vuex('vuex_user', {}) vm.$u.api.refreshToken(refreshTokenParam).then((resAgain) => { //存储相关信息 vm.$u.vuex("vuex_token", resAgain.access_token); vm.$u.vuex("vuex_refresh_token", resAgain.refresh_token); vm.$u.vuex("vuex_username", resAgain.user_info.username); vm.$u.vuex("vuex_userId", resAgain.user_info.id); //vm.$u.vuex("vuex_client_id", resAgain.client_id); vm.$u.vuex("vuex_user", resAgain.user_info); setTimeout(() => { uni.reLaunch({ url: '/pages/sys/home/index' }); }, 500); }).catch(()=>{ setTimeout(() => { uni.reLaunch({ url: '/pages/sys/login/index' }); }, 500); }); return } // 后台定义 424 针对令牌过去的特殊响应码 if (status === 424) { vm.$u.toast('令牌过期,请重新登录'); vm.$u.api.logout().then(res => { //清空存储信息 vm.$u.vuex('vuex_token', '') vm.$u.vuex('vuex_refresh_token', '') vm.$u.vuex('vuex_username', '') vm.$u.vuex('vuex_userId', '') vm.$u.vuex('vuex_client_id', '') vm.$u.vuex('vuex_user', {}) setTimeout(() => { uni.reLaunch({ url: '/pages/sys/login/index' }); }, 500); }); return } if (status !== 200 || res.data.code === 1) { vm.$u.toast(message,3500); return Promise.reject(new Error(message)) } return res.data; } // 封装 get text 请求 vm.$u.getText = (url, data = {}, header = {}) => { return vm.$u.http.request({ dataType: 'text', method: 'GET', url, header, data }) } // 封装 post json 请求 vm.$u.postJson = (url, data = {}, header = {}) => { header['content-type'] = 'application/json'; return vm.$u.http.request({ url, method: 'POST', header, data }) } } export default { install }