当前位置: 首页 > article >正文

微信小程序添加图片验证码

生成验证码代码来源:https://blog.csdn.net/java558/article/details/118105910,我把业务代码抽出来弄成一个组件。自己调试过程中遇到了一点问题。

实现

<!-- components/captcha/captcha.wxml -->
<view class="captcha-box ">
  <canvas class="captcha verify-class" type="2d" id="captchaCanvas" bind:tap="changeCode"/>
</view>
// components/captcha/captcha.js
Component({
  /**
   * 页面的初始数据
   */
  data: {
    verificationCode: "",
    text: ""
  },
  ready: function() {
      const that = this;
      that.refreshCode()
    },
  methods: {
    // 点击改变验证码
    changeCode: function () {
      this.refreshCode();
    },
    randomNum: function (min, max) {
      return Math.floor(Math.random() * (max - min) + min);
    },
    // 生成一个随机色
    randomColor: function (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})`;
    },
    // 重新绘制图片验证码
    refreshCode: function () {
      wx.createSelectorQuery().in(this)
        .select('#captchaCanvas') // 在 WXML 中填入的 id
        .fields({
          node: true,
          size: true
        })
        .exec((res) => {
          // Canvas 对象
          const canvas = res[0].node
          // 渲染上下文
          const ctx = canvas.getContext('2d')
          // Canvas 画布的实际绘制宽高
          const width = res[0].width
          const height = res[0].height

          // 初始化画布大小
          const dpr = wx.getWindowInfo().pixelRatio;
          canvas.width = width * dpr
          canvas.height = height * dpr
          ctx.scale(dpr, dpr);
          // 填充一个矩形
          ctx.fillStyle = this.randomColor(180, 240); //颜色若太深可能导致看不清
          ctx.fillRect(0, 0, 90, 28)
          /**绘制文字**/
          var arr;
          var text = '';
          var str = 'ABCEFGHJKLMNPQRSTWXY123456789';
          for (var i = 0; i < 4; i++) {
            var txt = str[this.randomNum(0, str.length)];
            ctx.fillStyle = this.randomColor(50, 160); //随机生成字体颜色
            ctx.font = this.randomNum(20, 26) + 'px SimHei'; //随机生成字体大小
            var x = 5 + i * 20;
            var y = this.randomNum(20, 25);
            var deg = this.randomNum(-20, 20);
            //修改坐标原点和旋转角度
            ctx.translate(x, y);
            ctx.rotate(deg * Math.PI / 180);
            ctx.fillText(txt, 5, 0);
            text = text + txt;
            //恢复坐标原点和旋转角度
            ctx.rotate(-deg * Math.PI / 180);
            ctx.translate(-x, -y);
          }
          /**绘制干扰线**/
          for (var i = 0; i < 4; i++) {
            ctx.strokeStyle = this.randomColor(40, 180);
            ctx.beginPath();
            ctx.moveTo(this.randomNum(0, 90), this.randomNum(0, 28));
            ctx.lineTo(this.randomNum(0, 90), this.randomNum(0, 28));
            ctx.stroke();
          }
          /**绘制干扰点**/
          for (var i = 0; i < 20; i++) {
            ctx.fillStyle = this.randomColor(0, 255);
            ctx.beginPath();
            ctx.arc(this.randomNum(0, 90), this.randomNum(0, 28), 1, 0, 2 * Math.PI);
            ctx.fill();
          }
          // ctx.draw(false, function() {
          this.setData({
            text: text
          })
          console.log("text", text);
          this.triggerEvent("imgVerify", text);
          // });
        })
    },
  },
})

效果图
有一点小问题,就是红框的位置实际才是canvas的大小,

问题

  1. wx.createSelectorQuery()后面要加in(this),不然会报下面的错
    报错
    在这里插入图片描述
  2. 在组件的生命周期,初始化canvas要写在ready,不然也会报问题1那个错
    在这里插入图片描述
  3. 做的时候canvas出现了,但是没有绘制到图片验证码。我是把它写在页面底部,但是拉一下滚动条又出现了。不知道是什么问题。用wx:if设置显示隐藏后,就正常了。

http://www.kler.cn/a/407708.html

相关文章:

  • 神经网络中常用的激活函数(公式 + 函数图像)
  • 鸿蒙操作系统(HarmonyOS)开发的初学者了解和入门
  • Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven
  • 51c大模型~合集76
  • Docker核心概念总结
  • 微知-ib_write_bw的各种参数汇总(-d -q -s -R --run_infinitely)
  • 11.19 机器学习-岭回归+拉索回归+逻辑回归
  • 生成式AI;语义通信技术;生成式AI辅助的云边协同算法及其可解释性
  • Fakelocation Server服务器/专业版 Windows11
  • 深度学习2
  • Pytorch使用手册-Build the Neural Network(专题五)
  • 如何下载链接为blob类型的视频,video 标签 src:blob 链接转下载MP4
  • React (三)
  • Linux 把进程为D(不可中断进程)转换成其他状态
  • 1000:入门测试题目(http://ybt.ssoier.cn:8088/problem_show.php?pid=1000)
  • STM32完全学习——STM32F407ZG7T6使用标准库点亮LED
  • 全新配置ubuntu18.04深度学习环境
  • 管家婆财贸ERP BR040.销售单明细表变更
  • 企业信息化-走进身份管理之搭建篇
  • 实验五:基于 BGP 实现 AS 间通信
  • MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案
  • 如何创建Python代理池(代理示例)
  • P1 练习卷(C++4道题)
  • ElasticSearch学习笔记五:ES查询(一)
  • stm32 点亮LED
  • listening comprehension