首页 > 其他分享 >前端验证码实现

前端验证码实现

时间:2023-03-03 10:11:41浏览次数:49  
标签:min 实现 前端 ctx 验证码 randomNum default let type

实现:

Sidentify.vue

<template>
  <div class="s-canvas">
    <canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
  </div>
</template>
<script>
export default {
  name: 'SIdentify',
  props: {
    identifyCode: {
      //默认***
      type: String,
      default: '1234'
    },
    fontSizeMin: {
      // 字体最小值
      type: Number,
      default: 25
    },
    fontSizeMax: {
      // 字体最大值
      type: Number,
      default: 35
    },
    backgroundColorMin: {
      // 验证码图片背景色最小值
      type: Number,
      default: 200
    },
    backgroundColorMax: {
      // 验证码图片背景色最大值
      type: Number,
      default: 220
    },
    dotColorMin: {
      // 背景干扰点最小值
      type: Number,
      default: 60
    },
    dotColorMax: {
      // 背景干扰点最大值
      type: Number,
      default: 120
    },
    contentWidth: {
      //容器宽度
      type: Number,
      default: 116
    },
    contentHeight: {
      //容器高度
      type: Number,
      default: 32
    }
  },
  watch: {
    identifyCode() {
      this.drawPic()
    }
  },
  mounted() {
    this.drawPic()
  },
  methods: {
    // 生成一个随机数
    randomNum(min, max) {
      return Math.floor(Math.random() * (max - min) + min)
    },
    // 生成一个随机的颜色
    randomColor(min, max) {
      let r = this.randomNum(min, max)
      let g = this.randomNum(min, max)
      let b = this.randomNum(min, max)
      return 'rgb(' + r + ',' + g + ',' + b + ')'
    },
    drawPic() {
      let canvas = document.getElementById('s-canvas')
      let 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(50, 160) //随机生成字体颜色
      ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei' //随机生成字体大小
      let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
      let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)
      var deg = this.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)
    },
    drawLine(ctx) {
      // 绘制干扰线
      for (let i = 0; i < 4; i++) {
        ctx.strokeStyle = this.randomColor(100, 200)
        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 < 30; 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()
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.s-canvas {
  height: 32px !important;
  #s-canvas {
    height: 100% !important;
  }
}
</style>

使用:

<s-identify :identify-code="identifyCode"></s-identify>
identifyCode: '',
identifyCodes: '1234567890',

mounted() {
    this.identifyCode = ''
    this.makeCode(this.identifyCodes, 4)
}

methods:{
   makeCode(o, l) {
      for (let i = 0; i < l; i++) {
        this.identifyCode += this.identifyCodes[this.randomNum(0, this.identifyCodes.length)]
      }
    },
    randomNum(min, max) {
      return Math.floor(Math.random() * (max - min) + min)
    },
   // 刷新验证码 refreshCode() { this.identifyCode = '' this.makeCode(this.identifyCodes, 4) } }

 

标签:min,实现,前端,ctx,验证码,randomNum,default,let,type
From: https://www.cnblogs.com/shiyi-iiii/p/17174620.html

相关文章

  • ABP微服务系列学习-对接前端界面
    前面我们把后端的微服务架子基本搭建完成并成功启动了,现在我们可以对接前端界面了。这里我们直接用ABP模板里面的Angular的前端界面。创建应用程序模板使用ABPCli创建一......
  • .NET Core 实现后台任务(定时任务)IHostedService
    program添加服务//.Net6builder.Services.AddHostedService<TestHostedService>();//.Net5及以下services.AddHostedService<TestHostedService>(); 添......
  • 延迟队列实现订单超时自动取消
    在上一篇Java实现订单未支付超时自动取消,使用Java自带的定时任务TimeTask实现订单超时取消,但是有小伙伴提出这种实现,会有以下几个问题:线上服务挂了,导致服务下所有的定......
  • ElasticSearch 实现分词全文检索 - 概述
    需求做一个类似百度的全文搜索功能所用的技术如下:ElasticSearchKibana管理界面IKAnalysis分词器SpringBootElasticSearch简介ES是一个使用Java语言并且基......
  • Android Studio 之连接mysql实现添加功能
    昨天经过几个小时的奋斗,终于是连接上了mysql说实话过程十分艰辛,包括查ip换网络改权限改数据库的表改网络等等之后也尝试过在自己电脑上下另一个版本的mysql但是都以......
  • LabVIEW|冒泡排序的实现
    冒泡排序简述:描述来自于大的泡泡总是先浮到水面。考虑一下,我们平时怎么给东西排序,比如有一堆苹果,需要我们按照个头从大到小排序。冒泡排序就是:先比较最右面两个苹果,如果左边......
  • 使用qsort函数实现冒泡排序(函数指针的运用)
    //此程序的本质:完全理解qsort函数的传参的原则////实现思路:因为我们是模拟qsort函数//所以我们要自己创造一个:比较数据的函数:cmp_int//因此必须有一个函数指针来接收这......
  • C# 实现你自己的异步方法
    背景最近在重构自己曾经的代码,具体需求是在Unity等待如一个模型动画,一段ui动画如下:Await的目标await的目标是一个可等待对象,而拥有GetAwaiter方法并且该方法拥有合......
  • 两数之和 II - 输入有序数组(数据结构和算法两种实现方式)
    题目:给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[ind......
  • 11.1/2 鼠标显示问题(harib08a)11.2 实现画面外的支持(harib08b)
    11.1鼠标显示问题(harib08a)存在问题:​ 在harib07d中鼠标移动到最右侧后就不能再往右移了解决办法:将if(mx>binfo->scrnx-16){mx=binfo->scrnx-16;}if(......