Vue登录模块中基于canvas实现验证码组件

Posted 1024_Byte

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue登录模块中基于canvas实现验证码组件相关的知识,希望对你有一定的参考价值。

组件元素

<template>
  <div class="s-canvas">
    <canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
  </div>
</template>

父传子prop

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: 
    // 生成一个随机数
    randomNum(min, max) 
      return Math.floor(Math.random() * (max - min) + min)
    ,
    // 生成一个随机的颜色
    randomColor(min, max) 
      const r = this.randomNum(min, max)
      const g = this.randomNum(min, max)
      const b = this.randomNum(min, max)
      return 'rgb(' + r + ',' + g + ',' + b + ')'
    ,
    drawPic() 
      const canvas = document.getElementById('s-canvas')
      const 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'
      const x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
      const y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)
      var deg = this.randomNum(-45, 45)
      // 修改坐标原点和旋转角度
      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)
    ,
    drawLine(ctx) 
      // 绘制干扰线
      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) 
      // 绘制干扰点
      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()
  

父组件调用生成验证码

    <div class="login-code" @click="onRefreshCode">
        <!--验证码组件-->
        <s-identify :identifyCode="identifyCode"></s-identify>
    </div>
import SIdentify from '../components/sIdentify'
data()
	return
	 identifyCode: '',
	 identifyCodes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G']
	

methods:
	//创建随机值
    makeCode(o, l) 
      for (let i = 0; i < l; i++) 
        this.identifyCode += this.identifyCodes[this.randomNum(0, this.identifyCodes.length)]
      
    ,
    //刷新验证码
     onRefreshCode() 
      this.identifyCode = ''
      this.makeCode(this.identifyCodes, 4)
    ,
    //提交校验
    onSubmit() 
      if (this.form.valicode.toLowerCase() != this.identifyCode.toLowerCase()) 
        self.$message.error('验证码错误!')
        return
      
    

以上是关于Vue登录模块中基于canvas实现验证码组件的主要内容,如果未能解决你的问题,请参考以下文章

Vue基于ElementUI组件实现滑块登录验证组件

简易登录表单的制作,包括用户名密码随机验证码(代码完整,复制即用)

使用 vue 实现一个电子签名组件

登录校验之滑块验证码完整实现(vue + springboot)

Vue项目实战——基于 Vue3.x + Vant UI实现一个多功能记账本(登录注册页面,验证码)

vue实现获取验证码