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

【react-taro-canvas】用canvas手写一个数字、字母混合的行为验证码

用canvas手写一个数字、字母混合的行为验证码

  • 实现效果
  • 源码

实现效果

在这里插入图片描述

源码

import Taro from "@tarojs/taro";
import { View, Canvas, Input, Button } from "@tarojs/components";
import { useState, useEffect } from "react";
// 画随机线函数
function drawline(canvas, context) {// 随机线的起点x坐标是画布x坐标0位置,y坐标是画布高度的随机数context.moveTo(Math.floor(Math.random() * canvas.width),Math.floor(Math.random() * canvas.height));// 随机线的终点x坐标是画布宽度,y坐标是画布高度的随机数context.lineTo(Math.floor(Math.random() * canvas.width),Math.floor(Math.random() * canvas.height));// 线条的款context.lineWidth = 0.5;// 线条的描边属性:颜色透明度context.strokeStyle = "rgba(50,50,50,0.3)";// 在画布上画线context.stroke();
}// 画随机点函数
function drawDot(canvas, context) {let px = Math.floor(Math.random() * canvas.width),py = Math.floor(Math.random() * canvas.height);context.moveTo(px, py);context.lineTo(px + 1, py + 1);context.lineWidth = 0.1;context.stroke();
}const Captcha = () => {const [text, setText] = useState("");const [value, setValue] = useState("");useEffect(() => {drawCaptcha();}, []);const drawCaptcha = () => {const nums = ["1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","I","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","p","q","r","s","t","u","v","w","x","y","z",];// 创建 canvas 画布,并设置宽高const context = Taro.createCanvasContext("myCanvas");// canvas.width = 98;// canvas.height = 45;const canvas = {width: 98,height: 45,};// 画布填充色context.setFillStyle("#00BEFD");// 清空画布context.fillRect(0, 0, canvas.width, canvas.height);// 设置字体颜色context.fillStyle = "white";// 设置字体context.font = "25px Microsoft YaHei";const rand = [],x = [],y = [];// 绘制校验码到画布上for (let i = 0; i < 4; i++) {rand.push(rand[i]);rand[i] = nums[Math.floor(Math.random() * nums.length)];x[i] = i * 20 + 10;y[i] = Math.random() * 20 + 20;context.fillText(rand[i], x[i], y[i]);}// 画2条随机线,可以根据需要增减,画随机线主要是为了提高识别难度,防范机器识别for (let i = 0; i < 2; i++) {drawline(canvas, context);}// 画20个随机点,随机点的意义同随即线for (let i = 0; i < 20; i++) {drawDot(canvas, context);}context.draw();const currentText = rand.join("").toUpperCase();setText(currentText);console.log("res", currentText);};const validateCode = () => {if (value.toUpperCase() === text) {console.log("正确");} else {console.log("错误");}};return (<View><Canvasid="myCanvas"canvasId="myCanvas"style="width: 100px; height: 50px;"/><span onClick={drawCaptcha}>看不清换一张</span><InputcursorSpacing={100}onInput={(e) => setValue(e.target.value)}placeholder="输入验证码"value={value}/><Button onClick={validateCode}>验证</Button></View>);
};export default Captcha;
http://www.lryc.cn/news/272028.html

相关文章:

  • ctfshow——信息搜集
  • 【Linux驱动】设备树模型的LED驱动 | 查询方式的按键驱动
  • GZ075 云计算应用赛题第4套
  • 小型肉制品厂废水处理设备加工厂家
  • SpringBoot整合ElasticSearch实现CRUD操作
  • 香橙派--关于jammy-xfce-arm64.f12a43b3e629442a073a7236bf9166ce.tar.lz4的rootfs定制与镜像制作
  • 前端八股文(HTML篇)一
  • 数据结构与算法python版本之线性结构之无序表抽象数据类型有序链表抽象数据类型和总结
  • 识别pdf中论文标题并重命名PDF名称(2024.1.2,第二次更新)判断标题中是否以空格结尾
  • 01.02作业
  • WPF+Halcon 培训项目实战(11):HS组件封装
  • VUE——IDEA 启动前端工程VS文件启动前端工程
  • 自动驾驶论文
  • Java经典框架之SpringDataJPA
  • 向爬虫而生---Redis 基石篇3 <拓展List>
  • CSS渲染性能优化
  • 【C++入门】类和对象(完)
  • webshell检测方式深度剖析 --- Pixy系列二(数据流分析)
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • 使用Triton部署ONNX模型
  • Python访问ElasticSearch
  • Flutter 混合开发 - 动态下发 libflutter.so libapp.so
  • Peter算法小课堂—动态规划
  • 2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷
  • Clojure 实战(4):编写 Hadoop MapReduce 脚本
  • Django 分页(表单)
  • socket实现视频通话-WebRTC
  • simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)
  • Mysql数据库(中)——增删改查的学习(全面,详细)
  • test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup