<template> <view class="page"> <view class="wrap"> <image class="logo" src="https://eduvessel.com/images/occupationlab/hjyz-logo.png" mode="widthFix"></image> <button v-if="isBind" class="btn" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">快捷登录</button> <button v-else class="btn" @click="toAccounts">快捷登录</button> <view class="agree"> <uni-data-checkbox class="check" multiple v-model="agree" :localdata="agreeData"></uni-data-checkbox> <text @click="toAgreement(0)">《用户服务协议》</text> <text @click="toAgreement(1)">《用户隐私协议》</text> </view> </view> </view> </template> <script> import { studentWeChatAppletCallback, studentBinding, weChatToken } from '@/apis/modules/user.js' import WXBizDataCrypt from '@/libs/WXBizDataCrypt' export default { data() { return { agree: [], agreeData: [{ text: '同意', value: 1 }], sessionKey: '', openid: '', unionid: '', submiting: false, isBind: false, accounts: [], } }, onShow() { // uni.setStorageSync('token', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjM5NTc2LCJyblN0ciI6IjZXZUtCNTdOMU9ubGhBSG53RmJwMWN0c3VuVWlyR2l5IiwiYWNjb3VudElkIjozOTU3NiwidXNlcklkIjozOTU3NSwic2Nob29sSWQiOjI4NDYsInVzZXJOYW1lIjoiYWMiLCJwbGF0Zm9ybUlkIjoiMSJ9.hYkjwTUdMMYQLXJVRmqnw3tqRvGndNAzUiVh1ClyCec') this.checkLogin() }, methods: { // 检查登录状态 checkLogin() { if (uni.getStorageSync('token')) { this.toIndex() } else { uni.clearStorageSync() this.submiting = false this.autoLogin() } }, // 获取openid等 autoLogin() { uni.login({ success: async ({ code }) => { if (code) { this.submiting = true // 微信小程序登录 try { const res = await studentWeChatAppletCallback({ code, avatarUrl: '' }) const { data } = res this.submiting = false const e = data.sessionKey this.sessionKey = e.session_key this.openid = e.openid uni.setStorageSync('sessionKey', e.session_key) uni.setStorageSync('openid', e.openid) // 如果没有绑定手机号,则显示绑定按钮,引导用户绑定,否则,直接跳到首页 if (data.state === 'login') { uni.setStorageSync('token', data.token) this.toIndex() } else if (data.state === 'bind') { // 注册 this.isBind = true } else if (data.data.userAccounts) { // 多个账号 this.accounts = JSON.stringify(data.data.userAccounts) } } catch (e) { this.submiting = false } } else { this.submiting = false that.$util.errMsg('登录失败!') } } }) }, async toAccounts() { uni.setStorageSync('accounts', this.accounts) this.$util.to(`/user/selectAccount/selectAccount?openid=${this.openid}`) }, // 绑定手机号 async onGetPhoneNumber(e){ if (this.submiting) return false const { encryptedData, iv } = e.detail const appId = uni.getAccountInfoSync().miniProgram.appId const pc = new WXBizDataCrypt(appId , this.sessionKey) const decData = pc.decryptData(encryptedData , iv) this.submiting = true const phone = decData.phoneNumber uni.setStorageSync('phone', phone) const { data } = await studentBinding({ openid: this.openid, phone, platformId: 1 }) if (data) { const accounts = data.userAccounts if (accounts) { // 多个账号则前往选择账号 uni.setStorageSync('accounts', JSON.stringify(accounts)) this.$util.to(`/user/selectAccount/selectAccount?openid=${this.openid}&phone=${phone}`) } else { uni.setStorageSync('token', data.token) uni.switchTab({ url: '/pages/index/index' }) } } else { // 新用户则前往绑定账号 this.$util.to(`/user/reg/reg?openid=${this.openid}&phone=${phone}`) } }, toAgreement(id) { this.$util.to(id ? `/course/privacyAgreement/privacyAgreement` : `/course/serviceAgreement/serviceAgreement`) }, // 跳转到首页 toIndex() { uni.switchTab({ url: '../index/index' }) } } } </script> <style scoped lang="scss"> .page { min-height: calc(100vh - 170rpx); padding-top: 170rpx; background: url(https://eduvessel.com/images/occupationlab/login1.png) 0 0/175rpx auto no-repeat, url(https://eduvessel.com/images/occupationlab/login2.png) bottom right/123rpx auto no-repeat; overflow: hidden; } .wrap { position: relative; height: 60vh; padding: 214rpx 74rpx 28rpx; margin: 0 61rpx; text-align: center; background-color: #fff; border-radius: 20rpx; .logo { width: 500rpx; margin-bottom: 80rpx; } .btn { display: flex; justify-content: center; align-items: center; width: 100%; height: 88rpx; margin-bottom: 50rpx; font-size: 32rpx; color: #fff; background-color: #007EFF; border-radius: 10rpx; } .agree { display: flex; justify-content: center; align-items: center; width: 100%; text-align: center; font-size: 24rpx; color: #ccc; text { color: #007EFF; } } /deep/.check { .checklist-box { margin: 0; } .checkbox__inner { width: 40rpx !important; height: 40rpx !important; border-radius: 50% !important; } .checkbox__inner-icon { top: 8rpx !important; left: 14rpx !important; } } } </style>