123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- <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>
|