vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的實(shí)例代碼
先給大家展示下效果圖:
1.html代碼
<div class="form-group" style="display: flex;"> <div> <span>驗(yàn)證碼:</span> <input type="text" id="code" v-model="code" class="code" placeholder="請(qǐng)輸入您的驗(yàn)證碼" /> </div> <div class="login-code" @click="refreshCode"> <!--驗(yàn)證碼組件--> <s-identify :identifyCode="identifyCode"></s-identify> </div> </div>
2.css樣式
/*驗(yàn)證碼樣式*/ .code{ width:124px; height:31px; border:1px solid rgba(186,186,186,1); } .login-code{ cursor: pointer; }
3.js引入驗(yàn)證碼組件,并且定義三個(gè)變量。
import SIdentify from '../components/sidentify' components: { SIdentify }, data () { return { identifyCodes: "1234567890", identifyCode: "", code:"",//text框輸入的驗(yàn)證碼 } },
4.mounted里的代碼
mounted(){ this.identifyCode = ""; this.makeCode(this.identifyCodes, 4); },
5.在created里初始化驗(yàn)證碼
6.methods里添加以下方法。
需要用到的方法
//驗(yàn)證碼 randomNum(min, max) { return Math.floor(Math.random() * (max - min) + min); }, refreshCode() { this.identifyCode = ""; this.makeCode(this.identifyCodes, 4); }, makeCode(o, l) { for (let i = 0; i < l; i++) { this.identifyCode += this.identifyCodes[ this.randomNum(0, this.identifyCodes.length) ]; } console.log(this.identifyCode); },
在提交表單的時(shí)候?qū)︱?yàn)證碼進(jìn)行判斷。
sidentify.vue組件代碼:
<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: 25 }, fontSizeMax: { type: Number, default: 30 }, backgroundColorMin: { type: Number, default: 255 }, backgroundColorMax: { type: Number, default: 255 }, colorMin: { type: Number, default: 0 }, colorMax: { type: Number, default: 160 }, lineColorMin: { type: Number, default: 100 }, lineColorMax: { type: Number, default: 255 }, dotColorMin: { type: Number, default: 0 }, dotColorMax: { type: Number, default: 255 }, contentWidth: { type: Number, default: 112 }, contentHeight: { type: Number, default: 31 } }, methods: { // 生成一個(gè)隨機(jī)數(shù) randomNum(min, max) { return Math.floor(Math.random() * (max - min) + min) }, // 生成一個(gè)隨機(jī)的顏色 randomColor(min, max) { let r = this.randomNum(min, max) let g = this.randomNum(min, max) let b = this.randomNum(min, max) return 'rgb(' + r + ',' + g + ',' + b + ')' }, drawPic() { let canvas = document.getElementById('s-canvas') let 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' let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1)) let 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) { // 繪制干擾線(xiàn) for (let i = 0; i < 5; 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 < 80; 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> <style scoped> .s-canvas { height: 38px; } .s-canvas canvas{ margin-top: 1px; margin-left: 8px; } </style>
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- vue+element-ui集成隨機(jī)驗(yàn)證碼+用戶(hù)名+密碼的form表單驗(yàn)證功能
- vue生成隨機(jī)驗(yàn)證碼的示例代碼
- vue 實(shí)現(xiàn)通過(guò)手機(jī)發(fā)送短信驗(yàn)證碼注冊(cè)功能
- vue實(shí)現(xiàn)驗(yàn)證碼按鈕倒計(jì)時(shí)功能
- vue中手機(jī)號(hào),郵箱正則驗(yàn)證以及60s發(fā)送驗(yàn)證碼的實(shí)例
- vue實(shí)現(xiàn)驗(yàn)證碼輸入框組件
- 簡(jiǎn)單實(shí)現(xiàn)vue驗(yàn)證碼60秒倒計(jì)時(shí)功能
- 基于vue的短信驗(yàn)證碼倒計(jì)時(shí)demo
- Vue.js實(shí)現(xiàn)移動(dòng)端短信驗(yàn)證碼功能
- Vue 短信驗(yàn)證碼組件開(kāi)發(fā)詳解
相關(guān)文章
vue?axios?form-data格式傳輸數(shù)據(jù)和文件方式
這篇文章主要介紹了vue?axios?form-data格式傳輸數(shù)據(jù)和文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Vue生命周期中的八個(gè)鉤子函數(shù)相機(jī)
這篇文章主要為大家介紹了Vue生命周期中的八個(gè)鉤子函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12vue下history模式刷新后404錯(cuò)誤解決方法
這篇文章主要介紹了vue下history模式刷新后404錯(cuò)誤解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08vue實(shí)現(xiàn)宮格輪轉(zhuǎn)抽獎(jiǎng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)宮格輪轉(zhuǎn)抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11在vue中實(shí)現(xiàn)嵌套頁(yè)面(iframe)
這篇文章主要介紹了在vue中實(shí)現(xiàn)嵌套頁(yè)面(iframe),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07vue如何實(shí)現(xiàn)未登錄不能訪(fǎng)問(wèn)某些頁(yè)面
這篇文章主要介紹了vue如何實(shí)現(xiàn)未登錄不能訪(fǎng)問(wèn)某些頁(yè)面問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03