authorization.vue 5.2 KB
<template>
	<view>
		<uni-popup ref="authorization" background-color="#fff">
            <view class="content-page" @touchmove="stopTouchMove">
				<view class="img-box">
					<image style="width: 100rpx; height: 100rpx;margin:22rpx;" mode="aspectFill" src="../static/images/logo.png"></image>
				</view>
				<view class="text">为了更完美的体验,请授权获取电话</view>
				<button v-if="checked" class="login-btn" type="primary" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber" hover-class="none">手机号登录/注册</button>
				<button v-else class="login-btn" type="primary" @click="verifyPolicy" hover-class="none">手机号登录/注册</button>
				<view class="refuse" @click="refuse">取消</view>

				<view class="policy-fixed">
					<checkbox-group @change="changePolicy">
						<label>
							<view class="policy-box">
								<checkbox value="true" :checked="checked" color="#1677FF" style="transform:scale(0.7)" />
								<text class="text">我已阅读并同意</text>
								<text class="policy" @click.stop="readAgreement">《用户服务协议》</text>
								<text class="text"></text>
								<text class="policy" @click.stop="readPolicy">《隐私政策》</text>
							</view>
						</label>
					</checkbox-group>
				</view>
            </view>
		</uni-popup>
	</view>
</template>

<script>
	import {
		analysisMobileApi,
		getPropertyLoginApi,
		bindingUserInfoApi
	} from "@/config/api.js"
	export default {
		data() {
			return {
				checked: false,
				result: {}
			}
		},
		watch: {
			checked(newV) {
				if(newV) {
					let _this = this
					wx.login({
						success (res) {
							if (res.code) {
								_this.getCode(res.code)
							}
						}
					})
				}
			}
		},
		methods: {
			async getCode(code) {
				let {result} = await getPropertyLoginApi({code}, {custom: {load: false}})
				this.result = {...result}
			},
			onOpenLogin() {
				this.$refs.authorization.open('center')
			},
			stopTouchMove() {
				return false
			},
			refuse() {
				this.$emit('refuse')
				this.$refs.authorization.close()
				uni.showToast({
					icon: "none",
					title: '您拒绝了授权,登录失败!'
				})
			},
			verifyPolicy(e) {
				if(!this.checked) {
					uni.showToast({
						title: '请先同意协议和政策',
						icon: 'none'
					});
					return
				}
			},
			//获取手机号
			onGetPhoneNumber(e) {
				let _this = this
				if (e.detail.errMsg === "getPhoneNumber:fail user deny") { //用户决绝授权  
					//拒绝授权后弹出一些提示
					uni.showModal({
						content: '您拒绝了授权,登录失败!',
						showCancel: false
					})
				} else { //允许授权
					_this.getUserPhone(e)
				}
			},
			// 获取手机号
			async getUserPhone(e) {
				
				let res = await analysisMobileApi({
					code: e.detail.code,
					iv: e.detail.iv,
					encryptedData: e.detail.encryptedData,
					sessionKey: this.result.sessionKey
				})
				if (res.code === 200 && res.result) {
					uni.setStorageSync('openid', this.result.openid);
					let data = JSON.parse(res.result)
					uni.setStorageSync('user_phone', data.purePhoneNumber);
					this.$emit('loginEnd')
					this.$refs.authorization.close()
				}
			},
			// 绑定用户
			// async onbindingUserInfo(openId, phone) {
			// 	let res = await bindingUserInfoApi({openId, phone})
			// 	if(res.code === 200 && res.result) {
			// 		uni.setStorageSync('openid', res.result.communityUser.openid);
			// 		if(res.result.communityOwners && res.result.communityOwners.length) {	// 业主
			// 			this.$emit('loginEnd', true)
			// 		} else if(res.result.employeeVos && res.result.employeeVos.comList.length) {	// 维修员
			// 			this.$emit('loginEnd', true)
			// 		} else {
			// 			this.$emit('loginEnd', false)
			// 		}
			// 		this.$refs.authorization.close()
			// 	}
			// },
			changePolicy(e) {
				this.checked = e.detail.value.length === 1
			},
			readPolicy() {
				uni.navigateTo({
					url: '/pages/policy/policy'
				})
			},
			readAgreement() {
				uni.navigateTo({
					url: '/pages/policy/agreement'
				})
			}
		}
	}
</script>

<style lang="scss">
.content-page {
	width: 100vw;
	height: 100vh;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	align-items: center;
	position: relative;
	.img-box {
		width: 144rpx;
		height: 144rpx;
		border: 2rpx solid #E4E6E9;
		border-radius: 50%;
		margin-top: 200rpx;
	}
	.text {
		font-size: 28rpx;
		color: #3D3D3D;
		line-height: 50rpx;
		margin-top: 50rpx;
	}
	.login-btn {
		width: 578rpx;
		height: 80rpx;
		line-height: 80rpx;
		font-size: 28rpx;
		color: #FFFFFF;
		background: #6799F1;
		border-radius: 200rpx;
		margin-top: 72rpx;
	}
	.refuse {
		font-size: 28rpx;
		color: #767676;
		line-height: 33rpx;
		margin-top: 34rpx;
	}

	.policy-fixed {
		position: fixed;
		bottom: 160rpx;
		left: 0;
		right: 0;
		z-index: 11;

		.policy-box {
			padding: 0 30rpx;
			font-size: 14px;
			vertical-align: middle;

			.text {
				color: #191A23;
				vertical-align: middle;
			}
			.policy {
				color: #1677FF;
				vertical-align: middle;
			}
		}
	}
}
</style>