4.8 KiB
4.8 KiB
统一扫码功能说明
📋 功能概述
本项目实现了统一扫码入口,支持多种类型的二维码识别和处理:
- 二维码登录 - 扫码确认后台管理系统登录
- 礼品卡核销 - 管理员扫码核销礼品卡
- 礼品卡兑换 - 用户扫码兑换礼品卡
- 车辆查询 - 扫码查询车辆信息
- 未知类型 - 提供选择处理方式
🔧 技术实现
核心组件
1. API接口层 (src/api/qrLogin/)
model/index.ts- 类型定义index.ts- API接口和扫码结果解析逻辑
2. 统一扫码组件 (src/components/UniversalScanner.tsx)
useUniversalScannerHook - 提供扫码功能- 智能识别不同类型的二维码
- 权限控制和错误处理
3. 用户界面集成
UserCard.tsx- 移除管理员权限限制,所有登录用户可见扫码按钮verification.tsx- 支持从统一扫码传递参数
🎯 使用方法
在组件中使用统一扫码
import { useUniversalScanner } from '@/components/UniversalScanner';
function MyComponent() {
const { startScan } = useUniversalScanner({
onScanSuccess: (result) => {
console.log('扫码成功:', result);
},
onScanError: (error) => {
console.error('扫码失败:', error);
}
});
return (
<Button onClick={startScan}>
扫码
</Button>
);
}
扫码结果类型
export type ScanResultType =
| 'qr-login' // 二维码登录
| 'gift-verification' // 礼品卡核销
| 'gift-redeem' // 礼品卡兑换
| 'vehicle-query' // 车辆查询
| 'unknown'; // 未知类型
🔍 二维码格式识别规则
1. 二维码登录
- 格式:
qr-login:token或纯token(32位以上字符串) - 示例:
qr-login:abc123def456...或abc123def456ghi789...
2. 礼品卡核销
- 格式:JSON格式,包含
businessType: 'gift' - 示例:
{"businessType":"gift","token":"xxx","data":"yyy"}
3. 礼品卡兑换
- 格式:6位字母数字组合
- 示例:
ABC123、XYZ789
4. 车辆查询
- 格式:以
vehicle-或car-开头 - 示例:
vehicle-12345、car-abc123
5. URL格式
- 支持包含特定参数的URL
- 二维码登录:包含
qr-login-token参数 - 礼品卡:包含
gift-code参数
🛡️ 权限控制
用户权限
- 所有已登录用户:可以看到扫码按钮
- 二维码登录:需要登录状态
- 礼品卡兑换:无需特殊权限
- 车辆查询:无需特殊权限
管理员权限
- 礼品卡核销:仅管理员可用
🔄 处理流程
二维码登录流程
- 扫码获取token
- 调用
scanQrCode(token)更新状态为已扫码 - 调用
wechatMiniProgramConfirm()确认登录 - 显示成功提示
礼品卡核销流程
- 检查管理员权限
- 跳转到核销页面并传递扫码数据
- 在核销页面处理解密和验证
礼品卡兑换流程
- 直接跳转到兑换页面
- 传递兑换码参数
🚨 错误处理
常见错误类型
- 权限不足:非管理员尝试核销
- 未登录:需要登录的功能
- 二维码过期:登录token过期
- 无效二维码:格式不正确
- 网络错误:API调用失败
错误提示
- 自动显示Toast提示
- 根据错误类型显示不同消息
- 支持自定义错误处理回调
📱 用户体验
成功提示
- 二维码登录:显示确认弹窗,提示在电脑端查看
- 其他功能:显示成功Toast并跳转相应页面
未知类型处理
- 显示操作选择弹窗
- 提供复制、作为礼品卡码、作为车辆码等选项
🔧 配置选项
useUniversalScanner 参数
interface UniversalScannerProps {
/** 扫码成功回调 */
onScanSuccess?: (result: ScanResultParsed) => void;
/** 扫码失败回调 */
onScanError?: (error: string) => void;
/** 是否显示处理结果提示 */
showToast?: boolean;
}
🧪 测试建议
测试场景
- 不同用户权限:普通用户、管理员
- 不同二维码类型:登录、核销、兑换、车辆查询
- 错误情况:过期、无效、网络错误
- 边界情况:未登录、权限不足
测试数据
- 有效的登录token
- 有效的礼品卡核销JSON
- 有效的兑换码(6位)
- 有效的车辆查询码
- 无效/过期的各种码
📝 注意事项
- 安全性:登录token应该有过期时间
- 性能:扫码解析逻辑应该高效
- 用户体验:错误提示应该清晰明确
- 扩展性:新增扫码类型时只需修改解析逻辑
🔄 后续优化
- 缓存机制:缓存扫码结果避免重复处理
- 统计功能:记录扫码使用情况
- 批量处理:支持连续扫码
- 离线支持:部分功能支持离线处理