- 将多个组件中的 @chageable/components 导入改为从 @/components 导入 - 在 BoxBrandList.tsx、CostList.tsx、ProductDataList.tsx 等文件中更新 ProFormBizSelect 相关组件导入 - 在 CaptchaModal/index.tsx 中将 Captcha 组件导入从 @chageable/components 改为 @/components - 在 ChannelList.tsx、CompanyList.tsx、EmployeeList.tsx 等文件中更新 ProFormUploadMaterial 导入 - 在 MaterialList.tsx 中更新 ProFormBizTreeSelect 和 ProFormUploadOss 导入 - 在 MenuList.tsx、OrderCostList.tsx 中更新 ProFormBizSelect 相关组件导入 - 在 DealerModal.tsx、MaterialModal.tsx、OrderModal.tsx 等文件中更新 SelectModal 导入 - 在 app.tsx 中将 LeftMenu 导入从 @chageable/components 改为 @/components - 新增 UploadMaterial 组件并添加到 components/index.ts 导出 - 在 Captcha 组件中添加滑动验证码功能,包含样式和交互逻辑 - 在 companyPaymentAccount 工具函数中添加 branchName 字段支持
77 lines
2.6 KiB
TypeScript
77 lines
2.6 KiB
TypeScript
import mockCaptchaData from './mockDB';
|
||
import { CaptchaRes, CheckCaptchaProps, CheckCaptchaRes } from './typing';
|
||
import { aesDecrypt } from './utils';
|
||
|
||
/**
|
||
* 异步获取验证码图片
|
||
*
|
||
* 本函数通过发送HTTP请求获取验证码图片数据,并返回解析后的数据
|
||
* 主要用于在用户登录或注册时获取验证码图片,以提高系统安全性
|
||
*
|
||
* @returns {Promise<CaptchaRes>} 返回一个Promise,解析后包含验证码图片数据的CaptchaRes对象
|
||
*/
|
||
export const getPictureMock = async (): Promise<CaptchaRes> => {
|
||
const delay = Math.random() * 800;
|
||
return new Promise<CaptchaRes>((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<CheckCaptchaRes> => {
|
||
// 生成随机延迟时间,模拟网络延迟
|
||
const delay = Math.random() * 1500;
|
||
// 定义误差范围,用于验证点击位置,不要过小或者过大,推荐范围在1到3之间
|
||
const buffer = 2;
|
||
|
||
return new Promise<CheckCaptchaRes>((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);
|
||
});
|
||
};
|