Research: Table QR Code
1. QR Code Generation Library
Decision: Google ZXing 3.5.2
Rationale:
- Java 生态最成熟的二维码库
- 项目基于 Spring Boot,ZXing 有良好的集成支持
- 支持自定义二维码尺寸、颜色、logo
- 轻量级,无需外部服务
Alternatives considered:
- QR Server API(外部服务,依赖网络,不适合生产环境)
- Apache PDFBox(主要处理 PDF,二维码支持弱)
- 前端生成(增加前端复杂度,且二维码需要后端持久化)
2. QR Code Content Format
Decision: 使用 URL 格式 {baseUrl}/scan?type={type}&storeId={storeId}&tableId={tableId}
Rationale:
- 通用二维码扫描器都能直接识别 URL 并跳转
- 参数清晰,易于调试
- 前端可以根据参数直接路由到对应页面
Alternatives considered:
- JSON 格式(需要专用扫码器,通用性差)
- 短链 + 服务端映射(增加复杂度,需要额外的映射表)
3. QR Code Storage
Decision: 后端动态生成,不存储图片文件。qr_code 字段存储二维码文本内容(URL),图片在请求时动态生成。
Rationale:
- 减少文件存储依赖
- 二维码内容可能随 baseUrl 变化,动态生成更灵活
- 二维码生成速度快(<10ms),无需缓存
Alternatives considered:
- 生成图片存文件系统(增加文件管理复杂度)
- 生成图片存 OSS(需要 OSS 配置,过度设计)
4. Permission Model
Decision: 在 Service 层通过 user_type 判断权限,Controller 层通过 JwtUtil 获取用户信息。
Rationale:
- 遵循现有项目模式(StallController 使用相同方式)
- user_type 已有明确定义:3=夜市用户, 4=摊主
- 无需引入新的权限框架
Alternatives considered:
- Spring Security 注解(项目未使用此模式)
- 自定义注解鉴权(增加复杂度,现有模式已足够)
5. Frontend QR Code Display
Decision: 后端返回二维码图片的 Base64 编码,前端直接在 img 标签中展示。
Rationale:
- 无需文件上传/下载流程
- 前端展示简单直接
- 支持下载功能(通过 a 标签 download 属性)
Alternatives considered:
- 返回图片 URL(需要文件存储)
- 前端自己生成二维码(需要额外依赖,且参数来自后端)
6. Night Market ID 获取方式
Decision: 摊主的 night_market_id 从关联的 PosStore 记录获取;夜市管理员的 night_market_id 从 InfoUser 表获取。
Rationale:
- PosStore 表已有 night_market_id 字段
- InfoUser 表中夜市用户(type=3)的地址信息关联夜市
- 遵循现有数据关系
7. Entity Pattern
Decision: 遵循 PosStore 的实体模式,使用 MyBatis Plus 注解(@TableName, @TableId)+ Lombok(@Data)。
Rationale: 项目所有实体都遵循此模式,保持一致性。