login.vue
<template>
<view class="personal_page">
<navBar :title="topInfo.title" :url="topInfo.url" :type="topInfo.type" :icon_title="topInfo.icon_title">
</navBar>
<!-- <text>获得你的公开信息(昵称,头像等)</text> -->
<!-- 是否登录 -->
<uni-popup ref="popup">
<view class="login_box">
<view class="title">为了您更好的用户体验,请授权登录</view>
<view class="operate">
<button @click="closeProp">取消</button>
<button class="login" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">登录</button>
</view>
</view>
</uni-popup>
</view>
</template>
<script> import navBar from "@/components/navBar/navBar.vue" export default { components: { navBar }, data() { return { topInfo: { url: "", title: "授权登录", icon_title: "", type: 'tab' }, wxCode: "", sessionKey: {}, isHide: true } }, onLoad(option) {}, onShow() { let token = uni.setStorageSync("token"); console.log('token', token); if (!token) { this.wxLogin(); } }, methods: { /* 是否登录 */ wxLogin() { let _this = this; uni.login({ provider: "weixin", success: (res) => { console.log("res", res) if (res.errMsg.indexOf("ok") != -1) { this.wxCode = res.code; // _this.getOpenid();
uni.showModal({ title: '温馨提示', content: '亲,授权微信登录后才能正常使用小程序功能', success(res) { console.log(0) console.log(res) //如果用户点击了确定按钮
if (res.confirm) { uni.getUserProfile({ desc: '获取你的昵称、头像、地区及性别', success: (res) => { console.log("获取昵称", res); let _res = _this.$myRequset({ url: "/api", method: "POST", data: { operate: "user.WxDecode", code: _this.wxCode, encryptedData: res .encryptedData, iv: res.iv, signature: res.signature, rawData: res.rawData }, }).then((res) => { console.log("解码", res); _this.sessionKey = res.data .data; _this.isLogin(); _this.getPhoneNumber(); }); }, fail: res => { //拒绝授权
uni.showToast({ title: '您拒绝了请求,不能正常使用小程序', icon: 'error', duration: 2000 }); return; } }); } else if (res.cancel) { //如果用户点击了取消按钮
console.log(3); uni.showToast({ title: '您拒绝了请求,不能正常使用小程序', icon: 'error', duration: 2000 }); uni.switchTab({ url:"../index/index" }); return; } } }); } else { uni.showToast({ title: "获取code失败", duration: 2000, icon: "none" }) } }, fail: (res) => { uni.showToast({ title: "登录失败", duration: 2000, icon: "none" }) _this.back(); } }) }, isLogin() { this.$refs.popup.open(); }, closeProp() { this.$refs.popup.close(); this.isLogin(); }, /* 用户授权手机号 */
async getPhoneNumber(e) { let _this = this; try{ let _msg = e.detail.errMsg; if (_msg == "getPhoneNumber:ok") { // 获取手机号
this.$refs.popup.close(); let res = await this.$myRequset({ url: "/api", method: "POST", data: { operate: "user.get_Phone", encryptedData: e.detail.encryptedData, iv: e.detail.iv, sessionKey: this.sessionKey.session_key, openid: this.sessionKey.openid }, }); console.log('获取手机号', res); if (res.data.code == 1) { let token = await this.$myRequset({ url: "/api/user/mobilelogin", method: "POST", data: { mobile: res.data.data.phoneNumber, captcha: 123 }, }); console.log('token', token) uni.setStorageSync("token", token.data.data.userinfo.token); uni.switchTab({ url:"../index/index" }); } } else { this.isLogin(); // 重新要求授权
} }catch{} }, } } </script>
<style> @import url("login.css"); </style>
main.js
Vue.prototype.checkLogin = function(){ const token = uni.getStorageSync('token') if(token === ''){ // 本地没有token表示未登录
console.log('未登录返回到登录页') uni.reLaunch({url:'/pages/login/login'}) return false } return token; }
使用token
personal.vue
onShow() { let loginRes = this.checkLogin(); console.log('loginRes', ) if (!loginRes) { return false; } else { this.token = uni.getStorageSync("token"); this.getUserInfo(); } },
此流程为进去指定页面时需要用户登录,则判断是否登录,没有登录时跳转至login页面授权登录后先自动跳转首页。用户体验有些许欠缺,若有同行大神有其他更好的实现方式敬请告知,一起探讨哦。。。。。。。。。。。。。
