diff --git a/common/http.api.js b/common/http.api.js index aeb5c81..80da9c8 100644 --- a/common/http.api.js +++ b/common/http.api.js @@ -1,17 +1,23 @@ //api集合 let apiApp = { login: '/api/mobile/user/applet-login', + userInfo: '/api/mobile/user/get-user-info', + + } // 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作 const install = (Vue, vm) => { //api方法 + // const login = (params = {}) => vm.$u.get(apiApp.login, params) + const getUserInfo = () => vm.$u.get(apiApp.userInfo) + // end - // 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下 vm.$u.api = { login, + getUserInfo }; } diff --git a/common/http.interceptor.js b/common/http.interceptor.js index 9217ae0..d71ba26 100644 --- a/common/http.interceptor.js +++ b/common/http.interceptor.js @@ -10,8 +10,8 @@ const install = (Vue, vm) => { showLoading: true, // 是否显示请求中的loading loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透 loadingText: '加载中', // 请求loading中的文字提示 - loadingTime: 800, - originalData: false, // 是否在拦截器中返回服务端的原始数据 + loadingTime: 2000, + originalData: true, // 是否在拦截器中返回服务端的原始数据 // 设置自定义头部content-type header: { 'content-type': 'application/json;charset=UTF-8' @@ -22,48 +22,46 @@ const install = (Vue, vm) => { Vue.prototype.$u.http.interceptor.request = (config) => { console.log('config-http', config) // 引用token - // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式 - // 见:https://uviewui.com/components/globalVariable.html - config.header.token = vm.vuex_token; - - // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取 - // config.header.token = vm.$store.state.token; - - // 方式三,如果token放在了globalData,通过getApp().globalData获取 - // config.header.token = getApp().globalData.username; - - // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的 - // 所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值 - // const token = uni.getStorageSync('token'); - // config.header.token = token; - - // 可以对某个url进行特别处理,此url参数为this.$u.get(url)中的url值 - if (config.url == '/test/jam') config.header.noToken = true; - // 最后需要将config进行return + if (vm.vuex_token) { + config.header['Authorization'] = `Bearer ${vm.vuex_token}`; + } return config; - // 如果return一个false值,则会取消本次请求 - // if(config.url == '/user/rest') return false; // 取消某次请求 } // 响应拦截,如配置,每次请求结束都会执行本方法 Vue.prototype.$u.http.interceptor.response = (res) => { console.log('res-http',res) - if (res.code == 200) { - // res为服务端返回值,可能有code,result等字段 - // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到 - // 如果配置了originalData为true,请留意这里的返回值 - return res.result; - } else if (res.code == 201) { - // 假设201为token失效,这里跳转登录 - // vm.$u.toast('验证失败,请重新登录'); - // setTimeout(() => { - // // 此为uView的方法,详见路由相关文档 - // vm.$u.route('/pages/user/login') - // }, 1500) - return false; + if (res.statusCode === 200) { + if (res.data.hasOwnProperty("errcode")) { + if (res.data.errcode === 40001) { + Vue.prototype.$u.debounce(() => { + uni.showToast({ + icon: "none", + title: "登陆过期,请重新登录" + }) + setTimeout(() => { + uni.redirectTo({ + url: '/pages/login/login' + }) + }, 1500) + }) + + } else { + uni.showToast({ + icon: "none", + title: "系统错误" + }) + return false + } + } else + return res.data; + } else { - // 如果返回false,则会调用Promise的reject回调, - // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中,res为服务端的返回值 + uni.showToast({ + icon: "fail", + title: "系统错误" + }) + return false; } } diff --git a/manifest.json b/manifest.json index a5c9ebe..e95184e 100644 --- a/manifest.json +++ b/manifest.json @@ -50,7 +50,7 @@ "quickapp" : {}, /* 小程序特有相关 */ "mp-weixin" : { - "appid" : "", + "appid" : "wx5d24dbf08480c2c0", "setting" : { "urlCheck" : false }, diff --git a/pages/login/login.vue b/pages/login/login.vue index f9c582f..d4b2a73 100644 --- a/pages/login/login.vue +++ b/pages/login/login.vue @@ -78,17 +78,20 @@ export default { } uni.login({ provider: 'weixin', //使用微信登录 - success: (loginRes) => { - console.log(loginRes); - this.$u.api.login({ - code: loginRes.code - }).then(res => { - console.log(res) - }) - // this.$u.route({ - // type: 'switchTab', - // url: '/pages/index/index' - // }) + success: async (loginRes) => { + try { + const {token} = await this.$u.api.login({ + code: loginRes.code + }) + this.$u.vuex('vuex_token', token) + const {user} = await this.$u.api.getUserInfo() + this.$u.vuex('vuex_user', user) + this.$u.route({ + type: 'switchTab', + url: '/pages/index/index' + }) + } catch (err) { + } } }); }, diff --git a/store/index.js b/store/index.js index 5905707..3163265 100644 --- a/store/index.js +++ b/store/index.js @@ -12,7 +12,7 @@ try{ } // 需要永久存储,且下次APP启动需要取出的,在state中的变量名 -let saveStateKeys = []; +let saveStateKeys = ['vuex_token', 'vuex_user']; // 保存变量到本地存储中 const saveLifeData = function(key, value){ @@ -34,6 +34,8 @@ const store = new Vuex.Store({ // 加上vuex_前缀,是防止变量名冲突,也让人一目了然 // 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式 vuex_version: '1.0.0', + vuex_token: '', + vuex_user: {}, vuex_location: { latitude: '',