uni-app 之驗證碼


手機APP---驗證碼

最近公司在開發手機APP,app避不可免的就是登錄了,emmmm 登錄驗證碼那必須的是有的,我們公司發給我們的圖片是醬紫的~~

  這個要求大家應該都能看懂,做這個手機號啊,驗證碼啊,讀秒這些啊,這都emmmm分分鍾完成了?但是這個四位數的驗證碼整整折磨了我四天,啊!!!! 惡龍咆哮~

  其實這個實現 並不難,剛進入頁面的時候,獲取第一個input的焦點,最大長度為1,輸入完成后自動跳到下一個input框,最開始的時候,focus全部為false,跳到是變為true,然后刪除時,跳回到上一個input,真的是這樣說的很溜,但是這個真的折磨了我四天,想了我能想到的,結果這個方案還是廢棄掉了,(不包含我很菜的原因),我在解決這個問題的時候發現了一個很嚴重的問題,就是在uni-app上的時候使用他的input這個輸入框的時候,使用它的@input的時候,他會跟v-model  emmmm,怎么說,,,,姑且說是沖突把,它獲取不到第一個輸入數據的內容,像我上面的有四個input,但是就只能獲取到他的三個數據,第一個數據是獲取不到的,input出來的值跟v-model的值是對不上的,后來,我解決了這個問題,我將input里面的。detail.value的值直接賦值給了model對應的字段,‘強行’讓他們一樣的,BUT!!!這個問題解決完之后,還有一系列,,,直接把我逼瘋emmmm,后來項目更新在急,就把這個先廢棄了,等有空了向大佬請教再去研究他,然后我換了另一種方法,手動搭建還原了一個鍵盤,通過鍵盤的點擊,獲取值,然后我在顯示在view中

具體如下:

   說起這個樣式,不得不說自己今天剛剛認識的一個display:table ,才發現自己是真的菜啊,別人不是白說的,我以前用display僅僅限於 none,block,inline,flex。我今天看見display:table的時候震驚壞了,后來我上了W3C仔細看了看,他講的是將元素座位塊集表格來顯示,是一個類似於table的,表格前后還是帶有 換行符的,看一下具體代碼

  html:

  <view class="dialog-bd">
    <view class="code-view">
      <view v-for="(code,index) of codeAry" :v-key="index" class="code-item">{{code.val}}</view>
    </view>
  </view>

  js:

  codeAry: [{"val": ""}, {"val": ""}, {"val": ""}, {"val": ""}],          //將四位驗證碼寫成數組遍歷

  css樣式:

        .code-view {
		height: 150upx;
		display: table;
		text-align: center;
		margin: 0 auto;
		border-collapse: separate;
		border-spacing: 10px 5px;
	}
	.code-item {
		display: table-cell;
		border-bottom: 1px solid #999;
		width: 136upx;
		font-size: 90upx;
                margin-left: 5px;
	}                

  這樣就達到了一下的效果:

     最下面的這段就是我手寫的一個鍵盤,通過點擊鍵盤來獲取鍵盤對應的值,然后顯示在上面

詳細代碼為:

<!-- 確認驗證碼 -->
<template>
	<view class="register">
		<view class="been-sent">驗證碼已發送至手機</view>
		<view class="phone-number">{{loginForm.phone}}</view>
		<view class="code">請輸入驗證碼</view>
		
		<view class="dialog-bd">
			<view class="code-view">
				<view v-for="(code,index) of codeAry" :v-key="index" class="code-item">{{code.val}}</view>
			</view>
		</view>
		<!-- 驗證碼判斷 -->
		<view class="time" v-if="ashow">
			<view class="date">{{num}}</view>
			<view class="date-content">后 可重發驗證碼</view>
		</view>
		<view v-else>
			<view class="again-content">還收不到驗證碼?請先確認手機是否安裝了短信攔截軟件或是欠費停機。均若不是,請嘗試以下方式</view>
			<view class="again-send" @click="again">重發驗證碼</view>
		</view>
		<view class="keyboard">
			<view class="keyboard-line">
				<view data-val="1" @click="bindKeyEvent" class="button-item">1</view>
				<view data-val="2" @click="bindKeyEvent" class="button-item">2</view>
				<view data-val="3" @click="bindKeyEvent" class="button-item">3</view>
			</view>
			<view class="keyboard-line">
				<view data-val="4" @click="bindKeyEvent" class="button-item">4</view>
				<view data-val="5" @click="bindKeyEvent" class="button-item">5</view>
				<view data-val="6" @click="bindKeyEvent" class="button-item">6</view>
			</view>
			<view class="keyboard-line">
				<view data-val="7" @click="bindKeyEvent" class="button-item">7</view>
				<view data-val="8" @click="bindKeyEvent" class="button-item">8</view>
				<view data-val="9" @click="bindKeyEvent" class="button-item">9</view>
			</view>
			<view class="keyboard-line">
				<view data-val="clear" @click="bindKeyEvent" class="button-item">清空</view>
				<view data-val="0" @click="bindKeyEvent" class="button-item">0</view>
				<view data-val="delete" @click="bindKeyEvent" class="button-item">x</view>
			</view>
		</view>
	</view>
</template>

<script>
	import middle from "../../middleware/login.js"
	export default {
		
		data() {
			return {
				// 驗證碼四位數組
				codeAry: [{
					"val": ""
				}, {
					"val": ""
				}, {
					"val": ""
				}, {
					"val": ""
				}],
				// 個數
				currItem: 0,
				// 驗證碼
				callResult: {
					type:0,
					code:null
				},
				// 倒數重發顯示切換
				ashow:true,
				// 驗證碼長度
				len: '4',
				// 發送參數
				loginForm:{
					isLogin: true,
					codeType:2
				},
				// 獲取的類型  判斷為注冊用戶還是忘記密碼
				type:0,
				// 倒計時
				num:60,
				// 發送參數 判斷用戶是否存在
				numlist:{
					number:'',
				},

			}
		},
		onLoad(options) {
			//接收上個頁面的type
			this.type = options.type
			if(this.type == 1){
				this.loginForm.codeType = 3
			}
			// 頁面加載獲取上個頁面穿的手機號碼
			this.loginForm.phone = options.tel
			// 清除定時器
			clearInterval(this.timer);
			// 進入頁面后就開始60秒倒數
			this.timer = setInterval(() => {
				this.num--;
				if(this.num == 0) {
					this.ashow =false
					clearInterval(this.timer)
				}
			},1000)
    	},

		methods: {
			/**
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 鍵盤點擊事件
			*/
			bindKeyEvent: function(e) {
				var _this = this;
				var val = e.currentTarget.dataset.val;
				// 鍵盤各種事件
				switch (val) {
					case "clear":
						_this.clearCode();
						break;
					case "delete":
						_this.deleteCode();
						break;
					default:
						_this.inputVal(val);
						break;
				}
			},
			/*
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 拼接驗證碼
			*/
			getCodeValue:function(){
				var codeStr = "";
				this.codeAry.forEach(function(code){
					codeStr+=code.val;
				})
				return codeStr;
			},
			/*
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 清空內容
			*/
			init: function() {
				var codeAry = [];
				for (var i = 0; i < this.len; i++) {
					codeAry.push({
						val: ""
					}) 
				}
				this.codeAry = codeAry;
				this.currItem = 0;
			},
			/*
			* @author 宮麗穎 
			* @date 2019-06-19
			* @information 清空內容事件
			*/
			clearCode: function() {
				this.init();
			},
			
			/*
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 回退x 事件
			*/
			deleteCode: function() {
				if (this.currItem > 0) {
					this.codeAry[this.currItem - 1].val = "";
					this.currItem--;
				}
			},
			/**
			 * @author 宮麗穎
			 * @date 2019-06-19
			 * @information 輸入內容
			 */
			inputVal: function(val) {
				if (this.currItem < this.len) {
					this.codeAry[this.currItem].val = val;
					this.currItem++;
				}
				if (this.currItem == this.len) {
					this.execuCall(1);
				}
			},
			
			/*
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 輸入完成后驗證驗證碼
			*/
			execuCall:function(type){
				let _this = this
				this.callResult.type = type;
				if(type == 1){
					this.callResult.code = this.getCodeValue();
					this.loginForm.code = this.callResult.code
					middle.codeLogin(this.loginForm).then(res => {
						if(res.statusCode == 1000){
							uni.setStorage({
								key: "phone",
								data: this.loginForm.phone
							})
							uni.showToast({
								title: '驗證通過:'+ this.loginForm.code,
								duration: 2000
							});
							setTimeout(() => {
								uni.navigateTo({
									url:`/pages/login/SetUpPassword?tel=${this.loginForm.phone}&type=${this.type}`
								})
							},500)
						}
						clearInterval(this.timer)
					})
					.catch(error =>{
						uni.showModal({
							title: '提示',
							content: '驗證碼錯誤,請重新輸入',
							showCancel:false,
							confirmColor:'#00c16f',
							success: function (res) {
								_this.init()
							}
						});
					})

				}
			},
			/*
			* @author 宮麗穎
			* @date 2019-06-19
			* @information 重新發送驗證碼
			*/
			again:function () {
				this.ashow = true
				this.num = 60;
				this.timer = setInterval(() => {
					this.num--;
					if(this.num == 0) {
						this.ashow =false
						clearInterval(this.timer)
					}
				},1000)
				// 將手機號賦值給number
				this.numlist.number = this.loginForm.phone
				// 訪問驗證碼接口
				middle.getCode(this.numlist)
				
			},
		}
	}
</script>

<style>
</style>

  各位大佬,代碼僅供參考,若有不足,還請改正~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM