vending-machine/.kiro/specs/vending-machine-app/tasks.md
2026-04-03 06:07:13 +08:00

285 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 实现计划:贩卖机配套移动端 App
## 概述
本实现计划将设计文档拆分为可执行的编码任务。项目包含三个子系统:.NET 10 后端 API、UniApp 移动端、EleAdmin + Vue 3 管理后台。任务按模块递进,每个模块完成后进行检查点验证。
## 任务
- [x] 1. 后端项目初始化与基础架构
- [x] 1.1 创建 .NET 10 ASP.NET Core Web API 项目结构
- 创建解决方案和项目API、Domain、Infrastructure、Application 分层)
- 配置 SQL Server 连接字符串和 Entity Framework Core
- 配置 Redis 连接
- 添加 Swagger/OpenAPI 文档
- _需求: 全局_
- [x] 1.2 创建数据库实体和 DbContext
- 根据设计文档数据模型创建所有 Entity 类User、MembershipProduct、PointRecord、CouponTemplate、UserCoupon、Banner、HomeEntry、ContentConfig、VendingPaymentRecord、PointsConfig
- 创建 AppDbContext 并配置实体映射关系
- 创建初始数据库迁移
- _需求: 全局_
- [x] 1.3 实现通用基础设施
- 实现统一 API 响应格式ApiResponse<T>
- 实现全局异常处理中间件
- 实现 JWT 认证中间件
- 实现多语言请求头解析Accept-Language
- _需求: 全局_
- [x] 2. 用户认证模块
- [x] 2.1 实现用户服务和控制器
- 实现 UserService发送验证码、登录、获取用户信息、登出、注销
- 实现 UserController 的所有端点
- 实现手机号区号验证逻辑
- 实现默认昵称生成("用户" + 6位随机数字
- _需求: 1.1, 1.2, 1.3, 1.5, 1.6, 1.7, 1.8_
- [x] 2.2 编写用户认证属性测试
- **Property 1: 默认昵称格式**
- **Property 2: 协议未勾选阻止登录**
- **验证: 需求 1.4, 1.6**
- [x] 2.3 编写用户认证单元测试
- 测试登录成功/失败流程
- 测试注销账号流程
- 测试验证码发送逻辑
- _需求: 1.1, 1.3, 1.7_
- [x] 3. 检查点 - 用户认证模块
- 确保所有测试通过,如有问题请向用户确认。
- [x] 4. 会员与支付模块
- [x] 4.1 实现会员服务和控制器
- 实现 MembershipService获取会员信息、获取商品列表、购买会员、购买订阅、验证订阅状态
- 实现 MembershipController 的所有端点
- 实现会员到期后积分保留/清空逻辑3个月规则
- 实现 Google Pay / Apple Pay 支付凭证验证逻辑
- _需求: 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 8.1, 8.2, 8.3, 8.5, 8.6_
- [x] 4.2 编写会员与支付属性测试
- **Property 7: 会员页按钮状态取决于会员类型**
- **Property 8: 平台与支付方式映射**
- **Property 9: 积分保留与清空规则**
- **Property 17: 支付错误处理**
- **验证: 需求 4.2, 4.3, 4.4, 4.5, 4.7, 4.8, 8.4**
- [x] 5. 积分模块
- [x] 5.1 实现积分服务和控制器
- 实现 PointsService获取余额、获取记录、赠送积分、消费积分转换
- 实现 PointsController 的所有端点
- 实现积分转换计算逻辑(金额 * 转换比)
- 实现赠送积分事务逻辑(扣减发送方、增加接收方,保证原子性)
- _需求: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7_
- [x] 5.2 编写积分模块属性测试
- **Property 10: 积分转换计算**
- **Property 11: 积分记录渲染完整性**
- **Property 12: 赠送积分守恒**
- **验证: 需求 5.1, 5.4, 5.5, 5.6, 5.7**
- [x] 6. 优惠券模块
- [x] 6.1 实现优惠券服务和控制器
- 实现 CouponService获取可兑换列表、兑换优惠券、获取用户优惠券、获取印花列表、兑换印花
- 实现 CouponController 的所有端点
- 实现兑换逻辑(积分检查、库存检查、下架检查)
- 实现印花兑换逻辑会员检查、每人限兑1次
- 实现优惠券状态自动更新(过期检测)
- _需求: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6_
- [x] 6.2 编写优惠券模块属性测试
- **Property 13: 优惠券兑换正确性**
- **Property 14: 优惠券状态分类与标识**
- **Property 15: 印花兑换权限取决于会员状态**
- **Property 16: 印花兑换幂等性**
- **验证: 需求 6.2, 6.3, 6.6, 6.7, 7.3, 7.4, 7.5, 7.6**
- [x] 7. 检查点 - 核心业务模块
- 确保所有测试通过,如有问题请向用户确认。
- [x] 8. 贩卖机对接模块
- [x] 8.1 实现贩卖机对接服务和控制器
- 实现 VendingMachineService二维码生成与验证、用户信息查询、用户锁定/解锁、支付回调处理)
- 实现 VendingMachineController 的所有端点
- 实现动态二维码生成(包含会员 ID、token、过期时间使用 Redis 存储
- 实现用户锁定机制Redis 分布式锁)
- 实现支付回调处理(积分发放、优惠券核销、解除锁定)
- 实现优惠券排序逻辑(按到期时间升序、抵扣金额降序)
- _需求: 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7_
- [x] 8.2 编写贩卖机对接属性测试
- **Property 18: 会员二维码时效性**
- **Property 19: 用户锁定机制**
- **Property 20: 优惠券排序优先级**
- **Property 21: 支付结束解除锁定**
- **验证: 需求 9.1, 9.2, 9.3, 9.4, 9.6, 9.7**
- [x] 9. 内容配置模块
- [x] 9.1 实现内容配置服务和控制器
- 实现 ContentService获取 Banner、入口图片、使用说明、协议内容等
- 实现 ContentController 的所有端点
- 根据请求语言返回对应语言版本的内容
- _需求: 3.1, 3.2, 3.7, 3.8, 10.2, 10.4_
- [x] 10. 检查点 - 后端 API 完成
- 确保所有测试通过,如有问题请向用户确认。
- [x] 11. 管理后台 - 项目初始化
- [x] 11.1 创建 EleAdmin + Vue 3 管理后台项目
- 基于 EleAdmin 模板初始化项目
- 配置路由、权限管理、API 基础封装
- 配置与后端 Admin API 的对接
- _需求: 11全局_
- [x] 12. 管理后台 - 内容管理页面
- [x] 12.1 实现 Banner 管理页面
- Banner 列表展示、新增、编辑、删除
- 支持拖拽排序
- 支持多语言图片上传
- _需求: 11.1_
- [x] 12.2 实现入口图片管理页面
- 首页各功能入口图片的配置和多语言图片上传
- _需求: 11.8_
- [x] 12.3 实现内容编辑页面
- 用户协议、隐私政策、优惠券使用说明的多语言富文本编辑
- _需求: 11.7_
- [x] 13. 管理后台 - 业务管理页面
- [x] 13.1 实现优惠券管理页面
- 优惠券列表、创建、编辑表单(名称、类型、门槛、折扣、积分、到期时间)
- 上下架操作
- 多语言名称配置
- _需求: 11.2_
- [x] 13.2 实现节日印花管理页面
- 印花优惠券列表、创建、编辑
- Banner 图配置
- _需求: 11.3_
- [x] 13.3 实现会员商品管理页面
- 会员商品列表、价格编辑、时长配置
- 宣传图上传
- Google/Apple 商品 ID 配置
- _需求: 11.5_
- [x] 13.4 实现积分配置页面
- 金额与积分转换比配置表单
- _需求: 11.4_
- [x] 13.5 实现用户管理页面
- 用户列表(搜索、分页)
- 用户详情(会员状态、积分、优惠券)
- _需求: 11.6_
- [x] 14. 检查点 - 管理后台完成
- 确保所有测试通过,如有问题请向用户确认。
- [x] 15. UniApp 移动端 - 项目初始化
- [x] 15.1 创建 UniApp + Vue 3 + TypeScript 项目
- 初始化 UniApp 项目,配置 TypeScript
- 配置 Pinia 状态管理
- 配置 vue-i18n 多语言zh-CN、zh-TW、en
- 封装 API 请求层统一请求拦截、Token 管理、错误处理)
- 配置页面路由pages.json
- _需求: 2.1, 全局_
- [x] 15.2 编写多语言属性测试
- **Property 3: i18n 翻译完整性**
- **验证: 需求 2.1, 2.3**
- [x] 16. UniApp 移动端 - 登录与用户模块
- [x] 16.1 实现登录页
- 手机号输入、区号选择器、验证码输入
- 协议勾选检查
- 调用后端登录接口Token 存储
- _需求: 1.1, 1.2, 1.3, 1.4_
- [x] 16.2 实现我的页
- 未登录/已登录状态展示
- 积分展示、功能入口(我的积分、我的优惠券、切换语言、用户协议、隐私政策、关于)
- 赠送积分弹窗
- 退出登录弹窗
- _需求: 1.5, 1.6, 1.8, 5.3, 5.6, 5.7, 6.5, 10.1_
- [x] 16.3 实现关于页
- LOGO、版本号展示
- 注销账号弹窗和流程
- _需求: 1.7, 10.3_
- [x] 16.4 实现语言切换功能
- 多语言选择列表弹窗
- 切换后刷新所有界面文字
- _需求: 2.2, 2.3_
- [x] 17. UniApp 移动端 - 首页模块
- [x] 17.1 实现首页
- Banner 轮播组件(支持内部/外部跳转)
- 功能入口图片(成为会员、节日印花、会员二维码)
- 会员二维码弹窗(动态二维码生成与展示)
- 优惠券使用说明弹窗
- 可兑换优惠券列表和兑换弹窗
- _需求: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 6.1, 6.2, 6.3, 6.4_
- [x] 17.2 编写首页相关属性测试
- **Property 4: Banner 跳转路由正确性**
- **Property 5: 二维码入口行为取决于会员状态**
- **Property 6: 优惠券列表渲染完整性**
- **验证: 需求 3.2, 3.5, 3.6, 3.8**
- [x] 18. UniApp 移动端 - 会员与支付模块
- [x] 18.1 实现会员页
- 会员宣传长图展示
- 单月会员/订阅会员购买按钮(根据会员状态动态显示)
- Google Pay / Apple Pay 支付调用封装
- 支付成功后页面刷新
- _需求: 4.1, 4.2, 4.3, 4.6, 4.7, 4.8, 8.1, 8.2, 8.3, 8.4, 8.6_
- [x] 19. UniApp 移动端 - 积分与优惠券模块
- [x] 19.1 实现我的积分页
- 获取记录/使用记录标签切换
- 积分记录列表展示(来源、时间、数量)
- _需求: 5.3, 5.4, 5.5_
- [x] 19.2 实现我的优惠券页
- 可使用/已使用/已过期标签切换
- 优惠券卡片组件(状态标识图标)
- _需求: 6.5, 6.6, 6.7_
- [x] 19.3 实现节日印花页
- Banner 图展示
- 印花优惠券列表
- 兑换逻辑(会员检查、已兑换状态)
- _需求: 7.1, 7.2, 7.3, 7.4, 7.5, 7.6_
- [x] 20. UniApp 移动端 - 协议与内容页面
- [x] 20.1 实现用户协议页和隐私政策页
- 从后端获取多语言内容并展示
- _需求: 10.2_
- [x] 21. 检查点 - UniApp 移动端完成
- 确保所有测试通过,如有问题请向用户确认。
- [x] 22. 集成与联调
- [x] 22.1 前后端接口联调
- UniApp 移动端与后端 API 全流程联调
- 管理后台与后端 Admin API 联调
- _需求: 全局_
- [x] 22.2 编写集成测试
- 测试完整的用户注册-登录-购买会员-获取积分-兑换优惠券流程
- 测试贩卖机扫码-锁定-支付回调-解锁完整流程
- _需求: 全局_
- [x] 23. 最终检查点
- 确保所有测试通过,如有问题请向用户确认。
## 备注
- 所有测试任务均为必选,确保代码质量
- 每个任务引用了具体的需求编号以确保可追溯性
- 检查点用于阶段性验证,确保增量开发的正确性
- 属性测试验证通用正确性属性,单元测试验证具体示例和边界情况
- 后端使用 xUnit + FsCheck 进行测试,前端使用 Vitest + fast-check 进行测试