這篇文章主要介紹了如何使用vue+element-ui集成隨機(jī)驗(yàn)證碼+用戶名+密碼實(shí)現(xiàn)form表單驗(yàn)證功能,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
站在用戶的角度思考問題,與客戶深入溝通,找到磐石網(wǎng)站設(shè)計(jì)與磐石網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋磐石地區(qū)。
第一步:自定義一個(gè)生產(chǎn)隨機(jī)驗(yàn)證碼的組件,其本質(zhì)是使用canvas繪制,詳細(xì)代碼如下:
<template> <div class="s-canvas"> <canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas> </div> </template> <script> export default { name: 'SIdentify', props: { identifyCode: { type: String, default: '1234' }, fontSizeMin: { type: Number, default: 16 }, fontSizeMax: { type: Number, default: 40 }, backgroundColorMin: { type: Number, default: 180 }, backgroundColorMax: { type: Number, default: 240 }, colorMin: { type: Number, default: 50 }, colorMax: { type: Number, default: 160 }, lineColorMin: { type: Number, default: 40 }, lineColorMax: { type: Number, default: 180 }, dotColorMin: { type: Number, default: 0 }, dotColorMax: { type: Number, default: 255 }, contentWidth: { type: Number, default: 112 }, contentHeight: { type: Number, default: 38 } }, methods: { // 生成一個(gè)隨機(jī)數(shù) randomNum(min, max) { return Math.floor(Math.random() * (max - min) + min) }, // 生成一個(gè)隨機(jī)的顏色 randomColor(min, max) { var r = this.randomNum(min, max) var g = this.randomNum(min, max) var b = this.randomNum(min, max) return 'rgb(' + r + ',' + g + ',' + b + ')' }, drawPic() { var canvas = document.getElementById('s-canvas') var ctx = canvas.getContext('2d') ctx.textBaseline = 'bottom' // 繪制背景 ctx.fillStyle = this.randomColor( this.backgroundColorMin, this.backgroundColorMax ) ctx.fillRect(0, 0, this.contentWidth, this.contentHeight) // 繪制文字 for (let i = 0; i < this.identifyCode.length; i++) { this.drawText(ctx, this.identifyCode[i], i) } this.drawLine(ctx) this.drawDot(ctx) }, drawText(ctx, txt, i) { ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax) ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei' var x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1)) var y = this.randomNum(this.fontSizeMax, this.contentHeight - 5) var deg = this.randomNum(-45, 45) // 修改坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度 ctx.translate(x, y) ctx.rotate(deg * Math.PI / 180) ctx.fillText(txt, 0, 0) // 恢復(fù)坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度 ctx.rotate(-deg * Math.PI / 180) ctx.translate(-x, -y) }, drawLine(ctx) { // 繪制干擾線 for (let i = 0; i < 8; i++) { ctx.strokeStyle = this.randomColor( this.lineColorMin, this.lineColorMax ) ctx.beginPath() ctx.moveTo( this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight) ) ctx.lineTo( this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight) ) ctx.stroke() } }, drawDot(ctx) { // 繪制干擾點(diǎn) for (let i = 0; i < 100; i++) { ctx.fillStyle = this.randomColor(0, 255) ctx.beginPath() ctx.arc( this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 * Math.PI ) ctx.fill() } } }, watch: { identifyCode() { this.drawPic() } }, mounted() { this.drawPic() } } </script>
第二步:使用該組件:
我們首先新建一個(gè)vue組件,在該組件進(jìn)行布局,其中還包括用戶名和密碼的驗(yàn)證(這只是前端的簡單驗(yàn)證,真實(shí)項(xiàng)目中還需要請求登入接口進(jìn)行后端驗(yàn)證)
<template> <el-form class="login-form" status-icon :rules="loginRules" ref="loginForm" :model="loginForm" label-width="0"> <el-form-item prop="username"> <el-input size="small" @keyup.enter.native="handleLogin" v-model="loginForm.username" auto-complete="off" placeholder="請輸入用戶名"> <i slot="prefix" class="icon-yonghu"></i> </el-input> </el-form-item> <el-form-item prop="password"> <el-input size="small" @keyup.enter.native="handleLogin" :type="passwordType" v-model="loginForm.password" auto-complete="off" placeholder="請輸入密碼"> <i class="el-icon-view el-input__icon" : slot="suffix" @click="showPassword"></i> <i slot="prefix" class="icon-mima"></i> </el-input> </el-form-item> <el-form-item prop="verifycode"> <!-- 注意:prop與input綁定的值一定要一致,否則驗(yàn)證規(guī)則中的value會報(bào)undefined,因?yàn)関alue即為綁定的input輸入值 --> <el-input v-model="loginForm.verifycode" placeholder="請輸入驗(yàn)證碼" class="identifyinput"></el-input> </el-form-item> <el-form-item> <div class="identifybox"> <div @click="refreshCode"> <s-identify :identifyCode="identifyCode"></s-identify> </div> <el-button @click="refreshCode" type='text' class="textbtn">看不清,換一張</el-button> </div> </el-form-item> <el-checkbox v-model="checked">記住賬號</el-checkbox> <el-form-item> <el-button type="primary" size="small" @click.native.prevent="handleLogin" class="login-submit">登錄</el-button> </el-form-item> </el-form> </template>
第三步:生產(chǎn)隨機(jī)碼與進(jìn)行登入驗(yàn)證
<script> import { isvalidUsername } from '@/utils/validate' import SIdentify from '@/components/identify/identify.vue' export default { name: 'userlogin', data() { // 用戶名自定義驗(yàn)證規(guī)則 const validateUsername = (rule, value, callback) => { if (!isvalidUsername(value)) { callback(new Error('請輸入正確的用戶名')) } else { console.log('user', value) callback() } } // 驗(yàn)證碼自定義驗(yàn)證規(guī)則 const validateVerifycode = (rule, value, callback) => { if (value === '') { callback(new Error('請輸入驗(yàn)證碼')) } else if (value !== this.identifyCode) { console.log('validateVerifycode:', value) callback(new Error('驗(yàn)證碼不正確!')) } else { callback() } } return { fontstyle: { }, loginForm: { username: 'admin', password: '123456', verifycode: '' }, checked: false, identifyCodes: '1234567890', identifyCode: '', loginRules: { // 綁定在form表單中的驗(yàn)證規(guī)則 username: [ { required: true, trigger: 'blur', validator: validateUsername } ], password: [ { required: true, message: '請輸入密碼', trigger: 'blur' }, { min: 6, message: '密碼長度最少為6位', trigger: 'blur' } ], verifycode: [ { required: true, trigger: 'blur', validator: validateVerifycode } ] }, passwordType: 'password' } }, components: { SIdentify }, created() { }, mounted() { // 驗(yàn)證碼初始化 this.identifyCode = '' this.makeCode(this.identifyCodes, 4) }, computed: { }, props: [], methods: { // 通過改變input的type使密碼可見 showPassword() { this.fontstyle === '' ? (this.fontstyle = 'color: red') : (this.fontstyle = '') // 改變密碼可見按鈕顏色 this.passwordType === '' ? (this.passwordType = 'password') : (this.passwordType = '') }, // 點(diǎn)擊登入按鈕 handleLogin() { this.$refs.loginForm.validate(valid => { if (valid) { this.$store.dispatch('Login', this.loginForm).then(res => { this.$router.push({ path: '/dashboard/dashboard' }) }) } }) }, // 生成隨機(jī)數(shù) randomNum(min, max) { return Math.floor(Math.random() * (max - min) + min) }, // 切換驗(yàn)證碼 refreshCode() { this.identifyCode = '' this.makeCode(this.identifyCodes, 4) }, // 生成四位隨機(jī)驗(yàn)證碼 makeCode(o, l) { for (let i = 0; i < l; i++) { this.identifyCode += this.identifyCodes[ this.randomNum(0, this.identifyCodes.length) ] } console.log(this.identifyCode) } } } </script> <style scoped> .identifybox{ display: flex; justify-content: space-between; margin-top:7px; } .iconstyle{ color:#409EFF; } </style>
最后的效果如下,當(dāng)我們輸入之后鼠標(biāo)失去焦點(diǎn)就會進(jìn)行驗(yàn)證:
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何使用vue+element-ui集成隨機(jī)驗(yàn)證碼+用戶名+密碼實(shí)現(xiàn)form表單驗(yàn)證功能”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
文章題目:如何使用vue+element-ui集成隨機(jī)驗(yàn)證碼+用戶名+密碼實(shí)現(xiàn)form表單驗(yàn)證功能
本文網(wǎng)址:http://aaarwkj.com/article6/ipogig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)