针对B2B2C系统的复杂性,我将为你设计一个兼顾扩展性和业务隔离的详细目录结构。这种架构需要同时支持平台运营、商家管理和消费者服务。
🏗️ B2B2C系统推荐目录结构
我建议采用 “多模块+子域分离” 的混合架构。这种结构既能保证技术一致性,又能实现业务隔离。
b2b2c-platform/ # 平台父工程
├─ start/ # 启动模块
├─ common/ # 通用模块(平台级)
├─ gateway/ # API网关(可选)
│
├─ core-modules/ # 核心模块(所有子域共享)
│ ├─ user-center/ # 用户中心
│ ├─ product-center/ # 商品中心
│ ├─ order-center/ # 订单中心
│ └─ payment-center/ # 支付中心
│
├─ business-domains/ # 业务域(按B2B2C角色分离)
│ ├─ platform-admin/ # 平台管理端
│ ├─ merchant-backend/ # 商家后台
│ └─ consumer-app/ # 消费者端
│
└─ supporting-services/ # 支撑服务
├─ file-service/ # 文件服务
├─ message-service/ # 消息服务
└─ search-service/ # 搜索服务📂 详细模块内部结构(以订单中心为例)
每个核心模块采用标准的COLA分层结构,但会考虑B2B2C的多租户特性:
order-center/
├─ src/main/java/com/b2b2c/order/
│ ├─ adapter/ # 适配层(按协议分离)
│ │ ├─ web/
│ │ │ ├─ PlatformOrderController.java # 平台管理API
│ │ │ ├─ MerchantOrderController.java # 商家订单API
│ │ │ └─ ConsumerOrderController.java # 消费者订单API
│ │ ├─ rpc/ # 对内RPC接口(供其他服务调用)
│ │ └─ mq/ # 消息监听(订单事件)
│ │
│ ├─ client/ # 接口层(多角色API)
│ │ ├─ api/
│ │ │ ├─ PlatformOrderServiceI.java # 平台端接口(全量数据)
│ │ │ ├─ MerchantOrderServiceI.java # 商家端接口(仅本店数据)
│ │ │ └─ ConsumerOrderServiceI.java # 消费者接口(个人订单)
│ │ └─ dto/
│ │ ├─ command/
│ │ │ ├─ PlatformOrderQueryCmd.java # 平台复杂查询
│ │ │ ├─ MerchantOrderCreateCmd.java # 商家代客下单
│ │ │ └─ ConsumerOrderCreateCmd.java # 消费者下单
│ │ └─ data/
│ │ ├─ PlatformOrderDTO.java # 含商家信息的订单
│ │ ├─ MerchantOrderDTO.java # 商家视角订单
│ │ └─ ConsumerOrderDTO.java # 消费者视角订单
│ │
│ ├─ app/ # 应用层(用例按角色分离)
│ │ ├─ executor/
│ │ │ ├─ platform/ # 平台用例
│ │ │ │ ├─ OrderStatisticsExe.java # 订单统计
│ │ │ │ └─ OrderAuditExe.java # 订单审核
│ │ │ ├─ merchant/ # 商家用例
│ │ │ │ ├─ MerchantOrderCreateExe.java # 商家下单
│ │ │ │ ├─ OrderShipExe.java # 发货
│ │ │ │ └─ OrderRefundAuditExe.java # 退款审核
│ │ │ └─ consumer/ # 消费者用例
│ │ │ ├─ ConsumerOrderCreateExe.java # 消费者下单
│ │ │ ├─ OrderCancelExe.java # 取消订单
│ │ │ └─ OrderRefundApplyExe.java # 申请退款
│ │ └─ service/
│ │ └─ OrderFacadeServiceImpl.java # 门面服务,聚合不同角色操作
│ │
│ ├─ domain/ # 领域层(核心业务模型)
│ │ ├─ model/
│ │ │ ├─ entity/
│ │ │ │ ├─ Order.java # 订单聚合根
│ │ │ │ ├─ OrderItem.java # 订单项
│ │ │ │ ├─ OrderPayment.java # 支付信息
│ │ │ │ ├─ OrderLogistics.java # 物流信息
│ │ │ │ └─ OrderRefund.java # 退款信息
│ │ │ ├─ vo/ # 值对象
│ │ │ │ ├─ ReceiverInfo.java # 收货信息
│ │ │ │ ├─ InvoiceInfo.java # 发票信息
│ │ │ │ └─ PromotionInfo.java # 促销信息
│ │ │ └─ enum/
│ │ │ ├─ OrderSourceEnum.java # 订单来源(平台/商家/消费者)
│ │ │ ├─ OrderTypeEnum.java # 订单类型(普通/预售/拼团)
│ │ │ └─ OrderStatusEnum.java # 状态机(待付款->待发货->...)
│ │ ├─ service/
│ │ │ ├─ OrderDomainService.java # 订单领域服务
│ │ │ ├─ OrderSplitService.java # 拆单服务(重要!)
│ │ │ ├─ OrderPriceService.java # 价格计算(含平台/商家分成)
│ │ │ └─ OrderStatusMachine.java # 订单状态机
│ │ ├─ gateway/
│ │ │ ├─ OrderRepository.java # 订单仓储接口
│ │ │ ├─ ProductGateway.java # 商品信息防腐层
│ │ │ ├─ MerchantGateway.java # 商家信息防腐层
│ │ │ ├─ InventoryGateway.java # 库存防腐层
│ │ │ └─ PaymentGateway.java # 支付防腐层
│ │ └─ event/
│ │ ├─ OrderCreatedEvent.java # 订单创建事件
│ │ ├─ OrderPaidEvent.java # 订单支付事件
│ │ └─ OrderDeliveredEvent.java # 订单发货事件
│ │
│ └─ infrastructure/ # 基础设施层(多租户支持)
│ ├─ config/
│ │ ├─ MultiTenantConfig.java # 多租户配置
│ │ ├─ DataSourceConfig.java # 数据源(按商家分库分表)
│ │ └─ RedisConfig.java # 缓存配置
│ ├─ persistence/
│ │ ├─ mapper/
│ │ │ ├─ OrderMapper.java
│ │ │ └─ OrderItemMapper.java
│ │ ├─ dataobject/
│ │ │ ├─ OrderDO.java # 订单DO(含tenant_id)
│ │ │ └─ OrderItemDO.java # 订单项DO
│ │ └─ converter/
│ │ └─ OrderConverter.java # 转换器
│ ├─ gatewayimpl/
│ │ ├─ OrderRepositoryImpl.java # 仓储实现
│ │ ├─ ProductGatewayImpl.java # 商品服务调用
│ │ └─ MerchantGatewayImpl.java # 商家服务调用
│ ├─ mq/
│ │ └─ OrderEventPublisher.java # 订单事件发布
│ ├─ external/
│ │ ├─ ProductClient.java # 商品服务客户端
│ │ ├─ MerchantClient.java # 商家服务客户端
│ │ └─ LogisticsClient.java # 物流服务客户端
│ └─ util/
│ ├─ OrderNoGenerator.java # 订单号生成(含商家标识)
│ └─ AmountCalculator.java # 金额计算(平台抽成)🔗 B2B2C特有的依赖关系与数据流转
🎯 B2B2C关键实现要点
- 多租户数据隔离
java
// 在领域实体中标识租户
public class Order {
private Long orderId;
private String orderNo;
private Long tenantId; // 商家ID(租户标识)
private Long platformId; // 平台ID
private Long consumerId; // 消费者ID
// …
}
// 在仓储实现中自动过滤
@Repository
public class OrderRepositoryImpl implements OrderRepository {
@Override
public List
// 自动添加租户过滤条件
return orderMapper.selectByConsumer(consumerId, getCurrentTenantId());
}
}
- 订单拆单与分账逻辑
java
// 订单拆分服务(重要!)
@Service
public class OrderSplitService {
// B2B2C拆单策略:按商家拆单
public List<Order> splitByMerchant(CreateOrderCmd cmd) {
// 1. 按商家分组商品
Map<Long, List<OrderItem>> merchantItems =
cmd.getItems().stream()
.collect(Collectors.groupingBy(OrderItem::getMerchantId));
// 2. 为每个商家创建子订单
List<Order> subOrders = new ArrayList<>();
merchantItems.forEach((merchantId, items) -> {
Order subOrder = createSubOrder(cmd, merchantId, items);
// 3. 计算平台佣金
calculatePlatformCommission(subOrder);
subOrders.add(subOrder);
});
return subOrders;
}
private void calculatePlatformCommission(Order order) {
// 平台抽成逻辑
BigDecimal platformRate = getPlatformRate(order.getMerchantId());
BigDecimal commission = order.getAmount().multiply(platformRate);
order.setPlatformCommission(commission);
order.setMerchantAmount(order.getAmount().subtract(commission));
}}
- 分层鉴权设计
java
// 适配层控制器添加角色注解
@RestController
@RequestMapping(“/api/order”)
public class MerchantOrderController {
@MerchantAuth // 自定义商家权限注解
@PostMapping("/ship")
public Result shipOrder(@RequestBody ShipOrderCmd cmd) {
// 只能操作自己店铺的订单
return orderShipExe.execute(cmd);
}}
// 应用层执行器校验数据权限
@Component
public class OrderShipExe {
public Result execute(ShipOrderCmd cmd) {
// 1. 验证订单属于当前商家
Order order = orderRepository.findById(cmd.getOrderId());
if (!order.getMerchantId().equals(getCurrentMerchantId())) {
throw new UnauthorizedException(“无权操作此订单”);
}
// 2. 执行业务逻辑
order.ship(cmd.getLogisticsInfo());
// ...
}}
📊 部署与团队协作建议
模块开发优先级
第一阶段(基础):common + user-center + product-center
第二阶段(核心):order-center + payment-center(实现完整交易闭环)
第三阶段(扩展):merchant-backend + consumer-app + platform-admin
第四阶段(优化):supporting-services(文件、消息、搜索等服务化)团队分工模式
平台团队:负责common、core-modules、platform-admin
商家团队:负责merchant-backend及商家相关业务逻辑
消费者团队:负责consumer-app及C端体验优化
基础架构团队:负责supporting-services和部署运维最后编辑:Ddd4j 更新时间:2025-12-15 13:14