<template> <view class="page"> <view class="wrap"> <!-- <image class="logo" src="@/static/image/logo.png" mode="widthFix"></image> --> <view class="hello">幼教产业B2B产业平台登录</view> <template v-if="isLogin"> <button class="btn phone" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber"> <image src="@/static/image/phone.png" mode="widthFix"></image> {{ isReg ? '获取手机号' : '绑定手机'}} </button> </template> <template v-else> <view class="btn wechat" @click="login"> 快捷登录 </view> </template> <view class="tips">如果没有账号会自动创建账号</view> <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> <uni-popup ref="popup" :is-mask-click="false"> <view class="type-wrap"> <view class="title-wrap"> <view class="title">请选择注册类型</view> <uni-icons class="close" type="closeempty" size="20" color="#333"></uni-icons> </view> <view class="types"> <view class="item" @click="toReg(5)"> <view class="icon"> <image class="img" src="https://occupationlab.com/images/preschoolEdu/role-icon1.png" mode="widthFix" /> </view> <view class="text">我是幼儿园</view> </view> <view class="item item2" @click="toReg(6)"> <view class="icon"> <image class="img" src="https://occupationlab.com/images/preschoolEdu/role-icon2.png" mode="widthFix" /> </view> <view class="text">我是供应商</view> </view> <view class="item item3" @click="toReg(7)"> <view class="icon"> <image class="img" src="https://occupationlab.com/images/preschoolEdu/role-icon3.png" mode="widthFix" /> </view> <view class="text">我是个人</view> </view> </view> </view> </uni-popup> </view> </template> <script> import { login, userBinding, getSessionKey, kindergartenWeChatApplication, saveCertification } from '@/apis/modules/user.js' import WXBizDataCrypt from '@/libs/WXBizDataCrypt' export default { data() { return { agree: [], agreeData: [{ text: '同意', value: 1 }], isLogin: false, // 是否已登录 isReg: false, // 是否是注册 sessionKey: '', openid: '', unionid: '', code: '', phone: '', submiting: false, teamName: '' } }, onShow() { // uni.setStorageSync('token', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiaWF0IjoxNzAzNDk1ODY2LCJleHAiOjE3MDQzNTk4NjYsImFjY291bnRJZCI6IjQ5MzEifQ.A5tQewZlfVz3yiQCjPscWXvyXjOJmWzheG5b82siZl4') // uni.setStorageSync('openId', 'o3hKk686kGjgMygKdPTJd5KQQ7CA') // 先授权用户信息,再授权手机号 this.checkLogin() }, methods: { // 检查登录状态 checkLogin() { if (uni.getStorageSync('token')) { this.toIndex() } else { uni.clearStorageSync() this.isLogin = false } }, // 授权用户信息 login() { this.isReg = false if (this.agree.length) { if (this.submiting) return false const that = this uni.getUserProfile({ lang: 'zh_CN', desc: '登录', success: ({ userInfo }) => { uni.setStorageSync('userName', userInfo.nickName) uni.setStorageSync('avatar', userInfo.avatarUrl) uni.login({ success: ({ code }) => { if (code) { this.submiting = true login({ code, avatarUrl: userInfo.avatarUrl, }).then(({ data }) => { const { sessionKey, state } = data this.submiting = false // 用户不存在,则让用户授权手机号,直接让用户选择角色注册 if (state === 'bind') { this.submiting = false this.code = code this.openid = sessionKey.openid this.sessionKey = sessionKey.session_key this.isLogin = true this.isReg = true } else { const e = data.sessionKey uni.setStorageSync('token', data.token) uni.setStorageSync('platformId', data.platformId) uni.setStorageSync('openId', e.openid) this.toIndex() } }).catch(e => { this.submiting = false }) } else { this.submiting = false that.$util.errMsg('登录失败!') } } }) }, fail(res) { that.$util.errMsg('登录授权失败!') } }) } else { this.$util.errMsg('请先阅读勾选协议!') } }, // 绑定手机号 onGetPhoneNumber(e){ if (this.submiting) return false const { encryptedData, iv } = e.detail // 获取手机号有两种方法,1.前端使用js完成;2.使用接口完成 // const WXBizDataCrypt = require('@/libs/WXBizDataCrypt') const accountInfo = uni.getAccountInfoSync() // 获取小程序appid const pc = new WXBizDataCrypt(accountInfo.miniProgram.appId , this.sessionKey) const data = pc.decryptData(encryptedData , iv) this.submiting = true const phone = data.phoneNumber this.phone = phone if (this.isReg) { // 注册 this.submiting = false this.$refs.popup.open('bottom') } else { // 登录绑定手机号 userBinding({ openid: this.openid, phone, unionid: this.unionid, platformId: 4 }).then(res => { const { token, status } = res if (status == 10014) { // 这里需要再调一次uni的login,因为code用过了一次,已经失效了 uni.login({ success: ({ code }) => { getSessionKey({ code, }).then(({ sessionKey }) => { this.sessionKey = sessionKey.session_key this.openid = sessionKey.openid this.$util.to(`../reg/reg?openid=${this.openid}&phone=${phone}`) }).catch(e => {}) this.isReg = true } }) } else { this.submiting = false uni.setStorageSync('token', token) this.toIndex() } }).catch(e => { this.submiting = false uni.showToast({ title: e.message, icon: 'none' }) }) } }, // 注册申请授权 async toReg(platformId) { if (this.submiting) return false this.submiting = true try { const { data } = await kindergartenWeChatApplication({ code: this.code, openId: this.openid, platformId, phone: this.phone }) this.teamName = data.teamName uni.setStorageSync('token', data.token) uni.setStorageSync('platformId', platformId) uni.setStorageSync('openId', data.openId) uni.setStorageSync('teamId', data.teamId) // 选择的是供应商或者幼儿园,则加一个未提交的审核状态 if (platformId === 5 || platformId === 6) { await saveCertification({ openId: data.openId, auditStatus: 0, platformSource: platformId, companyName: this.teamName }) } this.toIndex() } catch(e) { this.submiting = false } }, toAgreement(id) { this.$util.openFile(id) }, // 跳转到首页 toIndex() { uni.reLaunch({ url: '../index/index' }) } } } </script> <style scoped lang="scss"> .page { min-height: calc(100vh - 170rpx); padding-top: 170rpx; background: url(@/static/image/login1.png) 0 0/175rpx auto no-repeat, url(@/static/image/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: 393rpx; } .hello { margin: 36rpx 0; font-size: 28rpx; color: #333; } .tips { margin-top: 30rpx; font-size: 24rpx; color: #adadad; text-align: right; } .btn { display: flex; justify-content: center; align-items: center; width: 100%; height: 88rpx; font-size: 32rpx; border-radius: 10rpx; image { width: 50rpx; margin-right: 15rpx; } } .wechat { margin-bottom: 38rpx; color: #fff; background-color: #007EFF; } .phone { color: #007EFF; border: 1px solid #007EFF; background-color: #fff; image { width: 40rpx; } } .reg { font-size: 28rpx; color: #e61717; text-align: right; } .agree { position: absolute; bottom: 28rpx; left: 0%; 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; } } } .type-wrap { width: 100%; padding: 30rpx 30rpx 60rpx; background-color: #fff; border-top-left-radius: 16px; border-top-right-radius: 16px; box-sizing: border-box; .title-wrap { display: flex; justify-content: space-between; } .title { font-size: 28rpx; color: #333; } .types { width: 95%; margin: 0 auto; font-size: 24rpx; color: #fff; text-align: center; } .item { display: flex; align-items: center; height: 150rpx; padding: 0 50rpx; margin-top: 30rpx; border-radius: 12px; background: url('https://occupationlab.com/images/preschoolEdu/role-bg1.png') 0 0/100% 100% no-repeat; box-sizing: border-box; } .icon { display: inline-flex; justify-content: center; align-items: center; padding: 10rpx; margin-right: 20rpx; background-color: #fff7f1; border-radius: 50%; } .img { width: 80rpx; } .text { font-size: 24rpx; color: #fff; } .item2 { background-image: url('https://occupationlab.com/images/preschoolEdu/role-bg2.png'); } .item3 { background: #ffb150; .img { width: 70rpx; } } } </style>