幼教产品B2B生态平台小程序端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

493 lines
12 KiB

1 year ago
<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>
1 year ago
<view class="tips">如果没有账号会自动创建账号</view>
1 year ago
<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>
1 year ago
1 year ago
<!-- 选择角色 -->
1 year ago
<uni-popup ref="popup" :is-mask-click="false">
<view class="type-wrap">
<view class="title-wrap">
<view class="title">请选择注册类型</view>
1 year ago
<!-- <uni-icons class="close" type="closeempty" size="20" color="#333"></uni-icons> -->
1 year ago
</view>
<view class="types">
1 year ago
<view class="item" @click="toReg(5)">
1 year ago
<view class="icon">
1 year ago
<image class="img" src="http://124.71.79.122/images/miniProgram/role-icon1.png" mode="widthFix" />
1 year ago
</view>
<view class="text">我是幼儿园</view>
</view>
1 year ago
<view class="item item2" @click="toReg(6)">
1 year ago
<view class="icon">
1 year ago
<image class="img" src="http://124.71.79.122/images/miniProgram/role-icon2.png" mode="widthFix" />
1 year ago
</view>
<view class="text">我是供应商</view>
</view>
1 year ago
<view class="item item3" @click="toReg(7)">
1 year ago
<view class="icon">
1 year ago
<image class="img" src="http://124.71.79.122/images/miniProgram/role-icon3.png" mode="widthFix" />
1 year ago
</view>
<view class="text">我是个人</view>
</view>
</view>
</view>
</uni-popup>
1 year ago
<!-- 上传头像 -->
<uni-popup ref="uploadAvatarPop" background-color="#fff" type="bottom" :mask-click="false">
<view class="avatar-wrap">
<button class="avatar-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<image class="avatar" :src="avatar ? avatar : Common.avatar" mode=""></image>
</button>
<view class="text">请选择头像</view>
<view class="btn" @click="showPlatform">下一步</view>
</view>
</uni-popup>
1 year ago
</view>
</template>
<script>
1 year ago
import { login, userBinding, getSessionKey, kindergartenWeChatApplication, saveCertification, loginWithPhoneNumber, updateAvatars } from '@/apis/modules/user.js'
1 year ago
import WXBizDataCrypt from '@/libs/WXBizDataCrypt'
1 year ago
import OSS from '@/libs/Oss/upload'
import Common from '@/config/common'
1 year ago
export default {
data() {
return {
1 year ago
Common,
1 year ago
agree: [],
agreeData: [{
text: '同意',
value: 1
}],
isLogin: false, // 是否已登录
isReg: false, // 是否是注册
sessionKey: '',
openid: '',
unionid: '',
1 year ago
code: '',
1 year ago
phone: '',
1 year ago
submiting: false,
1 year ago
teamName: '',
// avatar: Common.avatar,
avatar: '',
1 year ago
}
},
onShow() {
1 year ago
// uni.setStorageSync('token', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiaWF0IjoxNzA0Nzg1NDg5LCJleHAiOjE3MDU2NDk0ODksImFjY291bnRJZCI6IjQ5ODMiLCJzaG9wSWQiOjYsInBsYXRmb3JtSWQiOjV9.B0gXKl9gOEi9oSNZl8M_gGcqFXf9hAYbqtVHygDoYxM')
// uni.setStorageSync('openId', 'o3hKk60jbhAuLm4K3weIgQGFmv2g')
1 year ago
// 先授权用户信息,再授权手机号
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,
1 year ago
avatarUrl: userInfo.avatarUrl,
}).then(({ data }) => {
const { sessionKey, state } = data
1 year ago
this.submiting = false
1 year ago
// 用户不存在,则让用户授权手机号,直接让用户选择角色注册
1 year ago
if (state === 'bind') {
1 year ago
this.submiting = false
1 year ago
this.code = code
this.openid = sessionKey.openid
1 year ago
this.sessionKey = sessionKey.session_key
1 year ago
this.isLogin = true
this.isReg = true
1 year ago
} else {
const e = data.sessionKey
1 year ago
uni.setStorageSync('token', data.token)
uni.setStorageSync('platformId', data.platformId)
1 year ago
uni.setStorageSync('openId', e.openid)
1 year ago
this.handleTab(data.platformId)
1 year ago
this.toIndex()
1 year ago
}
}).catch(e => {
this.submiting = false
})
} else {
this.submiting = false
that.$util.errMsg('登录失败!')
}
}
})
},
fail(res) {
that.$util.errMsg('登录授权失败!')
}
})
} else {
this.$util.errMsg('请先阅读勾选协议!')
}
},
// 绑定手机号
1 year ago
async onGetPhoneNumber(e){
1 year ago
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
1 year ago
this.phone = phone
1 year ago
if (this.isReg) { // 注册
1 year ago
// 传手机号获取该手机号是否绑定了用户
const res = await loginWithPhoneNumber({
code: this.code,
openId: this.openid,
phone
})
if (res.data && res.data.platformId) {
uni.setStorageSync('token', res.data.token)
uni.setStorageSync('platformId', +res.data.platformId)
uni.setStorageSync('openId', res.data.openId)
// uni.setStorageSync('teamId', data.teamId)
} else {
1 year ago
this.$refs.uploadAvatarPop.open()
1 year ago
this.submiting = false
}
1 year ago
} 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'
})
})
}
},
// 注册申请授权
1 year ago
async toReg(platformId) {
1 year ago
if (this.submiting) return false
this.submiting = true
try {
const { data } = await kindergartenWeChatApplication({
code: this.code,
openId: this.openid,
platformId,
phone: this.phone
1 year ago
})
1 year ago
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
})
}
1 year ago
this.handleTab(platformId)
1 year ago
// 有上传头像则调上传头像接口
if (this.avatar) {
await updateAvatars({
url: this.avatar,
userName: '',
openId: data.openId,
platformId
})
}
1 year ago
this.toIndex()
} catch(e) {
this.submiting = false
1 year ago
}
1 year ago
},
toAgreement(id) {
this.$util.openFile(id)
},
1 year ago
// 供应商需要隐藏tab里的供应商入口
handleTab(platformId) {
platformId == 6 && uni.setTabBarItem({
index: 1,
visible: false
})
},
1 year ago
// 跳转到首页
toIndex() {
uni.reLaunch({
url: '../index/index'
})
1 year ago
},
// 上传头像回调
onChooseAvatar(e) {
OSS(e.detail.avatarUrl, async ({ url }) => {
this.avatar = url
})
},
// 弹出选择角色弹框
showPlatform() {
this.$refs.uploadAvatarPop.close()
this.$refs.popup.open('bottom')
},
1 year ago
}
}
</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;
}
}
}
1 year ago
.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;
1 year ago
background: url('http://124.71.79.122/images/miniProgram/role-bg1.png') 0 0/100% 100% no-repeat;
1 year ago
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 {
1 year ago
background-image: url('http://124.71.79.122/images/miniProgram/role-bg2.png');
1 year ago
}
.item3 {
background: #ffb150;
.img {
width: 70rpx;
}
}
}
1 year ago
.avatar-wrap {
padding: 30rpx 0;
.avatar-btn {
padding: 0;
line-height: 0;
border: 0 !important;
background-color: transparent;
outline: none;
border-radius: 50%;
&:after {
display: none;
}
}
.avatar {
width: 120rpx;
height: 120rpx;
border: 0;
border-radius: 50%;
}
.text {
margin-top: 10rpx;
font-size: 26rpx;
text-align: center;
color: #7d7d7d;
}
.btn {
width: 300rpx;
padding: 20rpx 0;
margin: 30rpx auto 0;
font-size: 28rpx;
color: #fff;
text-align: center;
background-color: $uni-primary;
border-radius: 20px;
}
}
1 year ago
</style>