<template>
|
<u-popup :show="show" mode="bottom" round="24" :closeOnClickOverlay="closeOnMask" @close="handleClose">
|
<view class="auth-login">
|
<view class="panel">
|
<view class="close-btn" @click="handleClose">
|
<view class="close-line line-left"></view>
|
<view class="close-line line-right"></view>
|
</view>
|
|
<view class="logo-wrap">
|
<image class="logo-image" src="/static/image/logo@2x.png" mode="aspectFit"></image>
|
</view>
|
|
<view class="agreement-wrap">
|
<image class="checkbox-image" :src="localChecked ? '/static/icon/ic_accept_sel@2x.png' : '/static/icon/ic_accept@2x.png'" mode="aspectFit" @click="toggleChecked"></image>
|
<view class="agreement-text-wrap">
|
<text class="agreement-text">我已阅读并同意</text>
|
<text class="agreement-link" @click.stop="handleServiceclick">《用户服务协议》</text>
|
<text class="agreement-text">及</text>
|
<text class="agreement-link" @click.stop="handlePrivacyclick">《用户隐私政策》</text>
|
</view>
|
</view>
|
|
<button v-if="localChecked" class="login-btn" open-type="getPhoneNumber" @getphonenumber="handlePhoneLogin">手机号快捷登录</button>
|
<button v-else class="login-btn" @click="handleUncheckedLogin">手机号快捷登录</button>
|
</view>
|
</view>
|
</u-popup>
|
</template>
|
|
<script>
|
export default {
|
name: 'AuthLogin',
|
props: {
|
show: {
|
type: Boolean,
|
default: false
|
},
|
checked: {
|
type: Boolean,
|
default: false
|
},
|
closeOnMask: {
|
type: Boolean,
|
default: true
|
}
|
},
|
data() {
|
return {
|
localChecked: this.checked
|
}
|
},
|
watch: {
|
checked(value) {
|
this.localChecked = value
|
}
|
},
|
methods: {
|
toggleChecked() {
|
this.localChecked = !this.localChecked
|
this.$emit('update:checked', this.localChecked)
|
this.$emit('change', this.localChecked)
|
},
|
handleClose() {
|
this.$emit('close')
|
},
|
handleServiceclick() {
|
uni.navigateTo({
|
url: '/pages/rich-text/rich-text?type=0'
|
})
|
},
|
handlePrivacyclick() {
|
uni.navigateTo({
|
url: '/pages/rich-text/rich-text?type=1'
|
})
|
},
|
async handlePhoneLogin(event) {
|
if (event.detail.errMsg === 'getPhoneNumber:ok') {
|
uni.login({
|
provider: 'weixin',
|
success: async function(loginRes) {
|
let { code } = loginRes;
|
let res = await this.$u.api.wxLogin({ code })
|
if (res.code === 200) {
|
this.$u.api.wxAuthPhone({
|
code: event.detail.code,
|
openid: res.data.openid
|
}).then(res => {
|
if (res.code === 200) {
|
this.$store.commit('setUserInfo', res.data.member)
|
this.$store.commit('setToken', res.data.token)
|
this.$emit('close')
|
}
|
})
|
}
|
}.bind(this)
|
});
|
}
|
},
|
handleUncheckedLogin() {
|
uni.showToast({
|
title: '请先阅读并同意协议',
|
icon: 'none'
|
})
|
this.$emit('unchecked')
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.auth-login {
|
width: 100%;
|
background: #ffffff;
|
border-radius: 24rpx 24rpx 0 0;
|
}
|
|
.panel {
|
padding: 34rpx 40rpx 16rpx 40rpx;
|
box-sizing: border-box;
|
animation: auth-login-rise 0.24s ease-out;
|
}
|
|
.close-btn {
|
position: absolute;
|
right: 22rpx;
|
top: 22rpx;
|
width: 50rpx;
|
height: 50rpx;
|
}
|
|
.close-line {
|
position: absolute;
|
left: 50%;
|
top: 50%;
|
width: 28rpx;
|
height: 2rpx;
|
background: #aeb3bb;
|
}
|
|
.line-left {
|
transform: translate(-50%, -50%) rotate(45deg);
|
}
|
|
.line-right {
|
transform: translate(-50%, -50%) rotate(-45deg);
|
}
|
|
.logo-wrap {
|
display: flex;
|
justify-content: center;
|
padding-top: 42rpx;
|
}
|
|
.logo-image {
|
width: 200rpx;
|
height: 200rpx;
|
}
|
|
.agreement-wrap {
|
margin-top: 60rpx;
|
display: flex;
|
align-items: flex-start;
|
}
|
|
.checkbox-image {
|
width: 30rpx;
|
height: 30rpx;
|
margin-top: 4rpx;
|
flex-shrink: 0;
|
}
|
|
.agreement-text-wrap {
|
margin-left: 14rpx;
|
flex: 1;
|
font-size: 24rpx;
|
line-height: 1.8;
|
}
|
|
.agreement-text {
|
color: #666666;
|
}
|
|
.agreement-link {
|
color: #2E68C4;
|
}
|
|
.login-btn {
|
margin-top: 72rpx;
|
width: 100%;
|
height: 88rpx;
|
line-height: 88rpx;
|
border-radius: 44rpx;
|
background: #10B2FA;
|
font-size: 32rpx;
|
font-weight: 600;
|
color: #ffffff;
|
border: none;
|
}
|
|
.login-btn::after {
|
border: none;
|
}
|
|
@keyframes auth-login-rise {
|
from {
|
opacity: 0;
|
transform: translateY(36rpx);
|
}
|
to {
|
opacity: 1;
|
transform: translateY(0);
|
}
|
}
|
</style>
|