Vue project web front-end login page digital verification code login process

1. Create the code.js folder below is the js code

function GVerify(options) {
    
    
    console.log(); // 创建一个图形验证码对象,接收options对象为参数
    this.con = document.getElementById(options)
    this.options = {
    
     // 默认options参数值
        id: '', // 容器Id
        canvasId: 'verifyCanvas', // canvas的ID
        width: this.con.offsetWidth, // 默认canvas宽度
        height: this.con.offsetHeight, // 默认canvas高度
        type: 'number', // 图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
        code: ''
    }

    if (Object.prototype.toString.call(options) === '[object Object]') {
    
     // 判断传入参数类型
        for (var i in options) {
    
     // 根据传入的参数,修改默认参数值
            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 = {
    
    
    /** 版本号**/
    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()
        }
    },

    /** 生成验证码**/
    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') {
    
     // 判断验证码类型
            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' // 随机生成字体大小
            ctx.fillStyle = randomColor(50, 160) // 随机生成字体颜色
            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)
            /** 设置旋转角度和坐标原点**/
            ctx.translate(x, y)
            ctx.rotate(deg * Math.PI / 180)
            ctx.fillText(txt, 0, 0)
            /** 恢复旋转角度和坐标原点**/
            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()
        }
        /** 绘制干扰点**/
        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()
        }
    },

    /** 验证验证码**/
    validate: function (code) {
    
    
        var code = code.toLowerCase()
        var v_code = this.options.code.toLowerCase()
        if (code == v_code) {
    
    
            return true
        } else {
    
    
            return false
        }
    }
}
/** 生成字母数组**/
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(',')
}
/** 生成一个随机数**/
function randomNum(min, max) {
    
    
    return Math.floor(Math.random() * (max - min) + min)
}
/** 生成一个随机色**/
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 is introduced in the component
insert image description here
3. The following two attributes are defined in data

value:"",
verifyCode: "",

4. Execute the method in mounted

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

5. To define a div in the template, you need to set the width and height of the div

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

6. Before the login request, judge the success and execute down, and execute the this.verifyCode.refresh() method at the same time to switch the verification code if it fails. At the same time, according to the logic, this.verifyCode.refresh( ) toggle verification code

if(this.verifyCode.validate(this.value)){
    
    
                    
            }else{
    
    
                 this.$message({
    
    
                            message: "验证码错误",
                            type: 'warning'
                            });
                this.verifyCode.refresh();
                return
            }

7. Rendering
insert image description here

Guess you like

Origin blog.csdn.net/weixin_56723577/article/details/122252862
Recommended