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

前端 React 弹窗式 滑动验证码实现

目录

一、安装依赖

1、rc-slider-captcha

2、create-puzzle

二、个人封装好的组件拿去用

三、效果展示


一、安装依赖

这里需要引入两个依赖,若有后端图片接入,可以不引入第二个依赖

1、rc-slider-captcha

滑动验证码生成的库

国内网:rc-slider-captcha - npm

外网演示:https://caijf.github.io/rc-slider-captcha

yarn add rc-slider-captcha
2、create-puzzle

这个库可以让图片生成拼图

地址:create-puzzle - npm

yarn add create-puzzle

二、个人封装好的组件拿去用

注意:引入的图片尺寸需要对应,否则可能出现比例问题。

280 x 173

/*** @author: Dragon Wu* @since: 2025/4/10 17:40* @description: 弹窗显示滑动验证码*/import React, {useRef} from "react";
import SliderCaptcha from "rc-slider-captcha";
import {Modal} from "antd";
// 引入生成拼图的库
import createPuzzle from "create-puzzle";export type Result = {bgUrl: string;          // 背景图puzzleUrl: string;      // 拼图x?: number;              // x 轴偏移值。如果使用该值校验,建议前后阈值增减 5 的范围y?: number;             // y 轴偏移值,等高拼图时值始终为 0
};const ModalSliderCaptcha: React.FC<{open: boolean,                                  // 是否打开onCancel: () => void,                           // 关闭时调用range?: number,                                 // 误差范围format?: "dataURL" | "blob",                    // 拼图库format类型,默认dataURL即base64格式onVerify?: (data?: Result) => void | boolean    // 是否校验成功。非后端验证模式下,data存在代表成功,data为空代表失败request?: () => Promise<undefined | Result>     // 请求后端验证码参数modalProps?: {},                                // Modal组件的属性,见:https://ant.design/components/modal-cn#apisliderCaptchaProps?: {},                        // SliderCaptcha的属性,详情见:https://www.npmjs.com/package/rc-slider-captcha
}> = React.memo(({modalProps, sliderCaptchaProps, open, onCancel,format = "dataURL", range = 5, onVerify, request}) => {const offsetXRef = useRef(0)    // x 轴偏移值const handleOffsetX = (res?: Result) => {offsetXRef.current = res?.x ?? 0return {bgUrl: res?.bgUrl,puzzleUrl: res?.puzzleUrl}}const requestCaptcha = async () => {if (request) {return request().then(handleOffsetX)} else {return createPuzzle("/assets/img/source/captcha-bg.png", {format,width: 60,height: 60,bgWidth: 280,bgHeight: 173,quality: 1.0,       // 图片质量,默认0.8}).then(handleOffsetX)}}const onVerifyCaptcha = (data?: Result) => {if (request) {// 后端验证码模式下if (onVerify) {if (onVerify(data)) {// 后端校验通过,验证成功return Promise.resolve()}}} else {// 非后端验证模式下if (data?.x && data?.x >= offsetXRef.current - range && data?.x < offsetXRef.current + range) {if (onVerify) {onVerify(data)}return Promise.resolve()}if (onVerify) {onVerify()}}return Promise.reject()}return (<Modal {...{title: "安全验证",zIndex: 1024,style: {maxWidth: "100%",},styles: {content: {padding: 20}},centered: true,width: 320,footer: false,...modalProps}}onCancel={onCancel}open={open}><SliderCaptcha request={requestCaptcha as any}onVerify={onVerifyCaptcha as any}bgSize={{width: 280,height: 173}}tipText={{default: "向右👉拖动完成拼图",loading: "👩🏻‍💻🧑‍💻努力中...",}}style={{"--rcsc-primary": "#6153FC","--rcsc-primary-light": "#efecfc",}}loadingDelay={300}{...sliderCaptchaProps}/></Modal>)
});ModalSliderCaptcha.displayName = "ModalSliderCaptcha";export default ModalSliderCaptcha;

三、效果展示

将组件放在自己的其他组件上,通过Antd Modal的open属性来控制开关,点击按钮实现弹窗滑块验证码功能。后续,将加入如何用SpringBoot来实现滑块验证码图片生成,以完成前后端滑动验证码功能。

前端部分总结到此!

相关文章:

  • 【教程】PyTorch多机多卡分布式训练的参数说明 | 附通用启动脚本
  • 网盘文件下载功能需求分析与技术方案选择:全面解析与最佳实践
  • windows修改远程端口
  • OCP中的OCS operator介绍及应用示例
  • 如何将 Vue-FastAPI-Admin 项目的数据库从 SQLite 切换到 MySQL?
  • 量子纠缠物理本质、技术实现、应用场景及前沿研究
  • Web三漏洞学习(其一:文件上传漏洞)
  • 25.4.15学习总结
  • 代码随想录第18天:二叉树
  • 04-Seata 深度解析:从分布式事务原理到 Seata 实战落地
  • Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报
  • 【leetcode hot 100 72】编辑距离
  • MCP认证难题破解指南
  • 单片机非耦合业务逻辑框架
  • Sentinel源码—2.Context和处理链的初始化二
  • (51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
  • STM32提高篇: 以太网通讯
  • S06-Kep的跨通道传输
  • 二极管详解:特性参数、选型要点与分类
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——CAN、CAN FD测试 #FDCAN
  • 国台办:民进党当局所谓“对等尊严”,就是企图改变两岸同属一中
  • 屠呦呦当选美国国家科学院外籍院士
  • 徐徕任上海浦东新区副区长,此前已任区委常委
  • 青海西宁市城西区副区长于媛媛主动投案,接受审查调查
  • 专访|首夺天元头衔创生涯历史,王星昊打算一步一步慢慢来
  • 中共中央、国务院关于表彰全国劳动模范和先进工作者的决定