import mockCaptchaData from './mockDB'; import { CaptchaRes, CheckCaptchaProps, CheckCaptchaRes } from './typing'; import { aesDecrypt } from './utils'; /** * 异步获取验证码图片 * * 本函数通过发送HTTP请求获取验证码图片数据,并返回解析后的数据 * 主要用于在用户登录或注册时获取验证码图片,以提高系统安全性 * * @returns {Promise} 返回一个Promise,解析后包含验证码图片数据的CaptchaRes对象 */ export const getPictureMock = async (): Promise => { const delay = Math.random() * 800; return new Promise((resolve) => { setTimeout(() => { // 模拟异步请求返回的数据 const keys = Object.keys(mockCaptchaData); const key = keys[Math.floor(Math.random() * keys.length)]; const obj = mockCaptchaData[key]; resolve({ token: obj.token, secretKey: obj.secretKey, originalImageBase64: obj.originalImageBase64, jigsawImageBase64: obj.jigsawImageBase64, }); }, delay); }); }; /** * 验证验证码的正确性 * * @param data 包含验证码相关信息的对象 * @param data.token 验证码的令牌 * @param data.captchaType 验证码的类型 * @param data.pointJson 用户点击的位置信息,加密后的内容 * @param data.clientUid 客户端的唯一标识 * @param data.ts 时间戳 * @returns 返回一个Promise,包含验证码验证的结果 */ export const checkCaptchaMock = async ( data: CheckCaptchaProps, ): Promise => { // 生成随机延迟时间,模拟网络延迟 const delay = Math.random() * 1500; // 定义误差范围,用于验证点击位置,不要过小或者过大,推荐范围在1到3之间 const buffer = 2; return new Promise((resolve, reject) => { // 使用setTimeout模拟异步验证过程 setTimeout(() => { if (data.token in mockCaptchaData) { const mockCaptchaRes = mockCaptchaData[data.token]; const x = mockCaptchaRes.x; // 解密用户点击的位置信息 const decryptRes = aesDecrypt(data.pointJson, mockCaptchaRes.secretKey); const point = JSON.parse(decryptRes); console.log({ captchaX: x, buffer, sliderX: point.x }); // 验证点击位置是否在有效范围内 if (!point.x || point.x > x + buffer || point.x < x - buffer) { reject('point error'); return; } // 模拟异步请求返回的数据 resolve({ token: mockCaptchaRes.token, success: true, msg: 'success' }); return; } reject('token error'); }, delay); }); };