<template> <view class="code-box"> <hx-navbar left-text="" defaultBackUrl="update_phone" transparent="hidden" > <view slot="right" class="navRight"> <button class="nextBtn" size="mini" @click="formSubmit">完成</button> </view> </hx-navbar> <view class="mRL"> <view class="title"> 输入短信验证码 </view> <view class="content"> 验证码已发送至{{mobile}},请在下方输入框内输入4位数字验证码。 </view> <view class="flex-box margin-top"> <input type="number" focus="true" :maxlength="maxlength" class="hide-input" @input="getVal" /> <block v-for="(item, index) in ranges" :key="index"> <view :class="['item', { active: codeIndex === item, middle: type === 'middle', bottom: type === 'bottom', box: type === 'box' }]"> <view class="line" v-if="type !== 'middle'"></view> <view v-if="type === 'middle' && codeIndex <= item" class="bottom-line"></view> <block v-if="isPwd && codeArr.length >= item"> <text class="dot">.</text> </block> <block v-else> {{ codeArr[index] ? codeArr[index] : ''}}</block> </view> </block> </view> <view class="timing-box margin-top"> <block v-if="timing>0"> <block v-if="postStatus"><text>正在发送短信验证...</text></block> <block v-else><text>{{timing}}秒后重新发送</text></block> </block> <block v-else> <view class="color-green" @click="resend"> 重新发送 </view> </block> </view> </view> </view> </template> <script> export default { watch: { maxlength: { immediate: true, handler: function(newV) { if (newV === 6) { this.ranges = [1, 2, 3, 4, 5, 6] } else { this.ranges = [1, 2, 3, 4] } } } }, data() { return { codeIndex: 1, mobile: '', codeArr: [], ranges: [1, 2, 3, 4], maxlength:4, isPwd: false, type: "bottom", timing: 0, tNumber: 90, postStatus: false } }, onLoad(option) { let reg =/^1[3-9]\d{9}$/; let that = this; if(!reg.exec(option.mobile)){ uni.showToast({ icon:'none', title: '手机号格式不正确!', duration: 2000 }) }else{ this.mobile = option.mobile; that.resend(); } }, methods: { getVal(e) { let { value } = e.detail let arr = value.split('') this.codeIndex = arr.length + 1 this.codeArr = arr if (this.codeIndex > Number(this.maxlength)) { //验证码输入完成以后的操作 let code =this.codeArr.join(''); console.log(code); this.updatePhone(code); } }, //验证手机号 updatePhone(c){ let that = this; uni.showLoading({mask:true}); this.$api.user.updatePhone({ phone: that.mobile, code: c }).then((res)=>{ uni.hideLoading(); if(res.data.code == '0'){ uni.showToast({ title: '完成!', icon: 'success', duration: 2000, success:function(){ //完成后返回至安全设置 if(getCurrentPages() >= 3){ uni.navigateBack({ delta: 3 }); }else{ uni.reLaunch({ url: 'security' }); } } }); } }).catch((err)=>{ uni.hideLoading(); }) }, //重新发送验证码 resend(){ let that = this; if(!that.mobile){ uni.showToast({ icon:'none', title: '手机号格式不正确!', duration: 2000 }) return; } uni.showLoading({mask:true}); this.postStatus = true this.$api.code.updatePhone({ phone: that.mobile }).then((res)=>{ uni.hideLoading(); that.postStatus = false; if(res.data.code != '0'){ uni.showToast({ title: '获取验证码失败!', duration: 2000 }); } }).catch((e)=>{ that.postStatus = false uni.hideLoading(); that.timing = 0 console.log("catch",e); }) that.timing = that.tNumber; let t = setInterval(function(){ that.timing = that.timing - 1 if(that.timing <= 0){ clearTimeout(t); } },1000) } } } </script> <style scoped> @keyframes twinkling { 0% { opacity: 0.2; } 50% { opacity: 0.5; } 100% { opacity: 0.2; } } .navRight{ height: 100%; display: flex; justify-content: center; align-items: center; margin-right: 10upx; } .nextBtn{ background: #07c160; color: #ffffff; border-color: #07c160; } .nextBtn:after{ border-color: #07c160; } .color-green{ color: #00C777; } .mRL{ margin: 30upx; } .margin-top{ margin-top: 30upx; } .title { font-size: 50upx; color: #555555; margin-bottom: 24upx; } .content { font-size: 32upx; color: #999999; } .timing-box{ color: #aaaaaa; text-align: center; } .code-box { text-align: left; } .flex-box { display: flex; justify-content: center; flex-wrap: wrap; position: relative; text-align: center; } .flex-box .hide-input { position: absolute; top: 0; left: -100%; width: 200%; height: 100%; text-align: left; z-index: 9; opacity: 1; } .flex-box .item { position: relative; width: 100upx; height: 100upx; margin-right: 18upx; font-size: 70upx; color: #555555; line-height: 100upx; } .flex-box .item:last-child { margin-right: 0; } .flex-box .middle { border: none; } .flex-box .box { box-sizing: border-box; border: 2upx solid #cccccc; border-radius: 6upx; } .flex-box .bottom { box-sizing: border-box; border-bottom: 4upx solid #d2d2d2; } .flex-box .active { border-color: #00C777; } .flex-box .active .line { display: block; } .flex-box .line { display: none; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 2upx; height: 40upx; background: #333333; animation: twinkling 1s infinite ease; } .flex-box .dot{ font-size: 80upx; line-height: 40upx; } .flex-box .bottom-line { height: 4px; background: #000000; width: 80%; position: absolute; border-radius: 2px; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style>