194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						||
	<view class="update-phone">
 | 
						||
		<view class="update-main">
 | 
						||
			<view class="old-phone">
 | 
						||
				<view class="phone-number">
 | 
						||
					<view class="title">原手机号</view>
 | 
						||
					<input type="text" v-model="oldNumber" placeholder="请输入手机号码" />
 | 
						||
				</view>
 | 
						||
				<view class="code">
 | 
						||
					<view class="title">验证码</view>
 | 
						||
					<input type="text" v-model="oldCode" placeholder="请输入验证码" />
 | 
						||
					<u-verification-code :seconds="seconds" @end="end" @start="start" ref="uOldCode" @change="oldCodeChange" unique-key="old" change-text="x秒"></u-verification-code>
 | 
						||
					<view class="get-code" @click="getCode(0)">{{ btnText[0] }}</view>
 | 
						||
				</view>
 | 
						||
			</view>
 | 
						||
			<view class="new-phone">
 | 
						||
				<view class="phone-number">
 | 
						||
					<view class="title">新手机号</view>
 | 
						||
					<input type="text" v-model="newNumber" placeholder="请输入手机号码" />
 | 
						||
				</view>
 | 
						||
				<view class="code">
 | 
						||
					<view class="title">验证码</view>
 | 
						||
					<input type="text" v-model="newCode" placeholder="请输入验证码" />
 | 
						||
					<u-verification-code :seconds="seconds" @end="end" @start="start" ref="uNewCode" @change="newCodeChange" unique-key="new" change-text="x秒"></u-verification-code>
 | 
						||
					<view class="get-code" @click="getCode(1)">{{ btnText[1] }}</view>
 | 
						||
				</view>
 | 
						||
				<u-toast ref="uToast" />
 | 
						||
			</view>
 | 
						||
		</view>
 | 
						||
		<view class="tips">注意:修改手机号需要原手机号获取验证码,无原手机验证码,请联系后台</view>
 | 
						||
		<view class="btn">保存</view>
 | 
						||
	</view>
 | 
						||
</template>
 | 
						||
<script>
 | 
						||
export default {
 | 
						||
	data() {
 | 
						||
		return {
 | 
						||
			oldNumber: '',
 | 
						||
			oldCode: '',
 | 
						||
			newNumber: '',
 | 
						||
			newCode: '',
 | 
						||
			btnText: ['获取验证码', '获取验证码'],
 | 
						||
			seconds: 60, // 获取验证码间隔时间
 | 
						||
		}
 | 
						||
	},
 | 
						||
	methods: {
 | 
						||
		verifyValue(type) {
 | 
						||
			const phone = type == 0 ? this.oldNumber : this.newNumber;
 | 
						||
			return this.$u.test.mobile(phone);
 | 
						||
		},
 | 
						||
		// @param Number type 0: 原手机号 1: 新手机号
 | 
						||
		getSmsCode (type) {
 | 
						||
			if(!this.verifyValue(type)) {
 | 
						||
				let tips = type == 0 ? '请填写正确的原手机号' : '请填写正确的新手机号';
 | 
						||
				this.$u.toast(tips);
 | 
						||
				return false;
 | 
						||
			}
 | 
						||
			if(this.seconds > 0) {
 | 
						||
				this.$u.toast('倒计时结束后再发送');
 | 
						||
			}
 | 
						||
			uni.showLoading({
 | 
						||
				title: '正在获取验证码'
 | 
						||
			})
 | 
						||
			this.$u.api.sendSmsCode({
 | 
						||
				member_mobile: type == 0 ? this.oldNumber: this.newNumber,
 | 
						||
				smslog_type: 4 // 类型[1:注册,2:登录,3:找回密码,4:绑定手机]
 | 
						||
			}).then(res => {
 | 
						||
				uni.hideLoading();
 | 
						||
				if(res.errCode == 0) {
 | 
						||
 | 
						||
				} else {
 | 
						||
					this.$u.toast(res.message);
 | 
						||
				}
 | 
						||
			})
 | 
						||
		},
 | 
						||
		oldCodeChange(text) {
 | 
						||
			this.$set(this.btnText, 0, text);
 | 
						||
		},
 | 
						||
		newCodeChange(text) {
 | 
						||
			this.$set(this.btnText, 1, text);
 | 
						||
		},
 | 
						||
		getCode(type) {
 | 
						||
			const refs = type == 0 ? this.$refs.uOldCode : this.$refs.uNewCode;
 | 
						||
			if(refs.canGetCode) {
 | 
						||
				// 模拟向后端请求验证码
 | 
						||
				uni.showLoading({
 | 
						||
					title: '正在获取验证码'
 | 
						||
				})
 | 
						||
				setTimeout(() => {
 | 
						||
					uni.hideLoading();
 | 
						||
					// 这里此提示会被this.start()方法中的提示覆盖
 | 
						||
					this.$u.toast('验证码已发送');
 | 
						||
					// 通知验证码组件内部开始倒计时
 | 
						||
					refs.start();
 | 
						||
				}, 2000);
 | 
						||
			} else {
 | 
						||
				this.$u.toast('倒计时结束后再发送');
 | 
						||
			}
 | 
						||
		},
 | 
						||
		changeMemberPhone() {
 | 
						||
			this.$u.api.changeMemberPhone({
 | 
						||
				old_mobile: this.oldNumber,
 | 
						||
				old_code: this.oldCode,
 | 
						||
				new_mobile: this.newNumber,
 | 
						||
				new_code: this.newCode,
 | 
						||
			}).then(res => {
 | 
						||
 | 
						||
			})
 | 
						||
		},
 | 
						||
		end() {
 | 
						||
			this.$u.toast('倒计时结束');
 | 
						||
		},
 | 
						||
		start() {
 | 
						||
			this.$u.toast('倒计时开始');
 | 
						||
		}
 | 
						||
	},
 | 
						||
};
 | 
						||
</script>
 | 
						||
<style lang="scss" scoped>
 | 
						||
.update-phone {
 | 
						||
	min-height: calc(100vh - var(--window-top));
 | 
						||
	background-color: #ECECEC;
 | 
						||
	padding-top: 1rpx;
 | 
						||
	.update-main {
 | 
						||
		@mixin update-General() {
 | 
						||
			> view {
 | 
						||
				display: flex;
 | 
						||
				align-items: center;
 | 
						||
				padding: 35rpx 30rpx;
 | 
						||
				background-color: #ffffff;
 | 
						||
				.title {
 | 
						||
					width: 156rpx;
 | 
						||
					font-size: 28rpx;
 | 
						||
					color: rgba(51,51,51,1);
 | 
						||
				}
 | 
						||
				.input {
 | 
						||
					width: 340rpx;
 | 
						||
					font-size: 26rpx;
 | 
						||
				}
 | 
						||
				.get-code {
 | 
						||
					flex: 1;
 | 
						||
					font-size: 28rpx;
 | 
						||
					color: rgba(153,153,153,1);
 | 
						||
					position: relative;
 | 
						||
					padding: 0 25rpx;
 | 
						||
					margin-left: 20rpx;
 | 
						||
					text-align: center;
 | 
						||
					&::after {
 | 
						||
						position: absolute;
 | 
						||
						content: "";
 | 
						||
						width: 2rpx;
 | 
						||
						height: 43rpx;
 | 
						||
						background: rgba(242,242,242,1);
 | 
						||
						left: 0;
 | 
						||
						top: 50%;
 | 
						||
						transform: translate(0, -50%);
 | 
						||
					}
 | 
						||
				}
 | 
						||
			}
 | 
						||
			.code {
 | 
						||
				display: flex;
 | 
						||
				align-items: center;
 | 
						||
				.title {
 | 
						||
					font-size: 28rpx;
 | 
						||
					color: rgba(51,51,51,1);
 | 
						||
				}
 | 
						||
			}
 | 
						||
		}
 | 
						||
		.old-phone {
 | 
						||
			@include update-General()
 | 
						||
		}
 | 
						||
		.new-phone {
 | 
						||
			@include update-General()
 | 
						||
		}
 | 
						||
	}
 | 
						||
	.tips {
 | 
						||
		padding: 20rpx 30rpx;
 | 
						||
		font-size: 24rpx;
 | 
						||
		color: rgba(102,102,102,1);
 | 
						||
		line-height: 40rpx;
 | 
						||
	}
 | 
						||
	.btn {
 | 
						||
		margin: 120rpx auto 0;
 | 
						||
		width: 690rpx;
 | 
						||
		height: 98rpx;
 | 
						||
		background: rgba(255,120,15,1);
 | 
						||
		border-radius: 49rpx;
 | 
						||
		font-size: 36rpx;
 | 
						||
		color: rgba(255,255,255,1);
 | 
						||
		line-height: 98rpx;
 | 
						||
		text-align: center;
 | 
						||
	}
 | 
						||
}
 | 
						||
</style> |