diff --git a/.kiro/specs/goods-management-frontend/design.md b/.kiro/specs/goods-management-frontend/design.md index f6885a66..e4670981 100644 --- a/.kiro/specs/goods-management-frontend/design.md +++ b/.kiro/specs/goods-management-frontend/design.md @@ -1,6 +1,67 @@ -# 商品管理模块前端设计文档 +# Design Document -## 架构设计 +## Overview + +本设计文档描述了HoneyBox后台管理系统商品管理模块前端迁移的技术方案。该模块将老项目(PHP ThinkPHP + Layui)的商品管理前端页面迁移到新项目(ASP.NET Core + Vue 3 + Element Plus)。 + +主要工作包括: +1. 补充缺失的后端API接口(盒子类型CRUD、盒子扩展设置、复制盒子、清空抽奖) +2. 创建Vue 3前端页面和组件 +3. 实现API调用层 +4. 实现复杂的盒子类型条件字段逻辑 + +商品管理模块是系统核心模块,涉及10+种盒子类型,每种类型有不同的字段配置,是本次迁移中复杂度最高的模块。 + +## Architecture + +### 前端架构 + +``` +admin-web/src/ +├── api/ +│ └── business/ +│ └── goods.ts # 商品管理API +├── views/ +│ └── business/ +│ └── goods/ +│ ├── index.vue # 盒子列表主页面 +│ ├── type.vue # 盒子类型管理页面 +│ ├── config/ +│ │ └── typeFieldConfig.ts # 盒子类型字段配置 +│ └── components/ +│ ├── GoodsSearchForm.vue # 搜索表单组件 +│ ├── GoodsTable.vue # 盒子列表表格 +│ ├── GoodsAddDialog.vue # 盒子新增弹窗 +│ ├── GoodsEditDialog.vue # 盒子编辑弹窗 +│ ├── GoodsExtendDialog.vue # 盒子扩展设置弹窗 +│ ├── PrizeListDialog.vue # 奖品列表弹窗 +│ ├── PrizeAddDialog.vue # 奖品新增弹窗 +│ ├── PrizeEditDialog.vue # 奖品编辑弹窗 +│ └── TypeFormDialog.vue # 类型新增/编辑弹窗 +└── router/ + └── modules/ + └── business.ts # 业务模块路由 +``` + +### 后端架构 + +``` +HoneyBox.Admin.Business/ +├── Controllers/ +│ ├── GoodsController.cs # 商品管理控制器(补充API) +│ ├── GoodsTypesController.cs # 盒子类型控制器(补充API) +│ └── PrizesController.cs # 奖品管理控制器 +├── Services/ +│ ├── GoodsService.cs # 商品业务服务(补充方法) +│ └── Interfaces/ +│ └── IGoodsService.cs +└── Models/ + └── Goods/ + ├── GoodsModels.cs # 商品相关模型 + ├── PrizeModels.cs # 奖品相关模型 + ├── GoodsTypeModels.cs # 盒子类型模型(新增) + └── GoodsExtendModels.cs # 盒子扩展模型(新增) +``` ### 目录结构 @@ -431,3 +492,95 @@ try { handleApiError(error, '创建失败'); } ``` + +## Correctness Properties + +*A property is a characteristic or behavior that should hold true across all valid executions of a system-essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.* + +### Property 1: 盒子类型字段配置一致性 + +*For any* 盒子类型,前端字段配置应与后端数据模型保持一致,确保根据类型显示/隐藏的字段与数据库字段对应。 + +**Validates: Requirements 2.2, 2.8, 2.9, 2.10** + +### Property 2: 盒子创建参数验证 + +*For any* 盒子创建请求,当必填字段缺失或数据格式无效时,系统应该返回错误提示而不是创建盒子。 + +**Validates: Requirements 2.3, 2.4** + +### Property 3: 盒子状态切换一致性 + +*For any* 盒子状态变更操作,上架操作应该将status设为1,下架操作应该将status设为0,且操作后列表应该显示正确的状态。 + +**Validates: Requirements 1.3** + +### Property 4: 奖品概率总和验证 + +*For any* 概率类型盒子(无限赏、翻倍赏等),所有奖品的概率总和不应超过100%。 + +**Validates: Requirements 4.5** + +### Property 5: 盒子扩展设置继承 + +*For any* 盒子扩展设置查询,当盒子没有独立扩展配置时,应该返回其所属盒子类型的默认支付配置。 + +**Validates: Requirements 7.1, 7.4** + +### Property 6: API响应格式一致性 + +*For any* 后端API响应,响应格式应该符合统一的ApiResponse结构:{ code: number, message: string, data: T },其中code为0表示成功。 + +**Validates: Requirements 8.1-8.9** + +## Error Handling + +### 前端错误处理 + +1. **网络错误**: 显示"网络连接失败"提示,允许用户重试 +2. **401未授权**: 自动刷新token或跳转登录页 +3. **403无权限**: 显示"没有操作权限"提示 +4. **业务错误**: 显示后端返回的错误消息 +5. **表单验证错误**: 在表单字段下方显示验证错误信息 +6. **危险操作**: 清空抽奖等危险操作需要二次确认 + +### 后端错误处理 + +1. **参数验证失败**: 返回400状态码和验证错误详情 +2. **资源不存在**: 返回404状态码和"盒子不存在"消息 +3. **业务规则违反**: 返回业务错误码和描述消息(如概率超过100%) +4. **服务器错误**: 返回500状态码和通用错误消息 + +## Testing Strategy + +### 单元测试 + +1. **前端组件测试** + - 测试搜索表单组件的参数收集 + - 测试盒子类型字段配置的正确性 + - 测试奖品列表动态列的渲染 + +2. **后端服务测试** + - 测试GoodsService的各个方法 + - 测试盒子类型CRUD操作 + - 测试盒子扩展设置的继承逻辑 + +### 属性测试 + +使用属性测试验证以下属性: +- 盒子类型字段配置一致性 +- 盒子创建参数验证 +- 奖品概率总和验证 +- 盒子扩展设置继承 +- API响应格式一致性 + +### 集成测试 + +1. **API集成测试** + - 测试完整的API请求-响应流程 + - 测试权限验证 + +2. **端到端测试** + - 测试盒子列表页面的完整功能流程 + - 测试盒子新增的类型条件字段逻辑 + - 测试奖品管理的完整操作流程 diff --git a/.kiro/specs/goods-management-frontend/requirements.md b/.kiro/specs/goods-management-frontend/requirements.md index 8871a74d..b2e4149b 100644 --- a/.kiro/specs/goods-management-frontend/requirements.md +++ b/.kiro/specs/goods-management-frontend/requirements.md @@ -1,18 +1,33 @@ -# 商品管理模块前端迁移需求文档 +# Requirements Document -## 概述 +## Introduction -将 PHP 老项目 (`server/php/app/admin/view/Goods/`) 中的商品管理功能迁移到新的 Vue 3 + Element Plus 前端框架。 +本文档定义了HoneyBox后台管理系统商品管理模块前端迁移的需求。该模块需要将老项目(PHP ThinkPHP + Layui)的商品管理前端页面迁移到新项目(ASP.NET Core + Vue 3 + Element Plus)。 + +后端API已部分迁移完成,本次主要任务是创建前端页面并与已有API对接,同时补充缺失的API接口。 + +## Glossary + +- **Admin_Web**: 新项目后台管理前端,位于 `server/HoneyBox/src/HoneyBox.Admin/admin-web` +- **Goods_Controller**: 商品管理后端控制器,位于 `server/HoneyBox/src/HoneyBox.Admin.Business/Controllers/GoodsController.cs` +- **Goods_Service**: 商品业务服务,位于 `server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs` +- **GoodsTypes_Controller**: 盒子类型管理控制器,位于 `server/HoneyBox/src/HoneyBox.Admin.Business/Controllers/GoodsTypesController.cs` +- **Prizes_Controller**: 奖品管理控制器,位于 `server/HoneyBox/src/HoneyBox.Admin.Business/Controllers/PrizesController.cs` +- **Old_View**: 老项目视图文件,位于 `server/php/app/admin/view/Goods/` +- **Element_Plus**: Vue 3 UI组件库 +- **Layui**: 老项目使用的前端UI框架 ## 参考文档 - #[[file:docs/后台管理系统-功能分析清单.md]] - 模块功能分析 - #[[file:server/HoneyBox/src/HoneyBox.Admin.Business/Controllers/GoodsController.cs]] - 后端API - #[[file:server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs]] - 后端服务 +- #[[file:server/php/app/admin/controller/GoodsType.php]] - 老项目盒子类型控制器 +- #[[file:server/php/app/common/model/GoodsExtend.php]] - 老项目盒子扩展模型 ## 盒子类型定义 -系统支持10种盒子类型,每种类型有不同的字段配置: +系统支持多种盒子类型,每种类型有不同的字段配置: | 类型值 | 类型名称 | 特有字段 | |--------|----------|----------| @@ -24,111 +39,117 @@ | 8 | 领主赏 | 领主开关、领主返还、领主奖品 | | 9 | 连击赏 | 连击次数、连击奖品 | | 10 | 盲盒 | 套数、盒子描述 | -| 11 | 幸运赏(新) | 套数、锁箱、每日限购 | | 15 | 福利屋 | 开始/结束/开奖时间、限购次数 | -| 16 | 翻倍赏 | 怒气值、道具卡 | -| 17 | 特殊盒子 | 每日限购 | -## 用户故事 +## Requirements -### US-001: 盒子列表管理 -作为后台管理员,我需要查看和管理所有盒子,以便进行日常运营。 +### Requirement 1: 盒子列表页面 -**验收标准:** -- AC-001.1: 支持按盒子标题、状态、类型搜索 -- AC-001.2: 列表显示盒子ID、类型、名称、价格、套数、图片、状态等信息 -- AC-001.3: 支持上架/下架状态切换 -- AC-001.4: 支持编辑、删除、复制盒子操作 -- AC-001.5: 支持查看和管理盒子奖品 -- AC-001.6: 支持盒子扩展设置(支付方式配置) -- AC-001.7: 福利屋类型显示开始/结束/开奖时间 +**User Story:** As a 管理员, I want 查看和管理所有盒子, so that 我可以进行日常运营。 -### US-002: 盒子新增 -作为后台管理员,我需要新增盒子,以便上架新的抽奖活动。 +#### Acceptance Criteria -**验收标准:** -- AC-002.1: 支持选择盒子类型(10种类型) -- AC-002.2: 根据盒子类型动态显示/隐藏相关字段 -- AC-002.3: 支持配置基础信息(名称、价格、排序、描述) -- AC-002.4: 支持配置首抽五折、是否最新 -- AC-002.5: 支持配置自动下架(利润值、抽数阈值、下架金额) -- AC-002.6: 支持配置解锁金额 -- AC-002.7: 支持上传盒子封面图和详情图 -- AC-002.8: 一番赏/幸运赏类型支持配置套数、锁箱、每日限购 -- AC-002.9: 无限赏/翻倍赏类型支持配置怒气值、道具卡 -- AC-002.10: 福利屋类型支持配置时间(开始/结束/开奖) +1. WHEN 管理员访问盒子管理页面 THEN Admin_Web SHALL 显示盒子列表表格,包含盒子ID、类型、名称、价格、套数、图片、状态等字段 +2. WHEN 管理员输入搜索条件(盒子标题、状态、类型)并点击搜索 THEN Admin_Web SHALL 根据条件筛选并显示匹配的盒子列表 +3. WHEN 管理员点击状态开关 THEN Admin_Web SHALL 调用API切换盒子上架/下架状态 +4. WHEN 管理员点击"编辑"按钮 THEN Admin_Web SHALL 弹出盒子编辑对话框 +5. WHEN 管理员点击"删除"按钮 THEN Admin_Web SHALL 弹出确认对话框,确认后调用API删除盒子 +6. WHEN 管理员点击"复制"按钮 THEN Admin_Web SHALL 调用API复制盒子(含奖品) +7. WHEN 管理员点击"奖品"按钮 THEN Admin_Web SHALL 弹出奖品列表对话框 +8. WHEN 管理员点击"扩展设置"按钮 THEN Admin_Web SHALL 弹出扩展设置对话框 +9. WHEN 管理员点击"清空抽奖"按钮 THEN Admin_Web SHALL 弹出危险操作确认对话框,确认后清空抽奖记录 +10. WHEN 盒子类型为福利屋 THEN Admin_Web SHALL 在列表中显示开始/结束/开奖时间 -### US-003: 盒子编辑 -作为后台管理员,我需要编辑已有盒子,以便调整活动配置。 +### Requirement 2: 盒子新增功能 -**验收标准:** -- AC-003.1: 盒子类型不可修改(编辑时禁用) -- AC-003.2: 其他字段可正常编辑 -- AC-003.3: 保存后刷新列表 +**User Story:** As a 管理员, I want 新增盒子, so that 我可以上架新的抽奖活动。 -### US-004: 奖品列表管理 -作为后台管理员,我需要管理盒子的奖品,以便配置抽奖内容。 +#### Acceptance Criteria -**验收标准:** -- AC-004.1: 支持按奖品标题搜索 -- AC-004.2: 根据盒子类型动态显示不同列(数量/概率) -- AC-004.3: 支持树形表格展示(宝箱类型可展开子奖品) -- AC-004.4: 显示概率统计(无限赏等类型) -- AC-004.5: 支持排序字段直接编辑 -- AC-004.6: 支持添加、编辑、删除奖品 +1. WHEN 管理员点击"新增盒子"按钮 THEN Admin_Web SHALL 弹出盒子新增对话框,显示盒子类型选择 +2. WHEN 管理员选择盒子类型 THEN Admin_Web SHALL 根据类型动态显示/隐藏相关字段 +3. THE Admin_Web SHALL 支持配置基础信息(名称、价格、排序、描述) +4. THE Admin_Web SHALL 支持配置首抽五折、是否最新开关 +5. THE Admin_Web SHALL 支持配置自动下架(利润值、抽数阈值、下架金额) +6. THE Admin_Web SHALL 支持配置解锁金额 +7. THE Admin_Web SHALL 支持上传盒子封面图和详情图 +8. WHEN 盒子类型为一番赏/幸运赏 THEN Admin_Web SHALL 显示套数、锁箱、每日限购配置 +9. WHEN 盒子类型为无限赏/翻倍赏 THEN Admin_Web SHALL 显示怒气值、道具卡配置 +10. WHEN 盒子类型为福利屋 THEN Admin_Web SHALL 显示时间配置(开始/结束/开奖) -### US-005: 奖品新增/编辑 -作为后台管理员,我需要新增和编辑奖品,以便配置抽奖奖品。 +### Requirement 3: 盒子编辑功能 -**验收标准:** -- AC-005.1: 支持配置奖品基础信息(名称、类型、售价、采购价、参考价) -- AC-005.2: 支持选择奖品分类(现货/预售/货币/宝箱) -- AC-005.3: 支持选择奖品等级(A/B/C/D/E等) -- AC-005.4: 根据盒子类型显示数量或概率字段 -- AC-005.5: 翻倍赏支持配置赠送倍率 -- AC-005.6: 预售类型支持配置预售时间 -- AC-005.7: 支持配置赠送货币 -- AC-005.8: 支持上传奖品图片和详情图 +**User Story:** As a 管理员, I want 编辑已有盒子, so that 我可以调整活动配置。 -### US-006: 盒子类型管理 -作为后台管理员,我需要管理盒子类型,以便配置类型属性。 +#### Acceptance Criteria -**验收标准:** -- AC-006.1: 显示类型列表(ID、名称、Key、排序) -- AC-006.2: 支持首页显示、分类显示开关 -- AC-006.3: 支持配置支付方式(微信/余额/货币/优惠券) -- AC-006.4: 支持配置角标文字 -- AC-006.5: 支持新增、编辑、删除类型 +1. WHEN 管理员打开盒子编辑对话框 THEN Admin_Web SHALL 禁用盒子类型选择(不可修改) +2. THE Admin_Web SHALL 回显盒子当前配置数据 +3. WHEN 管理员修改配置并提交 THEN Admin_Web SHALL 调用API更新盒子并刷新列表 -### US-007: 盒子扩展设置 -作为后台管理员,我需要为单个盒子配置独立的支付方式。 +### Requirement 4: 奖品列表管理 -**验收标准:** -- AC-007.1: 显示盒子基本信息 -- AC-007.2: 支持多选支付方式 -- AC-007.3: 支持选择支付类型(抵扣/支付) -- AC-007.4: 支持删除扩展设置恢复默认 +**User Story:** As a 管理员, I want 管理盒子的奖品, so that 我可以配置抽奖内容。 -## 非功能需求 +#### Acceptance Criteria -### NFR-001: 性能 -- 盒子列表分页加载,每页默认20条 -- 图片使用懒加载 -- 表单提交防重复点击 +1. WHEN 管理员打开奖品列表对话框 THEN Admin_Web SHALL 显示该盒子的所有奖品 +2. WHEN 管理员输入奖品标题搜索 THEN Admin_Web SHALL 筛选显示匹配的奖品 +3. THE Admin_Web SHALL 根据盒子类型动态显示不同列(数量/概率) +4. WHEN 奖品类型为宝箱 THEN Admin_Web SHALL 支持树形表格展开显示子奖品 +5. THE Admin_Web SHALL 显示概率统计(无限赏等类型) +6. THE Admin_Web SHALL 支持添加、编辑、删除奖品操作 -### NFR-002: 用户体验 -- 表单验证实时反馈 -- 操作成功/失败提示 -- 删除操作二次确认 -- 图片上传支持预览 +### Requirement 5: 奖品新增/编辑功能 -### NFR-003: 兼容性 -- 支持 Chrome、Firefox、Edge 最新版本 -- 响应式布局适配不同屏幕 +**User Story:** As a 管理员, I want 新增和编辑奖品, so that 我可以配置抽奖奖品。 -## 约束条件 +#### Acceptance Criteria -- 后端API已完成,使用现有的 GoodsController 和 PrizesController -- 遵循现有项目的代码规范和目录结构 -- 使用 Element Plus 组件库 -- 使用 TypeScript 编写 +1. THE Admin_Web SHALL 支持配置奖品基础信息(名称、售价、采购价、参考价) +2. THE Admin_Web SHALL 支持选择奖品分类(现货/预售/货币/宝箱) +3. THE Admin_Web SHALL 支持选择奖品等级(A/B/C/D/E等) +4. THE Admin_Web SHALL 根据盒子类型显示数量或概率字段 +5. WHEN 盒子类型为翻倍赏 THEN Admin_Web SHALL 显示赠送倍率配置 +6. WHEN 奖品分类为预售 THEN Admin_Web SHALL 显示预售时间配置 +7. THE Admin_Web SHALL 支持配置赠送货币 +8. THE Admin_Web SHALL 支持上传奖品图片和详情图 + +### Requirement 6: 盒子类型管理 + +**User Story:** As a 管理员, I want 管理盒子类型, so that 我可以配置类型属性。 + +#### Acceptance Criteria + +1. WHEN 管理员访问盒子类型管理页面 THEN Admin_Web SHALL 显示类型列表(ID、名称、Key、排序) +2. THE Admin_Web SHALL 支持首页显示、分类显示开关 +3. THE Admin_Web SHALL 支持配置支付方式(微信/余额/积分/积分2/优惠券) +4. THE Admin_Web SHALL 支持配置角标文字 +5. THE Admin_Web SHALL 支持新增、编辑、删除类型操作 + +### Requirement 7: 盒子扩展设置 + +**User Story:** As a 管理员, I want 为单个盒子配置独立的支付方式, so that 我可以覆盖类型默认配置。 + +#### Acceptance Criteria + +1. WHEN 管理员打开扩展设置对话框 THEN Admin_Web SHALL 显示盒子基本信息 +2. THE Admin_Web SHALL 支持多选支付方式(微信/余额/积分/积分2/优惠券) +3. THE Admin_Web SHALL 支持选择支付类型(抵扣模式/支付模式) +4. WHEN 管理员点击"删除扩展设置" THEN Admin_Web SHALL 删除独立配置,恢复使用类型默认配置 + +### Requirement 8: API补充迁移 + +**User Story:** As a 开发者, I want 补充缺失的后端API, so that 前端页面可以正常工作。 + +#### Acceptance Criteria + +1. THE GoodsTypes_Controller SHALL 提供创建盒子类型API(POST /api/admin/business/goods-types) +2. THE GoodsTypes_Controller SHALL 提供更新盒子类型API(PUT /api/admin/business/goods-types/{id}) +3. THE GoodsTypes_Controller SHALL 提供删除盒子类型API(DELETE /api/admin/business/goods-types/{id}) +4. THE GoodsTypes_Controller SHALL 提供修改类型状态API(PUT /api/admin/business/goods-types/{id}/status) +5. THE Goods_Controller SHALL 提供获取扩展设置API(GET /api/admin/business/goods/{id}/extend) +6. THE Goods_Controller SHALL 提供更新扩展设置API(PUT /api/admin/business/goods/{id}/extend) +7. THE Goods_Controller SHALL 提供删除扩展设置API(DELETE /api/admin/business/goods/{id}/extend) +8. THE Goods_Controller SHALL 提供复制盒子API(POST /api/admin/business/goods/{id}/copy) +9. THE Goods_Controller SHALL 提供清空抽奖API(POST /api/admin/business/goods/{id}/clear-lottery) diff --git a/.kiro/specs/goods-management-frontend/tasks.md b/.kiro/specs/goods-management-frontend/tasks.md index 299783e8..6dbfad2a 100644 --- a/.kiro/specs/goods-management-frontend/tasks.md +++ b/.kiro/specs/goods-management-frontend/tasks.md @@ -1,215 +1,300 @@ -# 商品管理模块前端迁移任务清单 +# Implementation Plan: 商品管理模块前端迁移 + +## Overview + +本实现计划将商品管理模块从老项目(PHP ThinkPHP + Layui)迁移到新项目(ASP.NET Core + Vue 3 + Element Plus)。实现分为后端API补充和前端页面开发两个主要部分。 ## 任务概览 | 阶段 | 任务数 | 预计工时 | |------|--------|----------| -| 1. 基础设施 | 2 | 2h | -| 2. 盒子列表 | 4 | 6h | -| 3. 盒子新增/编辑 | 3 | 8h | -| 4. 奖品管理 | 4 | 6h | -| 5. 盒子类型管理 | 2 | 3h | -| 6. 测试 | 2 | 3h | -| **总计** | **17** | **28h** | +| 1. 后端API补充 - 盒子类型管理 | 4 | 3h | +| 2. 后端API补充 - 盒子扩展功能 | 4 | 3h | +| 3. Checkpoint - 后端API验证 | 1 | 0.5h | +| 4. 前端API层开发 | 2 | 2h | +| 5. 前端盒子列表页面 | 4 | 6h | +| 6. 前端盒子新增/编辑 | 3 | 8h | +| 7. 前端奖品管理 | 4 | 6h | +| 8. Checkpoint - 盒子管理验证 | 1 | 0.5h | +| 9. 前端盒子类型管理 | 2 | 3h | +| 10. 前端扩展功能 | 2 | 2h | +| 11. 路由和权限配置 | 1 | 1h | +| 12. Checkpoint - 完整功能验证 | 1 | 0.5h | +| 13. 属性测试 | 6 | 2h | +| 14. Final Checkpoint | 1 | 0.5h | +| **总计** | **36** | **38h** | --- -## 阶段1: 基础设施 +## Tasks -### Task 1.1: 创建API接口层 -- [ ] 创建 `src/api/business/goods.ts` -- [ ] 实现盒子管理API(getList, getDetail, create, update, delete, setStatus) -- [ ] 实现奖品管理API(getPrizes, addPrize, getDetail, update, delete) -- [ ] 实现盒子类型API(getList, create, update, delete) -- [ ] 定义请求/响应类型接口 +- [ ] 1. 后端API补充 - 盒子类型管理 + - [ ] 1.1 创建盒子类型相关模型 + - 在 `Models/Goods/` 下创建 `GoodsTypeModels.cs` + - 定义 `GoodsTypeCreateRequest` 类(name, value, sortOrder, isShow, isFenlei, flName, cornerText, payWechat, payBalance, payCurrency, payCurrency2, payCoupon, isDeduction) + - 定义 `GoodsTypeUpdateRequest` 类 + - 定义 `GoodsTypeStatusRequest` 类 + - 更新 `GoodsTypeDto` 添加完整字段 + - _Requirements: 8.1, 8.2, 8.3, 8.4_ -**关联需求:** US-001, US-002, US-004, US-006 + - [ ] 1.2 扩展盒子类型服务接口 + - 在 `IGoodsService.cs` 添加 `CreateGoodsTypeAsync` 方法 + - 在 `IGoodsService.cs` 添加 `UpdateGoodsTypeAsync` 方法 + - 在 `IGoodsService.cs` 添加 `DeleteGoodsTypeAsync` 方法 + - 在 `IGoodsService.cs` 添加 `SetGoodsTypeStatusAsync` 方法 + - _Requirements: 8.1, 8.2, 8.3, 8.4_ -### Task 1.2: 创建类型定义和配置 -- [ ] 创建盒子类型枚举 `GoodsType` -- [ ] 创建盒子类型标签映射 `GoodsTypeLabels` -- [ ] 创建盒子类型字段配置 `GoodsTypeFieldConfigs` -- [ ] 创建奖品分类枚举 `PrizeCategory` -- [ ] 创建数据模型接口(GoodsItem, PrizeItem等) + - [ ] 1.3 实现盒子类型服务方法 + - 在 `GoodsService.cs` 实现 `CreateGoodsTypeAsync` + - 在 `GoodsService.cs` 实现 `UpdateGoodsTypeAsync` + - 在 `GoodsService.cs` 实现 `DeleteGoodsTypeAsync` + - 在 `GoodsService.cs` 实现 `SetGoodsTypeStatusAsync` + - 更新 `GetGoodsTypesAsync` 返回完整字段 + - _Requirements: 8.1, 8.2, 8.3, 8.4_ -**关联需求:** US-002, US-005 + - [ ] 1.4 扩展盒子类型控制器 + - 在 `GoodsTypesController.cs` 添加 `POST /` 创建盒子类型 + - 在 `GoodsTypesController.cs` 添加 `PUT /{id}` 更新盒子类型 + - 在 `GoodsTypesController.cs` 添加 `DELETE /{id}` 删除盒子类型 + - 在 `GoodsTypesController.cs` 添加 `PUT /{id}/status` 修改状态 + - _Requirements: 8.1, 8.2, 8.3, 8.4_ ---- +- [ ] 2. 后端API补充 - 盒子扩展功能 + - [ ] 2.1 创建盒子扩展相关模型 + - 在 `Models/Goods/` 下创建 `GoodsExtendModels.cs` + - 定义 `GoodsExtendDto` 类(goodsId, payWechat, payBalance, payCurrency, payCurrency2, payCoupon, isDeduction) + - 定义 `GoodsExtendUpdateRequest` 类 + - _Requirements: 8.5, 8.6, 8.7_ -## 阶段2: 盒子列表 + - [ ] 2.2 扩展商品服务接口 + - 在 `IGoodsService.cs` 添加 `GetGoodsExtendAsync` 方法 + - 在 `IGoodsService.cs` 添加 `UpdateGoodsExtendAsync` 方法 + - 在 `IGoodsService.cs` 添加 `DeleteGoodsExtendAsync` 方法 + - 在 `IGoodsService.cs` 添加 `CopyGoodsAsync` 方法 + - 在 `IGoodsService.cs` 添加 `ClearGoodsLotteryAsync` 方法 + - _Requirements: 8.5, 8.6, 8.7, 8.8, 8.9_ -### Task 2.1: 创建盒子列表页面 -- [ ] 创建 `src/views/business/goods/index.vue` -- [ ] 实现页面布局(搜索区 + 表格区) -- [ ] 集成搜索表单和表格组件 -- [ ] 实现分页逻辑 + - [ ] 2.3 实现盒子扩展服务方法 + - 在 `GoodsService.cs` 实现 `GetGoodsExtendAsync`(如无扩展配置则返回盒子类型默认配置) + - 在 `GoodsService.cs` 实现 `UpdateGoodsExtendAsync` + - 在 `GoodsService.cs` 实现 `DeleteGoodsExtendAsync` + - 在 `GoodsService.cs` 实现 `CopyGoodsAsync`(复制盒子及其奖品) + - 在 `GoodsService.cs` 实现 `ClearGoodsLotteryAsync`(清空抽奖记录) + - _Requirements: 8.5, 8.6, 8.7, 8.8, 8.9_ -**关联需求:** US-001 (AC-001.1, AC-001.2) + - [ ] 2.4 扩展商品控制器 + - 在 `GoodsController.cs` 添加 `GET /{id}/extend` 获取扩展设置 + - 在 `GoodsController.cs` 添加 `PUT /{id}/extend` 更新扩展设置 + - 在 `GoodsController.cs` 添加 `DELETE /{id}/extend` 删除扩展设置 + - 在 `GoodsController.cs` 添加 `POST /{id}/copy` 复制盒子 + - 在 `GoodsController.cs` 添加 `POST /{id}/clear-lottery` 清空抽奖 + - _Requirements: 8.5, 8.6, 8.7, 8.8, 8.9_ -### Task 2.2: 创建搜索表单组件 -- [ ] 创建 `src/views/business/goods/components/GoodsSearchForm.vue` -- [ ] 实现盒子标题输入框 -- [ ] 实现状态下拉选择(上架/下架/售罄) -- [ ] 实现盒子类型下拉选择 -- [ ] 实现搜索和重置按钮 +- [ ] 3. Checkpoint - 后端API验证 + - 确保所有新增API编译通过 + - 使用Swagger测试API基本功能 + - 确保权限验证正常工作 -**关联需求:** US-001 (AC-001.1) +- [ ] 4. 前端API层开发 + - [ ] 4.1 创建商品管理API模块 + - 创建 `src/api/business/goods.ts` + - 定义所有TypeScript接口(GoodsItem, GoodsDetail, GoodsCreateRequest, GoodsUpdateRequest等) + - 实现盒子列表查询API调用 + - 实现盒子详情API调用 + - 实现盒子创建/更新/删除API调用 + - 实现盒子状态管理API调用 + - 实现盒子复制API调用 + - 实现清空抽奖API调用 + - _Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.9_ -### Task 2.3: 创建盒子表格组件 -- [ ] 创建 `src/views/business/goods/components/GoodsTable.vue` -- [ ] 实现表格列配置(ID、类型、名称、价格、套数、图片、状态等) -- [ ] 实现图片预览功能 -- [ ] 实现状态切换开关 -- [ ] 实现排序字段直接编辑 -- [ ] 福利屋类型显示时间信息 + - [ ] 4.2 实现奖品和类型相关API调用 + - 实现奖品列表查询API调用 + - 实现奖品创建/更新/删除API调用 + - 实现盒子类型列表API调用 + - 实现盒子类型创建/更新/删除API调用 + - 实现盒子扩展设置API调用 + - _Requirements: 4.1, 4.6, 6.1, 6.5, 7.1, 7.2, 7.3, 7.4_ -**关联需求:** US-001 (AC-001.2, AC-001.3, AC-001.7) +- [ ] 5. 前端盒子列表页面开发 + - [ ] 5.1 创建盒子列表主页面 + - 创建 `src/views/business/goods/index.vue` + - 实现页面布局(搜索区 + 表格区) + - 集成搜索表单和表格组件 + - 实现分页逻辑 + - _Requirements: 1.1, 1.2_ -### Task 2.4: 实现盒子操作功能 -- [ ] 实现编辑按钮(打开编辑弹窗) -- [ ] 实现删除按钮(二次确认) -- [ ] 实现复制按钮 -- [ ] 实现奖品按钮(打开奖品列表弹窗) -- [ ] 实现扩展设置按钮(打开扩展设置弹窗) -- [ ] 实现清空抽奖按钮(危险操作,二次确认) + - [ ] 5.2 创建搜索表单组件 + - 创建 `src/views/business/goods/components/GoodsSearchForm.vue` + - 实现盒子标题输入框 + - 实现状态下拉选择(上架/下架/售罄) + - 实现盒子类型下拉选择 + - 实现搜索和重置按钮 + - _Requirements: 1.2_ -**关联需求:** US-001 (AC-001.4, AC-001.5, AC-001.6) + - [ ] 5.3 创建盒子表格组件 + - 创建 `src/views/business/goods/components/GoodsTable.vue` + - 实现表格列配置(ID、类型、名称、价格、套数、图片、状态等) + - 实现图片预览功能 + - 实现状态切换开关 + - 实现排序字段直接编辑 + - 福利屋类型显示时间信息 + - _Requirements: 1.1, 1.3, 1.10_ ---- + - [ ] 5.4 实现盒子操作功能 + - 实现编辑按钮(打开编辑弹窗) + - 实现删除按钮(二次确认) + - 实现复制按钮 + - 实现奖品按钮(打开奖品列表弹窗) + - 实现扩展设置按钮(打开扩展设置弹窗) + - 实现清空抽奖按钮(危险操作,二次确认) + - _Requirements: 1.4, 1.5, 1.6, 1.7, 1.8, 1.9_ -## 阶段3: 盒子新增/编辑 +- [ ] 6. 前端盒子新增/编辑开发 + - [ ] 6.1 创建盒子新增弹窗 + - 创建 `src/views/business/goods/components/GoodsAddDialog.vue` + - 实现盒子类型选择(单选按钮组) + - 实现基础信息表单(名称、价格、排序、描述) + - 实现首抽五折、是否最新开关 + - 实现图片上传(封面图、详情图) + - 实现表单验证 + - _Requirements: 2.1, 2.3, 2.4, 2.7_ -### Task 3.1: 创建盒子新增弹窗 -- [ ] 创建 `src/views/business/goods/components/GoodsAddDialog.vue` -- [ ] 实现盒子类型选择(单选按钮组) -- [ ] 实现基础信息表单(名称、价格、排序、描述) -- [ ] 实现首抽五折、是否最新开关 -- [ ] 实现图片上传(封面图、详情图) -- [ ] 实现表单验证 + - [ ] 6.2 实现盒子类型条件字段 + - 实现根据类型动态显示/隐藏字段逻辑 + - 一番赏/幸运赏:套数、锁箱、每日限购 + - 无限赏/翻倍赏:怒气值开关、怒气值、道具卡选择 + - 福利屋:开始时间、结束时间、开奖时间、限购次数 + - 领主赏:领主开关、领主返还、领主奖品选择 + - 连击赏:连击次数、连击奖品选择 + - 实现自动下架配置(利润值、抽数阈值、下架金额) + - 实现解锁金额配置 + - _Requirements: 2.2, 2.5, 2.6, 2.8, 2.9, 2.10_ -**关联需求:** US-002 (AC-002.1, AC-002.3, AC-002.4, AC-002.7) + - [ ] 6.3 创建盒子编辑弹窗 + - 创建 `src/views/business/goods/components/GoodsEditDialog.vue` + - 复用新增弹窗的表单结构 + - 禁用盒子类型选择 + - 实现数据回显 + - 实现更新逻辑 + - _Requirements: 3.1, 3.2, 3.3_ -### Task 3.2: 实现盒子类型条件字段 -- [ ] 实现根据类型动态显示/隐藏字段逻辑 -- [ ] 一番赏/幸运赏:套数、锁箱、每日限购 -- [ ] 无限赏/翻倍赏:怒气值开关、怒气值、道具卡选择 -- [ ] 福利屋:开始时间、结束时间、开奖时间、限购次数 -- [ ] 领主赏:领主开关、领主返还、领主奖品选择 -- [ ] 连击赏:连击次数、连击奖品选择 -- [ ] 实现自动下架配置(利润值、抽数阈值、下架金额) -- [ ] 实现解锁金额配置 +- [ ] 7. 前端奖品管理开发 + - [ ] 7.1 创建奖品列表弹窗 + - 创建 `src/views/business/goods/components/PrizeListDialog.vue` + - 实现奖品搜索(标题) + - 实现动态列配置(根据盒子类型显示数量/概率) + - 实现树形表格(宝箱类型展开子奖品) + - 显示概率统计(无限赏等类型) + - 实现排序字段直接编辑 + - _Requirements: 4.1, 4.2, 4.3, 4.4, 4.5_ -**关联需求:** US-002 (AC-002.2, AC-002.5, AC-002.6, AC-002.8, AC-002.9, AC-002.10) + - [ ] 7.2 创建奖品新增弹窗 + - 创建 `src/views/business/goods/components/PrizeAddDialog.vue` + - 实现基础信息表单(名称、售价、采购价、参考价) + - 实现奖品分类选择(现货/预售/货币/宝箱) + - 实现奖品等级选择(A/B/C/D/E) + - 实现图片上传(奖品图、详情图) + - 实现表单验证 + - _Requirements: 5.1, 5.2, 5.3, 5.8_ -### Task 3.3: 创建盒子编辑弹窗 -- [ ] 创建 `src/views/business/goods/components/GoodsEditDialog.vue` -- [ ] 复用新增弹窗的表单结构 -- [ ] 禁用盒子类型选择 -- [ ] 实现数据回显 -- [ ] 实现更新逻辑 + - [ ] 7.3 实现奖品条件字段 + - 根据盒子类型显示数量或概率字段 + - 翻倍赏显示赠送倍率 + - 领主赏显示是否领主开关 + - 预售类型显示预售时间 + - 实现赠送货币配置组件 + - _Requirements: 5.4, 5.5, 5.6, 5.7_ -**关联需求:** US-003 (AC-003.1, AC-003.2, AC-003.3) + - [ ] 7.4 创建奖品编辑弹窗 + - 创建 `src/views/business/goods/components/PrizeEditDialog.vue` + - 复用新增弹窗的表单结构 + - 实现数据回显 + - 实现更新逻辑 + - 实现删除功能 + - _Requirements: 4.6_ ---- +- [ ] 8. Checkpoint - 盒子管理验证 + - 确保盒子列表页面正常显示 + - 测试搜索和分页功能 + - 测试盒子新增/编辑/删除功能 + - 测试奖品管理功能 -## 阶段4: 奖品管理 +- [ ] 9. 前端盒子类型管理开发 + - [ ] 9.1 创建盒子类型管理页面 + - 创建 `src/views/business/goods/type.vue` + - 实现类型列表表格(ID、名称、Key、排序) + - 实现首页显示、分类显示开关 + - 显示支付方式、角标文字 + - 实现新增、编辑、删除操作 + - _Requirements: 6.1, 6.2, 6.3, 6.4, 6.5_ -### Task 4.1: 创建奖品列表弹窗 -- [ ] 创建 `src/views/business/goods/components/PrizeListDialog.vue` -- [ ] 实现奖品搜索(标题) -- [ ] 实现动态列配置(根据盒子类型显示数量/概率) -- [ ] 实现树形表格(宝箱类型展开子奖品) -- [ ] 显示概率统计(无限赏等类型) -- [ ] 实现排序字段直接编辑 + - [ ] 9.2 创建类型新增/编辑弹窗 + - 创建 `src/views/business/goods/components/TypeFormDialog.vue` + - 实现类型名称、Key、排序输入 + - 实现首页显示、分类显示开关 + - 实现支付方式多选(微信/余额/积分/积分2/优惠券) + - 实现角标文字输入 + - 实现支付类型选择(抵扣/支付) + - _Requirements: 6.2, 6.3, 6.4, 6.5_ -**关联需求:** US-004 (AC-004.1, AC-004.2, AC-004.3, AC-004.4, AC-004.5) +- [ ] 10. 前端扩展功能开发 + - [ ] 10.1 创建盒子扩展设置弹窗 + - 创建 `src/views/business/goods/components/GoodsExtendDialog.vue` + - 显示盒子基本信息 + - 实现支付方式多选 + - 实现支付类型选择 + - 实现保存和删除扩展设置 + - _Requirements: 7.1, 7.2, 7.3, 7.4_ -### Task 4.2: 创建奖品新增弹窗 -- [ ] 创建 `src/views/business/goods/components/PrizeAddDialog.vue` -- [ ] 实现基础信息表单(名称、售价、采购价、参考价) -- [ ] 实现奖品分类选择(现货/预售/货币/宝箱) -- [ ] 实现奖品等级选择(A/B/C/D/E) -- [ ] 实现图片上传(奖品图、详情图) -- [ ] 实现表单验证 + - [ ] 10.2 创建盒子类型字段配置 + - 创建 `src/views/business/goods/config/typeFieldConfig.ts` + - 定义盒子类型枚举 `GoodsType` + - 定义盒子类型标签映射 `GoodsTypeLabels` + - 定义盒子类型字段配置 `GoodsTypeFieldConfigs` + - 定义奖品分类枚举 `PrizeCategory` + - _Requirements: 2.2, 5.4_ -**关联需求:** US-005 (AC-005.1, AC-005.2, AC-005.3, AC-005.8) +- [ ] 11. 路由和权限配置 + - [ ] 11.1 配置路由和权限 + - 在 `src/router/modules/business.ts` 添加路由配置 + - 配置盒子管理路由 `/business/goods` + - 配置盒子类型路由 `/business/goods/type` + - 配置权限标识 `goods:list`, `goods:type` -### Task 4.3: 实现奖品条件字段 -- [ ] 根据盒子类型显示数量或概率字段 -- [ ] 翻倍赏显示赠送倍率 -- [ ] 领主赏显示是否领主开关 -- [ ] 预售类型显示预售时间 -- [ ] 实现赠送货币配置组件 +- [ ] 12. Checkpoint - 完整功能验证 + - 确保所有页面正常访问 + - 测试完整的商品管理流程 + - 验证权限控制正常工作 -**关联需求:** US-005 (AC-005.4, AC-005.5, AC-005.6, AC-005.7) +- [ ] 13. 属性测试 + - [ ] 13.1 编写盒子类型字段配置一致性属性测试 + - **Property 1: 盒子类型字段配置一致性** + - **Validates: Requirements 2.2, 2.8, 2.9, 2.10** -### Task 4.4: 创建奖品编辑弹窗 -- [ ] 创建 `src/views/business/goods/components/PrizeEditDialog.vue` -- [ ] 复用新增弹窗的表单结构 -- [ ] 实现数据回显 -- [ ] 实现更新逻辑 -- [ ] 实现删除功能 + - [ ] 13.2 编写盒子创建参数验证属性测试 + - **Property 2: 盒子创建参数验证** + - **Validates: Requirements 2.3, 2.4** -**关联需求:** US-004 (AC-004.6) + - [ ] 13.3 编写盒子状态切换一致性属性测试 + - **Property 3: 盒子状态切换一致性** + - **Validates: Requirements 1.3** ---- + - [ ] 13.4 编写奖品概率总和验证属性测试 + - **Property 4: 奖品概率总和验证** + - **Validates: Requirements 4.5** -## 阶段5: 盒子类型管理 + - [ ] 13.5 编写盒子扩展设置继承属性测试 + - **Property 5: 盒子扩展设置继承** + - **Validates: Requirements 7.1, 7.4** -### Task 5.1: 创建盒子类型管理页面 -- [ ] 创建 `src/views/business/goods/type.vue` -- [ ] 实现类型列表表格(ID、名称、Key、排序) -- [ ] 实现首页显示、分类显示开关 -- [ ] 显示支付方式、角标文字 -- [ ] 实现新增、编辑、删除操作 + - [ ] 13.6 编写API响应格式一致性属性测试 + - **Property 6: API响应格式一致性** + - **Validates: Requirements 8.1-8.9** -**关联需求:** US-006 (AC-006.1, AC-006.2, AC-006.3, AC-006.4, AC-006.5) - -### Task 5.2: 创建类型新增/编辑弹窗 -- [ ] 创建 `src/views/business/goods/components/TypeAddDialog.vue` -- [ ] 创建 `src/views/business/goods/components/TypeEditDialog.vue` -- [ ] 实现类型名称、Key、排序输入 -- [ ] 实现首页显示、分类显示开关 -- [ ] 实现支付方式多选 -- [ ] 实现角标文字输入 -- [ ] 实现支付类型选择(抵扣/支付) - -**关联需求:** US-006 (AC-006.2, AC-006.3, AC-006.4, AC-006.5) - ---- - -## 阶段6: 扩展功能和测试 - -### Task 6.1: 创建盒子扩展设置弹窗 -- [ ] 创建 `src/views/business/goods/components/GoodsExtendDialog.vue` -- [ ] 显示盒子基本信息 -- [ ] 实现支付方式多选 -- [ ] 实现支付类型选择 -- [ ] 实现保存和删除扩展设置 - -**关联需求:** US-007 (AC-007.1, AC-007.2, AC-007.3, AC-007.4) - -### Task 6.2: 配置路由和权限 -- [ ] 在 `src/router/modules/business.ts` 添加路由配置 -- [ ] 配置盒子管理路由 `/business/goods` -- [ ] 配置盒子类型路由 `/business/goods/type` -- [ ] 配置权限标识 `goods:list`, `goods:type` - -**关联需求:** 所有 - ---- - -## 阶段7: 属性测试 - -### Task 7.1: 创建属性测试 -- [ ] 创建 `GoodsManagementFrontendPropertyTests.cs` -- [ ] 测试盒子类型字段配置一致性 -- [ ] 测试盒子创建有效数据成功 -- [ ] 测试盒子创建无效类型失败 -- [ ] 测试奖品创建有效数据成功 -- [ ] 测试奖品概率总和不超过100% - -**关联需求:** NFR-001 +- [ ] 14. Final Checkpoint - 最终验证 + - 确保所有测试通过 + - 确保所有功能正常工作 + - 如有问题,询问用户 --- @@ -219,6 +304,8 @@ - [ ] 盒子列表正常显示,支持搜索、分页 - [ ] 盒子新增支持10种类型,字段动态显示正确 - [ ] 盒子编辑类型不可修改,其他字段可编辑 +- [ ] 盒子复制功能正常(含奖品) +- [ ] 清空抽奖功能正常(有二次确认) - [ ] 奖品列表根据盒子类型显示不同列 - [ ] 奖品新增/编辑功能正常 - [ ] 盒子类型管理功能正常 @@ -231,3 +318,10 @@ - [ ] 操作提示正确显示 - [ ] 删除操作有二次确认 - [ ] 属性测试全部通过 + +## Notes + +- 每个Checkpoint确保增量验证 +- 后端API需要先完成才能进行前端开发 +- 属性测试验证通用正确性属性 +- 盒子类型字段配置是核心复杂度,需要仔细处理