- 新增 .dockerignore 文件,忽略多种临时及中间文件 - 新增 .gitattributes 文件,配置文本文件换行及合并行为 - 新增详细的 .gitignore 文件,排除多种开发及生成文件 - 新增 VS Code C# 代码片段,提升开发效率 - 添加 Directory.Build.props,统一 MSBuild 配置和代码分析规则 - 添加空的 Directory.Build.targets,预留构建任务扩展位置 - 添加 Directory.Packages.props,实现依赖包版本集中管理和声明
7.8 KiB
7.8 KiB
后端功能概览
本文档简要说明当前后端(Backend)已完成的主要功能与技术实现,便于后续开发和前后端联调。
一、整体技术栈与架构
-
技术栈
- .NET 10
- EF Core + SQLite
- CAP + NetCorePal 集成事件
- FastEndpoints 用于 API 端点
-
架构风格
- CleanDDD 分层结构:Domain / Infrastructure / Web
- 聚合根统一继承
Entity<TId>, IAggregateRoot - 使用强类型 ID(
xxxId : IGuidStronglyTypedId) - 领域事件 + 集成事件 解耦跨聚合、跨事务操作
- 命令(Command)与查询(Query)各自独立,命令处理器只操作仓储,不显式保存事务
二、已完成的核心聚合与领域模型
-
会员聚合(MemberAggregate)
- 会员注册、登录
- 基本信息:手机号、密码(加密后存储)、昵称
- 会员等级值对象(Level):等级编码、名称、所需积分、积分倍率
- 积分账户:累计积分、可用积分
-
营销码聚合(MarketingCodeAggregate)
- 一物一码:唯一营销码与产品信息绑定
- 状态管理:未使用/已使用
- 使用营销码会发布
MarketingCodeUsedDomainEvent
-
积分规则聚合(PointsRuleAggregate)
- 支持按产品 / 类目 / 会员等级 / 时间区间配置规则
- 可以计算应得积分(当前实现为“取匹配规则中的最高值”)
-
积分交易聚合(PointsTransactionAggregate)
- 已从会员聚合中拆分为独立聚合
- 支持四类交易:获取(Earn)、消费(Consume)、退还(Refund)、过期(Expire)
- 通过集成事件异步创建记录(详见第四节)
-
礼品聚合(GiftAggregate)
- 礼品基本信息:名称、类型(实物/虚拟/自有产品)、描述、图片
- 业务字段:所需积分、总库存、可用库存、每人限兑数量、是否上架、排序
- 领域行为:
Update(...)更新礼品信息AddStock(...)增加库存ReserveStock(...)下单时预留库存DeductStock(...)发货时扣减总库存ReleaseStock(...)订单取消时释放库存PutOnShelf/PutOffShelf上/下架
-
兑换订单聚合(RedemptionOrderAggregate)
- 基本字段:订单号、会员ID、礼品ID/名称/类型、数量、消耗积分
- 收货地址值对象(Address) 用于实物礼品
- 状态机:Pending → Dispatched → Delivered → Completed / Cancelled
- 领域行为:
MarkAsDispatched、MarkAsDelivered、Complete、Cancel - 领域事件:
RedemptionOrderCreatedDomainEvent(创建订单)RedemptionOrderDispatchedDomainEvent(发货)RedemptionOrderCancelledDomainEvent(取消)- 其他状态事件(已送达、完成)
三、会员与积分业务流程
-
会员注册 / 登录
- 命令:
RegisterMemberCommand:校验手机号唯一性,保存会员LoginMemberCommand:验证手机号+密码
- 端点(示例):
POST /api/members/registerPOST /api/members/login
- 命令:
-
扫码使用营销码 → 发放积分
- 命令:
UseMarketingCodeCommand- 校验营销码是否存在、是否可用
- 关联会员后标记营销码为已使用
- 更新由
IMarketingCodeRepository完成
- 领域事件:
MarketingCodeUsedDomainEvent - 领域事件处理器:
MarketingCodeUsedDomainEventHandlerForEarnPoints- 加载会员
- 通过
IPointsRuleRepository.GetEffectiveRulesAsync匹配积分规则 - 计算应得积分 + 过期时间
- 调用
Member.AddPoints(...) - 更新会员(不会在此处创建积分交易记录)
- 命令:
四、积分交易与集成事件流程
-
领域事件 → 集成事件
- 会员增加积分时发布
PointsAddedDomainEvent - Web 层有对应的集成事件转换器(IIntegrationEventConverter):
PointsAddedToPointsEarnedConverter等
- 集成事件定义(实现
IIntegrationEvent):PointsEarnedIntegrationEventPointsConsumedIntegrationEventPointsRefundedIntegrationEventPointsExpiredIntegrationEvent
- 集成事件只携带 ID 和必要基础字段(MemberId, Amount, RelatedId, ExpiryDate 等), 不包含聚合对象。
- 会员增加积分时发布
-
集成事件处理器(IIntegrationEventHandler)
- 在 Web 层实现, 通过
ApplicationDbContext读写积分交易表:- 收到 Earn/Consume/Refund/Expire 事件
- 基于
RelatedId或批次ID 做幂等性检查 - 调用
PointsTransaction.CreateXxxTransaction(...)创建交易聚合 - 保存到
PointsTransactions表
- 在 Web 层实现, 通过
-
事务与一致性
- 积分变更(会员聚合) 与 积分交易记录(PointsTransaction 聚合) 处于不同事务
- 通过领域事件 → 集成事件 → 处理器链路实现最终一致性
五、礼品与积分商城功能
-
礼品管理(管理端)
- 命令(Commands):
CreateGiftCommand:创建礼品UpdateGiftCommand:更新礼品信息PutOnShelfCommand/PutOffShelfCommand:上/下架AddGiftStockCommand:增加库存
- 查询(Queries):
GetGiftsQuery:按类型/是否上架筛选列表GetGiftByIdQuery:礼品详情
- 仓储:
IGiftRepository+GiftRepository - 端点(Endpoints):
POST /api/admin/giftsPUT /api/admin/gifts/{GiftId}POST /api/admin/gifts/{GiftId}/putonshelfPOST /api/admin/gifts/{GiftId}/putoffshelfPOST /api/admin/gifts/{GiftId}/addstockGET /api/admin/giftsGET /api/admin/gifts/{GiftId}
- 命令(Commands):
-
会员端积分商城
- 礼品浏览与详情:
GET /api/gifts:仅返回已上架礼品GET /api/gifts/{GiftId}:礼品详情
- 兑换礼品(创建兑换订单):
- 命令:
CreateRedemptionOrderCommand- 校验礼品存在且已上架
- 校验库存及每人限兑数量(通过
IRedemptionOrderRepository.GetMemberRedemptionCountAsync) - 校验会员可用积分是否足够
- 调用会员聚合
ConsumePoints扣减积分并更新会员 - 构造收货地址(实物礼品必须提供地址)
- 创建兑换订单聚合
RedemptionOrder - 使用仓储
IRedemptionOrderRepository.AddAsync持久化
- 端点:
POST /api/gifts/redeem
- 命令:
- 会员查询自己的兑换订单:
- 查询:
GetRedemptionOrdersQuery/GetRedemptionOrderByIdQuery - 端点:
GET /api/redemption-orders/my(按会员+状态过滤)GET /api/redemption-orders/{OrderId}
- 查询:
- 礼品浏览与详情:
-
后台兑换订单管理(管理端)
- 列表/详情:同上查询, 管理端端点前缀
/api/admin/redemption-orders - 状态流转命令:
MarkOrderAsDispatchedCommand:发货CompleteOrderCommand:完成CancelOrderCommand:取消
- 对应端点:
POST /api/admin/redemption-orders/{OrderId}/dispatchPOST /api/admin/redemption-orders/{OrderId}/completePOST /api/admin/redemption-orders/{OrderId}/cancel
- 列表/详情:同上查询, 管理端端点前缀
-
兑换订单相关领域事件处理器
RedemptionOrderCreatedDomainEventHandler:- 加载礼品聚合
- 调用
Gift.ReserveStock(...)预留库存 - 调用仓储
UpdateAsync持久化
RedemptionOrderCancelledDomainEventHandler:- 释放库存
Gift.ReleaseStock(...)
- 释放库存
RedemptionOrderDispatchedDomainEventHandler:- 发货后扣减总库存
Gift.DeductStock(...)
- 发货后扣减总库存
六、当前状态与后续工作建议
-
当前状态
- 后端项目可以成功编译(
dotnet build);存在若干 Sonar 质量规则警告(主要是 TODO/异常处理提示), 不影响运行 - 会员、营销码、积分规则、积分交易、礼品、兑换订单等核心领域模型和主要业务流程已经打通
- 后端项目可以成功编译(
-
后续可选工作
- 增加更多查询(如礼品统计、积分流水查询分页等)
- 完善认证鉴权(从 JWT 中获取当前登录会员ID, 替换临时 MemberId 参数)
- 根据前端实际需要, 补充 DTO 字段或调整 API 结构