You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.9 KiB
5.9 KiB
二维码设计方案
📋 业务分析
扫码场景分析
- 开台扫码 - 扫描球桌二维码进行开台
- 关台扫码 - 扫描球桌二维码进行关台
- 存杆柜扫码 - 扫描存杆柜二维码进行存取
- 团购券扫码 - 扫描团购券二维码使用优惠
跳转页面映射
pageScan/startTable/index - 开台选择页面
pageScan/selfStart/index - 自助开台页面
pageScan/timedStart/index - 定时开台页面
pageScan/couponStart/index - 团购券开台页面
pageScan/closeTable/index - 关台页面
pageScan/renewFee/index - 续费页面
pageScan/turnOffRestart/index - 关灯重开页面
pageScan/myCoupons/index - 我的卡券页面
pageScan/couponUse/index - 卡券使用页面
🎯 推荐方案
1. 统一处理页面 ✅ 推荐
使用 pages/qrHandler/index 作为统一的二维码处理入口
优势:
- ✅ 统一的跳转逻辑,便于维护
- ✅ 支持微信扫码和小程序内扫码
- ✅ 错误处理集中化
- ✅ 便于添加埋点和日志
- ✅ 支持复杂的业务逻辑判断
使用场景:
- 微信扫码进入小程序:
pages/qrHandler/index?q=xxx - 小程序内扫码:
pages/qrHandler/index?qrContent=xxx - 小程序码:
pages/qrHandler/index?scene=xxx
2. 二维码内容格式设计
方案A:JSON 格式 ✅ 推荐
{
"type": "table_start",
"grpSn": "TB001",
"tableId": "table_123",
"storeId": "store_456"
}
方案B:URL 格式
https://yourdomain.com/qr?type=table_start&grpSn=TB001&tableId=table_123&storeId=store_456
方案C:简单格式
table_start:TB001:table_123:store_456
🛠️ 后端实现建议
1. 二维码生成接口
// 后端接口设计
POST /api/v2/qrcode/generate
{
"type": "table_start", // 二维码类型
"grpSn": "TB001", // 设备编码
"tableId": "table_123", // 球桌ID
"storeId": "store_456" // 门店ID
}
// 返回
{
"success": true,
"data": {
"qrContent": "{\"type\":\"table_start\",\"grpSn\":\"TB001\",\"tableId\":\"table_123\",\"storeId\":\"store_456\"}",
"qrCodeUrl": "https://api.qrserver.com/v1/create-qr-code/?data=xxx"
}
}
2. 二维码类型定义
enum QRCodeType {
TABLE_START = 'table_start', // 开台
TABLE_CLOSE = 'table_close', // 关台
CABINET = 'cabinet', // 存杆柜
COUPON = 'coupon' // 团购券
}
3. 不同类型二维码的数据结构
开台二维码
{
"type": "table_start",
"grpSn": "TB001", // 设备编码(必需)
"tableId": "table_123", // 球桌ID(必需)
"storeId": "store_456", // 门店ID(必需)
"tableName": "1号台", // 球桌名称(可选)
"storeInfo": { // 门店信息(可选)
"name": "黑八大师联盟球厅",
"address": "xxx路xxx号"
}
}
关台二维码
{
"type": "table_close",
"grpSn": "TB001", // 设备编码(必需)
"tableId": "table_123", // 球桌ID(必需)
"orderId": "order_789" // 订单ID(可选)
}
存杆柜二维码
{
"type": "cabinet",
"cabinetId": "cabinet_001", // 存杆柜ID(必需)
"storeId": "store_456", // 门店ID(必需)
"cabinetNo": "A01" // 存杆柜编号(可选)
}
团购券二维码
{
"type": "coupon",
"couponCode": "MT123456", // 团购券码(必需)
"platform": "meituan", // 平台:meituan/douyin/dianping(可选)
"value": 50.00 // 券面值(可选)
}
🔄 跳转逻辑流程
graph TD
A[用户扫码] --> B[qrHandler页面]
B --> C[解析二维码内容]
C --> D{判断二维码类型}
D -->|table_start| E[跳转开台选择页面]
D -->|table_close| F[跳转关台页面]
D -->|cabinet| G[跳转存杆柜页面]
D -->|coupon| H[跳转团购券使用页面]
D -->|unknown| I[显示错误提示]
E --> J[startTable/index]
F --> K[closeTable/index]
G --> L[poleStorage/index]
H --> M[couponUse/index]
📱 小程序配置
1. 页面路径配置
在 app.config.ts 中已添加:
pages: [
// ...
'pages/qrHandler/index', // 统一二维码处理页面
]
2. 微信扫码跳转配置
需要在微信公众平台配置小程序的扫码跳转规则:
- 扫码跳转页面:
pages/qrHandler/index - 参数传递:通过
q参数传递二维码内容
⚠️ 注意事项
1. 安全考虑
- 二维码内容建议加密或签名
- 添加时效性验证
- 防止二维码被恶意复制使用
2. 用户体验
- 添加加载状态提示
- 错误情况下提供明确的引导
- 支持重新扫码功能
3. 兼容性
- 支持多种二维码格式解析
- 向后兼容旧版本二维码
- 处理异常情况的降级方案
🚀 实施步骤
-
✅ 前端已完成:
- 创建二维码处理工具
qrCodeHandler.ts - 创建统一处理页面
qrHandler/index - 更新扫码页面集成新逻辑
- 创建二维码处理工具
-
🔄 后端需要实现:
- 二维码生成接口
- 不同类型二维码的数据结构
- 二维码验证和安全机制
-
🔄 测试验证:
- 各种类型二维码的跳转测试
- 异常情况的处理测试
- 微信扫码进入的测试
💡 总结建议
给后端的建议:
- 使用统一的
pages/qrHandler/index页面作为所有二维码的处理入口 - 二维码内容采用 JSON 格式,便于扩展和解析
- 不需要为每种业务单独创建处理页面,统一处理更好维护
- 重点关注二维码的数据结构设计,确保包含必要的业务参数
这样的设计既保证了功能的完整性,又具有良好的可维护性和扩展性。