" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue實(shí)現(xiàn)web前端登錄頁數(shù)字驗(yàn)證碼

 更新時(shí)間:2022年06月16日 16:40:35   作者:SAN822  
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)web前端登錄頁數(shù)字驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了vue實(shí)現(xiàn)web前端登錄頁數(shù)字驗(yàn)證碼的具體代碼,供大家參考,具體內(nèi)容如下

1.創(chuàng)建code.js文件夾下面是js代碼

function GVerify(options) {
? ? console.log(); // 創(chuàng)建一個(gè)圖形驗(yàn)證碼對(duì)象,接收options對(duì)象為參數(shù)
? ? this.con = document.getElementById(options)
? ? this.options = { // 默認(rèn)options參數(shù)值
? ? ? ? id: '', // 容器Id
? ? ? ? canvasId: 'verifyCanvas', // canvas的ID
? ? ? ? width: this.con.offsetWidth, // 默認(rèn)canvas寬度
? ? ? ? height: this.con.offsetHeight, // 默認(rèn)canvas高度
? ? ? ? type: 'number', // 圖形驗(yàn)證碼默認(rèn)類型blend:數(shù)字字母混合類型、number:純數(shù)字、letter:純字母
? ? ? ? code: ''
? ? }

? ? if (Object.prototype.toString.call(options) === '[object Object]') { // 判斷傳入?yún)?shù)類型
? ? ? ? for (var i in options) { // 根據(jù)傳入的參數(shù),修改默認(rèn)參數(shù)值
? ? ? ? ? ? this.options[i] = options[i]
? ? ? ? }
? ? } else {
? ? ? ? this.options.id = options
? ? }

? ? this.options.numArr = '0,1,2,3,4,5,6,7,8,9'.split(',')
? ? this.options.letterArr = getAllLetter()

? ? this._init()
? ? this.refresh()
}

GVerify.prototype = {
? ? /** 版本號(hào)**/
? ? version: '1.0.0',

? ? /** 初始化方法**/
? ? _init: function () {
? ? ? ? var canvas = document.createElement('canvas')
? ? ? ? canvas.id = this.options.canvasId
? ? ? ? let { width, height } = this.options
? ? ? ? canvas.width = width
? ? ? ? canvas.height = height
? ? ? ? canvas.style.cursor = 'pointer'
? ? ? ? canvas.innerHTML = '您的瀏覽器版本不支持canvas'
? ? ? ? this.con.appendChild(canvas)
? ? ? ? var parent = this
? ? ? ? canvas.onclick = function () {
? ? ? ? ? ? parent.refresh()
? ? ? ? }
? ? },

? ? /** 生成驗(yàn)證碼**/
? ? refresh: function () {
? ? ? ? var canvas = document.getElementById(this.options.canvasId)
? ? ? ? if (canvas.getContext) {
? ? ? ? ? ? var ctx = canvas.getContext('2d')
? ? ? ? }
? ? ? ? ctx.textBaseline = 'middle'

? ? ? ? ctx.fillStyle = randomColor(180, 240)
? ? ? ? ctx.fillRect(0, 0, this.options.width, this.options.height)

? ? ? ? if (this.options.type === 'blend') { // 判斷驗(yàn)證碼類型
? ? ? ? ? ? var txtArr = this.options.numArr.concat(this.options.letterArr)
? ? ? ? } else if (this.options.type === 'number') {
? ? ? ? ? ? var txtArr = this.options.numArr
? ? ? ? } else {
? ? ? ? ? ? var txtArr = this.options.letterArr
? ? ? ? }
? ? ? ? this.options.code = ''
? ? ? ? for (var i = 1; i <= 4; i++) {
? ? ? ? ? ? var txt = txtArr[randomNum(0, txtArr.length)]
? ? ? ? ? ? this.options.code += txt
? ? ? ? ? ? ctx.font = randomNum(this.options.height / 2, this.options.height) + 'px SimHei' // 隨機(jī)生成字體大小
? ? ? ? ? ? ctx.fillStyle = randomColor(50, 160) // 隨機(jī)生成字體顏色
? ? ? ? ? ? ctx.shadowOffsetX = randomNum(-3, 3)
? ? ? ? ? ? ctx.shadowOffsetY = randomNum(-3, 3)
? ? ? ? ? ? ctx.shadowBlur = randomNum(-3, 3)
? ? ? ? ? ? ctx.shadowColor = 'rgba(0, 0, 0, 0.3)'
? ? ? ? ? ? var x = this.options.width / 5 * i
? ? ? ? ? ? var y = this.options.height / 2
? ? ? ? ? ? var deg = randomNum(-30, 30)
? ? ? ? ? ? /** 設(shè)置旋轉(zhuǎn)角度和坐標(biāo)原點(diǎn)**/
? ? ? ? ? ? ctx.translate(x, y)
? ? ? ? ? ? ctx.rotate(deg * Math.PI / 180)
? ? ? ? ? ? ctx.fillText(txt, 0, 0)
? ? ? ? ? ? /** 恢復(fù)旋轉(zhuǎn)角度和坐標(biāo)原點(diǎn)**/
? ? ? ? ? ? ctx.rotate(-deg * Math.PI / 180)
? ? ? ? ? ? ctx.translate(-x, -y)
? ? ? ? }
? ? ? ? /** 繪制干擾線**/
? ? ? ? for (var i = 0; i < 4; i++) {
? ? ? ? ? ? ctx.strokeStyle = randomColor(40, 180)
? ? ? ? ? ? ctx.beginPath()
? ? ? ? ? ? ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height))
? ? ? ? ? ? ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height))
? ? ? ? ? ? ctx.stroke()
? ? ? ? }
? ? ? ? /** 繪制干擾點(diǎn)**/
? ? ? ? for (var i = 0; i < this.options.width / 4; i++) {
? ? ? ? ? ? ctx.fillStyle = randomColor(0, 255)
? ? ? ? ? ? ctx.beginPath()
? ? ? ? ? ? ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI)
? ? ? ? ? ? ctx.fill()
? ? ? ? }
? ? },

? ? /** 驗(yàn)證驗(yàn)證碼**/
? ? validate: function (code) {
? ? ? ? var code = code.toLowerCase()
? ? ? ? var v_code = this.options.code.toLowerCase()
? ? ? ? if (code == v_code) {
? ? ? ? ? ? return true
? ? ? ? } else {
? ? ? ? ? ? return false
? ? ? ? }
? ? }
}
/** 生成字母數(shù)組**/
function getAllLetter() {
? ? var letterStr = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'
? ? return letterStr.split(',')
}
/** 生成一個(gè)隨機(jī)數(shù)**/
function randomNum(min, max) {
? ? return Math.floor(Math.random() * (max - min) + min)
}
/** 生成一個(gè)隨機(jī)色**/
function randomColor(min, max) {
? ? var r = randomNum(min, max)
? ? var g = randomNum(min, max)
? ? var b = randomNum(min, max)
? ? return 'rgb(' + r + ',' + g + ',' + b + ')'
}

export {
? ? GVerify
}

2.code.js在組件中引入

3.在data中定義如下兩個(gè)屬性

value:"",
verifyCode: "",

4.在mounted中執(zhí)行方法

?mounted(){
? ? ? ? this.verifyCode = new GVerify("auth_code");
? ? },

5.在template中定義div需要給div設(shè)置寬高

<div id="auth_code"></div>?

6.在登錄請(qǐng)求前進(jìn)行判斷成功向下執(zhí)行,失敗return并同時(shí)執(zhí)行this.verifyCode.refresh()方法切換驗(yàn)證碼,同時(shí)按照邏輯 在登錄失敗賬號(hào)或密碼錯(cuò)誤時(shí)也需要執(zhí)行this.verifyCode.refresh()切換驗(yàn)證碼

if(this.verifyCode.validate(this.value)){
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ?this.$message({
? ? ? ? ? ? ? ? ? ? ? ? ? ? message: "驗(yàn)證碼錯(cuò)誤",
? ? ? ? ? ? ? ? ? ? ? ? ? ? type: 'warning'
? ? ? ? ? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? this.verifyCode.refresh();
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }

7.效果圖

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中緩存組件keep alive的介紹及使用方法

    vue中緩存組件keep alive的介紹及使用方法

    這篇文章主要介紹了vue緩存組件keepalive的相關(guān)資料,keep-alive組件是使用 include exclude這兩個(gè)屬性傳入組件名稱來確認(rèn)哪些可以被緩存的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-08-08
  • 詳解vue跨組件通信的幾種方法

    詳解vue跨組件通信的幾種方法

    本篇文章主要介紹了詳解vue跨組件通信的幾種方法 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue中使用@change的方法

    vue中使用@change的方法

    @change 是 Vue.js 中用于監(jiān)聽表單元素值變化的事件處理器,很多組件有@change事件,那到底如何獲取到當(dāng)前的參數(shù)呢?本文給大家詳細(xì)講解,感興趣的朋友一起看看吧
    2023-11-11
  • 如何利用Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁及右鍵菜單

    如何利用Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁及右鍵菜單

    標(biāo)簽頁一般配合菜單實(shí)現(xiàn),當(dāng)你點(diǎn)擊一級(jí)菜單或者二級(jí)菜單時(shí),可以增加對(duì)應(yīng)的標(biāo)簽頁,當(dāng)你點(diǎn)擊對(duì)應(yīng)的標(biāo)簽頁,可以觸發(fā)對(duì)應(yīng)的一級(jí)菜單或者二級(jí)菜單,下面這篇文章主要給大家介紹了關(guān)于如何利用Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁及右鍵菜單的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue實(shí)現(xiàn)微信小程序中預(yù)覽文件的縮放功能

    Vue實(shí)現(xiàn)微信小程序中預(yù)覽文件的縮放功能

    在微信小程序中,默認(rèn)情況下,文件預(yù)覽功能不支持文檔縮放,導(dǎo)致用戶在遇到小字體時(shí)難以清晰閱讀,為了解決這一問題并提升用戶體驗(yàn),實(shí)現(xiàn)文檔的縮放功能至關(guān)重要,所以本文
    2024-12-12
  • Vue封裝遠(yuǎn)程下拉框組件的實(shí)現(xiàn)示例

    Vue封裝遠(yuǎn)程下拉框組件的實(shí)現(xiàn)示例

    本文主要介紹了Vue封裝遠(yuǎn)程下拉框組件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • elementui?el-table底層背景色修改簡單方法

    elementui?el-table底層背景色修改簡單方法

    最近在做項(xiàng)目的時(shí)候遇到個(gè)需求,需要修改el-table背景色,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于elementui?el-table底層背景色修改的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Vue 實(shí)現(xiàn)輸入框新增搜索歷史記錄功能

    Vue 實(shí)現(xiàn)輸入框新增搜索歷史記錄功能

    這篇文章主要介紹了Vue 輸入框新增搜索歷史記錄功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Vue實(shí)現(xiàn)簡單跑馬燈特效

    Vue實(shí)現(xiàn)簡單跑馬燈特效

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)簡單跑馬燈特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 解決echarts中橫坐標(biāo)值顯示不全(自動(dòng)隱藏)問題

    解決echarts中橫坐標(biāo)值顯示不全(自動(dòng)隱藏)問題

    這篇文章主要介紹了解決echarts中橫坐標(biāo)值顯示不全(自動(dòng)隱藏)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評(píng)論