4.7 KiB
4.7 KiB
产品列表功能修复总结
问题描述
管理员专用的产品列表功能存在以下问题:
- 不返回产品的展示状态(
is_visible字段) - 与用户端的产品列表功能没有明确区分
- 用户端可能看到隐藏的产品
- 缺乏清晰的链路分离,不利于后续维护
解决方案
1. 创建专门的响应结构
新增响应结构:
ProductAdminInfoResponse:管理员专用,包含is_visible字段ProductAdminListResponse:管理员专用列表响应
保持原有结构:
ProductInfoResponse:用户端使用,不包含is_visible字段ProductListResponse:用户端列表响应
2. 应用服务层方法分离
新增管理员专用方法:
ListProductsForAdmin(ctx context.Context, filters map[string]interface{}, options interfaces.ListOptions) (*responses.ProductAdminListResponse, error)
GetProductByIDForAdmin(ctx context.Context, query *queries.GetProductQuery) (*responses.ProductAdminInfoResponse, error)
新增用户端专用方法:
GetProductByIDForAdmin(ctx context.Context, query *queries.GetProductQuery) (*responses.ProductInfoResponse, error)
3. 筛选逻辑优化
用户端筛选逻辑:
- 默认只显示可见产品(
is_visible = true) - 包含用户订阅状态信息
- 无法查看隐藏产品
管理员端筛选逻辑:
- 可以看到所有产品(包括隐藏的)
- 支持按可见状态筛选
- 不包含用户订阅状态
4. 产品详情获取分离
用户端产品详情:
- 验证产品可见性
- 隐藏产品返回 404 错误
- 不包含可见状态信息
管理员端产品详情:
- 可以获取任何产品的详情
- 包含可见状态信息
- 无可见性限制
修改的文件
1. 响应结构文件
internal/application/product/dto/responses/product_responses.go- 新增
ProductAdminInfoResponse结构 - 新增
ProductAdminListResponse结构
- 新增
2. 应用服务接口
internal/application/product/product_application_service.go- 新增管理员专用方法接口
- 新增用户端专用方法接口
3. 应用服务实现
internal/application/product/product_application_service_impl.go- 实现
ListProductsForAdmin方法 - 实现
GetProductByIDForAdmin方法 - 实现
GetProductByIDForUser方法 - 新增
convertToProductAdminInfoResponse转换方法
- 实现
4. HTTP 处理器
-
internal/infrastructure/http/handlers/product_admin_handler.go- 修改
ListProducts方法使用管理员专用服务 - 修改
GetProductDetail方法使用管理员专用服务 - 更新 Swagger 文档注释
- 修改
-
internal/infrastructure/http/handlers/product_handler.go- 修改
ListProducts方法默认只显示可见产品 - 修改
GetProductDetail方法使用用户端专用服务 - 更新 Swagger 文档注释
- 修改
5. 测试文件
test/admin_product_list_test.go- 新增管理员筛选功能测试
- 新增用户筛选功能测试
- 新增响应结构差异测试
- 新增功能区分逻辑测试
6. 文档文件
docs/产品列表功能区分说明.md- 详细说明功能区分
- 响应结构对比
- 实现细节说明
- 维护建议
功能验证
1. 编译测试
- ✅ 代码编译成功,无语法错误
2. 单元测试
- ✅ 管理员筛选功能测试通过
- ✅ 用户筛选功能测试通过
- ✅ 响应结构差异测试通过
- ✅ 功能区分逻辑测试通过
3. 功能验证
管理员端功能:
- ✅ 可以看到所有产品(包括隐藏的)
- ✅ 返回产品可见状态信息
- ✅ 支持按可见状态筛选
- ✅ 不包含用户订阅状态
用户端功能:
- ✅ 默认只显示可见产品
- ✅ 包含用户订阅状态信息
- ✅ 无法查看隐藏产品详情
- ✅ 响应结构不包含可见状态
维护链路
1. 清晰的职责分离
- 管理员端和用户端使用不同的响应结构
- 应用服务层方法明确分离
- HTTP 处理器职责清晰
2. 易于扩展
- 新增功能时可以选择合适的响应结构
- 筛选逻辑可以独立修改
- 测试覆盖完整
3. 文档完善
- 详细的实现说明文档
- 清晰的 API 文档注释
- 完整的测试用例
注意事项
- 向后兼容:保持了原有的用户端 API 接口不变
- 权限控制:确保路由级别的权限控制正确实现
- 数据安全:用户无法看到产品的可见状态信息
- 性能考虑:筛选逻辑在应用层实现,避免数据库层面的复杂查询
后续建议
- 监控:添加产品列表访问的监控指标
- 缓存:考虑对产品列表进行缓存优化
- 分页优化:优化大数据量时的分页性能
- 搜索优化:考虑添加全文搜索功能