ReactJs 构建验证码生成器

ReactJs 构建验证码生成器

验证码生成器是一种工具,它创建随机且视觉上扭曲的文本,需要用户进行输入来证明他们是人类。它通过测试人类理解能力来阻止自动化机器人访问网站或服务。我们的验证码生成器生成随机的基于文本的验证码,用户必须准确输入才能进行处理,有效确保了人与机器的交互。在本文中,我们将使用React创建一个验证码生成器。

预览图片

ReactJs 构建验证码生成器

先决条件

  • React Native简介
  • React Native组件
  • React Hooks
  • Node.js和npm

创建React Native应用的步骤

步骤1: 使用以下命令创建一个React Native应用

npx create-expo-app CaptchaGeneratorApp

步骤2: 在创建好项目文件夹,即CaptchaGeneratorApp之后,使用以下命令进行导航:

cd CaptchaGeneratorApp

项目结构:

ReactJs 构建验证码生成器

方法/功能

在这种方法中,

  • 随机字符生成: 应用程序通过从三个字符集(大写字母、小写字母和数字)中随机选择字符来生成一个验证码文本。这确保了验证码是各种字符类型的组合,使用户更难解读。
  • 随机洗牌: 生成的文本被随机洗牌,增加复杂性,防止简单的模式识别。
  • 画布可视化: 验证码动态地在一个HTML画布上绘制,为用户创建了一个视觉上的挑战。
  • 用户输入验证: 用户必须输入他们对验证码文本的解读,然后对比生成的验证码进行验证。
  • 反馈消息: 应用程序根据用户输入的准确性提供反馈信息,如成功或错误。一个“重新加载”按钮为后续尝试生成一个新的验证码。

示例: 在这个示例中,我们将使用上述解释的方法。

//App.js 
  
import React, { useState, useEffect, useRef } from 'react'; 
import './style.css'; 
  
function App() { 
    const [captchaText, setCaptchaText] = useState(''); 
    const [userInput, setUserInput] = useState(''); 
    const canvasRef = useRef(null); 
  
    useEffect(() => { 
        const canvas = canvasRef.current; 
        const ctx = canvas.getContext('2d'); 
        initializeCaptcha(ctx); 
    }, []); 
  
    const generateRandomChar = (min, max) => 
        String.fromCharCode(Math.floor 
            (Math.random() * (max - min + 1) + min)); 
  
    const generateCaptchaText = () => { 
        let captcha = ''; 
        for (let i = 0; i < 3; i++) { 
            captcha += generateRandomChar(65, 90); 
            captcha += generateRandomChar(97, 122); 
            captcha += generateRandomChar(48, 57); 
        } 
        return captcha.split('').sort( 
            () => Math.random() - 0.5).join(''); 
    }; 
  
    const drawCaptchaOnCanvas = (ctx, captcha) => { 
        ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); 
        const textColors = ['rgb(0,0,0)', 'rgb(130,130,130)']; 
        const letterSpace = 150 / captcha.length; 
        for (let i = 0; i < captcha.length; i++) { 
            const xInitialSpace = 25; 
            ctx.font = '20px Roboto Mono'; 
            ctx.fillStyle = textColors[Math.floor( 
                Math.random() * 2)]; 
            ctx.fillText( 
                captcha[i], 
                xInitialSpace + i * letterSpace, 
                  
                // Randomize Y position slightly 
                Math.floor(Math.random() * 16 + 25), 
                100 
            ); 
        } 
    }; 
  
    const initializeCaptcha = (ctx) => { 
        setUserInput(''); 
        const newCaptcha = generateCaptchaText(); 
        setCaptchaText(newCaptcha); 
        drawCaptchaOnCanvas(ctx, newCaptcha); 
    }; 
  
    const handleUserInputChange = (e) => { 
        setUserInput(e.target.value); 
    }; 
  
    const handleCaptchaSubmit = () => { 
        if (userInput === captchaText) { 
            alert('Success'); 
        } else { 
            alert('Incorrect'); 
            const canvas = canvasRef.current; 
            const ctx = canvas.getContext('2d'); 
            initializeCaptcha(ctx); 
        } 
    }; 
  
    return ( 
        <div> 
            <h2 className="heading"> 
                Captcha Generator Using React 
            </h2> 
            <div className="container"> 
                <div className="wrapper"> 
                    <canvas ref={canvasRef} 
                        width="200"
                        height="70"> 
  
                    </canvas> 
                    <button id="reload-button" onClick={ 
                        () => initializeCaptcha( 
                            canvasRef.current.getContext('2d'))}> 
                        Reload 
                    </button> 
                </div> 
                <input 
                    type="text"
                    id="user-input"
                    placeholder="Enter the text in the image"
                    value={userInput} 
                    onChange={handleUserInputChange}/> 
                      
                <button id="submit-button"
                    onClick={handleCaptchaSubmit}> 
                    Submit 
                </button> 
            </div> 
        </div> 
    ); 
} 
  
export default App;

CSS

/*style.css*/
  
* { 
    padding: 0; 
    margin: 0; 
    box-sizing: border-box; 
} 
  
body { 
    height: 100vh; 
    background: white; 
} 
  
.container { 
    width: 30rem; 
    background-color: #ffffff; 
    padding: 70px; 
    border-radius: 30px; 
    position: absolute; 
    transform: translate(-50%, -50%); 
    top: 45%; 
    left: 50%; 
    box-shadow: 0px 0px 30px 0px black; 
} 
  
.heading { 
    margin: 50px; 
    font-size: 30px; 
    text-align: center; 
    color: green; 
} 
  
.wrapper { 
    display: flex; 
    align-content: center; 
    justify-content: space-between; 
    margin: 1em 0; 
} 
  
canvas { 
    border: 2px solid crimson; 
    border-radius: 20px; 
} 
  
button#reload-button { 
    font-size: 26px; 
    width: 4.6em; 
    background-color: green; 
    cursor: pointer; 
    border: none; 
    border-radius: 0.4em; 
    color: #ffffff; 
} 
  
button#reload-button:hover { 
    background-color: rgb(46, 153, 46); 
} 
  
input[type='text'] { 
    font-family: 'Roboto Mono', monospace; 
    font-size: 1rem; 
    width: 100%; 
    padding: 16px; 
    border: 2px solid crimson; 
    border-radius: 20px; 
} 
  
button#submit-button { 
    width: 100%; 
    color: #ffffff; 
    font-size: 1.5em; 
    border: none; 
    margin-top: 1em; 
    padding: 0.8em 0; 
    border-radius: 0.4em; 
    background-color: green; 
    cursor: pointer; 
} 
  
button#submit-button:hover { 
    background-color: rgb(53, 175, 53); 
}

运行步骤:

要运行React Native应用程序,请使用以下命令:

npm start

输出:

ReactJs 构建验证码生成器

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程