vue實(shí)現(xiàn)登錄時(shí)圖形驗(yàn)證碼
本文實(shí)例為大家分享了vue實(shí)現(xiàn)登錄時(shí)圖形驗(yàn)證碼的具體代碼,供大家參考,具體內(nèi)容如下
效果圖:
點(diǎn)擊圖案可以切換字符
1.新建 Identify.vue 組件
<template> ? <div> ? <canvas ? ? ? id="s-canvas" ? ? ? :width="contentWidth" ? ? ? :height="contentHeight"></canvas> ? </div> </template> <script> export default { ? name: "identify", ? props: { ? ? identifyCode: { ? ? ? type: String, ? ? ? default: '' ? ? }, ? ? fontSizeMin: { ? ? ? type: Number, ? ? ? default: 28 ? ? }, ? ? 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: 130 ? ? }, ? ? contentHeight: { ? ? ? type: Number, ? ? ? default: 40 ? ? } ? }, ? 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) ? ? ? let deg = this.randomNum(-30, 30) ? ? ? // 修改坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度 ? ? ? ctx.translate(x, y) ? ? ? ctx.rotate(deg * Math.PI / 270) ? ? ? ctx.fillText(txt, 0, 0) ? ? ? // 恢復(fù)坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度 ? ? ? ctx.rotate(-deg * Math.PI / 270) ? ? ? ctx.translate(-x, -y) ? ? }, ? ? drawLine (ctx) { ? ? ? // 繪制干擾線 ? ? ? for (let i = 0; i < 2; 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 < 20; 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 lang="scss" scoped> #s-canvas { ? height: 38px; } </style>
2.在父組件 index.vue注冊(cè)使用
<template> ?? ?<div @click="refreshCode" style="cursor: pointer;"> ? ? ? ? <Identify :identifyCode="identifyCode" ></Identify> ? ? </div> </template> <script> import Identify from '@/components/test/identify' export default { ? name: "index", ? components:{ ? ?Identify? ? }, ? data(){ ? ?? ?return { ?? ??? ? identifyCode: '', ? ? ? // 驗(yàn)證碼規(guī)則 ? ? ? identifyCodes: '123456789ABCDEFGHGKMNPQRSTUVWXYZ', ?? ?}? ? }, ? methods:{ ?? ?// 切換驗(yàn)證碼 ? ? refreshCode() { ? ? ? this.identifyCode = '' ? ? ? this.makeCode(this.identifyCodes, 4) ? ? ? console.log(this.identifyCode) ? ? }, ? ? // 生成隨機(jī)驗(yàn)證碼 ? ? makeCode(o, l) { ? ? ? for (let i = 0; i<l; i++) { ? ? ? ? this.identifyCode += this.identifyCodes[ ? ? ? ? ? ? Math.floor(Math.random() * (this.identifyCodes.length - 0) + 0) ? ? ? ? ? ? ] ? ? ? } ?? ?}, ?? ?mounted() { ? ? ?? ?this.refreshCode() ? } } </script> <style scoped> </style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue實(shí)現(xiàn)登錄頁(yè)面的驗(yàn)證碼以及驗(yàn)證過(guò)程解析(面向新手)
- vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能(流程詳解)
- Vue 實(shí)現(xiàn)登錄界面驗(yàn)證碼功能
- Vue實(shí)現(xiàn)手機(jī)號(hào)、驗(yàn)證碼登錄(60s禁用倒計(jì)時(shí))
- vue實(shí)現(xiàn)登錄時(shí)的圖片驗(yàn)證碼
- vue實(shí)現(xiàn)登錄驗(yàn)證碼
- Vue實(shí)現(xiàn)驗(yàn)證碼登錄的超詳細(xì)步驟
- vue前端實(shí)現(xiàn)login頁(yè)登陸驗(yàn)證碼代碼示例
相關(guān)文章
Vue項(xiàng)目保存代碼之后頁(yè)面自動(dòng)更新問(wèn)題
這篇文章主要介紹了Vue項(xiàng)目保存代碼之后頁(yè)面自動(dòng)更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制
這篇文章主要為大家學(xué)習(xí)介紹了如何基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解一下2023-07-07vue父組件通過(guò)props如何向子組件傳遞方法詳解
在Vue 中,可以使用 props 向子組件傳遞數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于vue父組件通過(guò)props如何向子組件傳遞方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08VUE使用draggable實(shí)現(xiàn)組件拖拽
這篇文章主要為大家詳細(xì)介紹了VUE使用draggable實(shí)現(xiàn)組件拖拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue?@scroll監(jiān)聽(tīng)滾動(dòng)條事件方式
這篇文章主要介紹了vue?@scroll監(jiān)聽(tīng)滾動(dòng)條事件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Vue3實(shí)現(xiàn)下拉選擇框多選功能的方法詳解
在vue的實(shí)際開(kāi)發(fā)過(guò)程中,我們?nèi)绾螌⒁赃x中的值直接渲染到頁(yè)面中,下面這篇文章主要給大家介紹了關(guān)于Vue3實(shí)現(xiàn)下拉選擇框多選功能的相關(guān)資料,需要的朋友可以參考下2023-09-09一文帶你簡(jiǎn)單理解Vue的data為何只能是函數(shù)
如果data是一個(gè)函數(shù)的話,這樣每復(fù)用一次組件,就會(huì)返回一份新的data,下面這篇文章主要給大家介紹了關(guān)于簡(jiǎn)單理解Vue的data為啥只能是函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-10-10