# AJ-Captcha-Slider-React
**Repository Path**: hyacinthovo/AJ-Captcha-React
## Basic Information
- **Project Name**: AJ-Captcha-Slider-React
- **Description**: AJ-Captcha Slider组件的 React 实现,使用 AntDesign5 完成简单的样式与交互。
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://aj-captcha-slider-react.vercel.app/
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-10-22
- **Last Updated**: 2025-08-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: React, Ant-Design
## README
# AJ-Captcha-Slider-React
## 介绍
`AJCaptcha-Slider` 是一个基于 [anji-plus/captcha](https://github.com/anji-plus/captcha) 实现的`React`滑块验证码组件,用于验证用户身份。该组件通过显示一张带有缺失部分的图片,并要求用户将缺失部分拖动到正确位置来完成验证。
> **注意:**
>
> **本项目所有图片与验证是由前端`mock`生成,后端接口请参考`AJ-Captcha`的服务端代码**🫡
>
> **GitHub:**https://github.com/anji-plus/captcha
>
> **Gitee:**https://gitee.com/anji-plus/captcha
## 原理
1. 前端获取用于验证的令牌`token`、用于加密的密钥`secretKey`、原始图片的Base64编码`originalImageBase64`和滑动验证码图片的Base64编码`jigsawImageBase64`等数据。
```typescript
/**
* 定义验证码响应类型
* 该类型用于表示验证码服务返回的数据结构
*/
export type CaptchaRes = {
/** 用于验证的令牌 */
token: string;
/** 用于加密的密钥 */
secretKey: string;
/** 原始图片的Base64编码 */
originalImageBase64: string;
/** 滑动验证码图片的Base64编码 */
jigsawImageBase64: string;
};
```
2. 通过`AJCaptcha-Slider`得到滑动过后的滑块坐标`point`,因为只是横向滑动,所以只需要使用横坐标`x`。
3. 前端将`token`、经过`secretKey`加密的坐标信息和其他需要的参数上传到服务端进行对比。
4. 服务端解密坐标信息并比对,返回比对结果。
## 效果
1. 验证失败,刷新验证图片:
2. 手动刷新验证图片:
3. 验证成功,关闭模态框:
## 在线体验
**线上体验的数据为前端`mock`生成**
[AJ-Captcha-React (aj-captcha-slider-react.vercel.app)](https://aj-captcha-slider-react.vercel.app/)
## 主要特性
- **动态加载**:组件会动态加载验证码图片和相关数据;
- **自定义样式**:支持自定义图片大小、滑块宽度、内边距等样式属性;
- **多种图标状态**:根据验证状态显示不同的图标(如成功、失败、加载中等);
- **用户提示**:在不同状态下显示相应的提示信息,引导用户完成操作;
- **适配移动端**:同时支持PC与移动端浏览器操作。
## 基本用法
```typescript
import React from 'react';
import AJCaptchaSlider from './path/to/AJCaptchaSlider';
const App = () => {
const [show, setShow] = React.useState(false);
const handleSuccess = (secret: string) => {
console.log('Verification successful:', secret);
};
const handleClose = () => {
setShow(false);
};
return (