vue3生成随机验证码图片插件

1、来源:

        由于identify插件中在网上大多是vue2或者是选项式API的风格,但我用的是Vue3的组合式API,所以为了方便在vue3中使用identify,将identify进行了一些修改,使得可以在vue3的setup中自由使用该子组件。

2、tcom.vue

<template>
    <div class="s-canvas">
      <canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
    </div>
</template>
<script setup>
import { nextTick } from 'vue'

var identifyCode={
  type: String,
  default: '1234'
}
//props
const props = defineProps({
    identifyCode: {
        type: String,
        default: '1234'
      },
      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: 112
      },
      contentHeight: {
        type: Number,
        default: 40
      }
})

//子组件通过 defineExpose 暴露出自身属性供父组件修改
defineExpose({
  setIdentifyCode(res){
    identifyCode= res
    drawPic()
  },
  getIdentifyCode(res){
    return identifyCode
  }
})

// 生成一个随机数
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 + ')'
}
//等页面dom元素全都挂载后再执行后面的代码
async function drawPic () {
    await nextTick()
    var canvas = document.getElementById('s-canvas')
    var ctx = canvas.getContext('2d')
    ctx.textBaseline = 'bottom'
    // 绘制背景
    ctx.fillStyle = randomColor(
      props.backgroundColorMin,
      props.backgroundColorMax
    )
    ctx.fillRect(0, 0, props.contentWidth, props.contentHeight)
    // 绘制文字
    for (let i = 0; i < identifyCode.length; i++) {
      drawText(ctx, identifyCode[i], i)
    }
    drawLine(ctx)
    drawDot(ctx)
}
function drawText (ctx, txt, i) {
    ctx.fillStyle = randomColor(props.colorMin, props.colorMax)
    ctx.font = randomNum(props.fontSizeMin, props.fontSizeMax) + 'px SimHei'
    var x = (i + 1) * (props.contentWidth / (identifyCode.length + 1))
    var y = randomNum(props.fontSizeMax, props.contentHeight - 5)
    var deg = randomNum(-30, 30)
    // 修改坐标原点和旋转角度
    ctx.translate(x, y)
    ctx.rotate(deg * Math.PI / 270)
    ctx.fillText(txt, 0, 0)
    // 恢复坐标原点和旋转角度
    ctx.rotate(-deg * Math.PI / 270)
    ctx.translate(-x, -y)

}
function drawLine (ctx) {
    // 绘制干扰线
    for (let i = 0; i < 2; i++) {
      ctx.strokeStyle = randomColor(
        props.lineColorMin,
        props.lineColorMax
      )
      ctx.beginPath()
      ctx.moveTo(
        randomNum(0, props.contentWidth),
        randomNum(0, props.contentHeight)
      )
      ctx.lineTo(
        randomNum(0, props.contentWidth),
        randomNum(0, props.contentHeight)
      )
      ctx.stroke()
    }
}
function drawDot (ctx) {
    // 绘制干扰点
    for (let i = 0; i < 20; i++) {
      ctx.fillStyle = randomColor(0, 255)
      ctx.beginPath()
      ctx.arc(
        randomNum(0, props.contentWidth),
        randomNum(0, props.contentHeight),
        1,
        0,
        2 * Math.PI
      )
      ctx.fill()
    }
}
</script>
<style scoped>
  .s-canvas {
      height: 38px;
      cursor: pointer;
  }
  .s-canvas canvas{
      margin-top: 1px;
      margin-left: 8px;
  }
</style>

上方代码放在components文件夹下。

3、要引用插件的Vue页面

下方是使用案例

<template>
    <div @click="click_tcom">
        <tcom :identifyCode="poro" ref="tc"/>
    </div>
</template>
<script setup>
import tcom from '~/components/testComponents/tcom.vue'
import {ref,onMounted} from 'vue'
var poro = "1235"
const randomNum=(min, max)=>{
    return Math.floor(Math.random() * (max - min) + min)
}
const tc = ref(null)
const identifyCodes = '1234567890abcdefghijklmnopqrstuvwxyz';//验证码输入字串
const click_tcom=()=>{
    poro=""
    makeCode(identifyCodes, 4);
    console.log(poro)
    tc.value.setIdentifyCode(poro)
}
onMounted(()=>{
    click_tcom()
})
 // 生成随机验证码
const makeCode=(o, l)=> {
    var numCode = ""
    for (let i = 0; i < l; i++) {
        numCode += identifyCodes[
        randomNum(0,identifyCodes.length)
      ]
    }
    poro = numCode
}

</script>

验证码生成图片:

4、Gitee开源地址

tcom: 对identify插件进行修改,使得能够在Vue3的setup中使用

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下代码生成vue随机验证码: ``` <template> <div> <canvas ref="canvas" @click="refreshCode"></canvas> </div> </template> <script> export default { data() { return { code: '', canvasWidth: 120, canvasHeight: 40 } }, mounted() { this.refreshCode(); }, methods: { refreshCode() { let canvas = this.$refs.canvas; let ctx = canvas.getContext('2d'); // 生成随机验证码 let chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; let length = 4; let code = ''; for (let i = 0; i < length; i++) { code += chars.charAt(Math.floor(Math.random() * chars.length)); } this.code = code; // 绘制验证码 ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight); ctx.font = 'bold 20px Arial'; ctx.fillText(code, 30, 25); // 绘制干扰线 for (let i = 0; i < 5; i++) { ctx.strokeStyle = this.randomColor(40, 180); ctx.beginPath(); ctx.moveTo(Math.random() * this.canvasWidth, Math.random() * this.canvasHeight); ctx.lineTo(Math.random() * this.canvasWidth, Math.random() * this.canvasHeight); ctx.stroke(); } // 绘制干扰点 for (let i = 0; i < 30; i++) { ctx.fillStyle = this.randomColor(0, 255); ctx.beginPath(); ctx.arc(Math.random() * this.canvasWidth, Math.random() * this.canvasHeight, 1, 0, 2 * Math.PI); ctx.fill(); } }, randomColor(min, max) { let r = Math.floor(Math.random() * (max - min) + min); let g = Math.floor(Math.random() * (max - min) + min); let b = Math.floor(Math.random() * (max - min) + min); return `rgb(${r},${g},${b})`; } } } </script> ``` 这段代码使用了canvas绘制验证码,包括验证码的生成、绘制、干扰线和干扰点的绘制。在模板中,使用canvas标签引用canvas元素,在mounted函数中调用refreshCode方法生成验证码。refreshCode方法会生成随机验证码并绘制到canvas上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值