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 + springboot)