littlebot
Published on 2025-04-11 / 0 Visits
0

【源码】基于Spring Boot和Vue的DDD领域驱动设计微服务框架

项目简介

本项目是一个基于Spring Boot和Vue的DDD(领域驱动设计)微服务框架,旨在助力开发者快速实现领域驱动设计的工程化落地。项目采用四层架构,包含接口层、应用层、领域层和基础设施层,通过CQRS(命令查询职责分离)模式将应用服务分为CommandService和QueryService,达成高内聚、低耦合的设计。

项目的主要特性和功能

架构说明

  1. 接口层:对外提供REST接口,按调用方不同分包。
  2. 应用层:负责业务逻辑编排,应用服务按CQRS模式分为CommandService和QueryService。
    • CommandService:处理改变系统状态的业务场景(写操作),仅依赖领域层。
    • QueryService:处理查询数据的业务场景(读操作),可穿透领域层直接调用基础设施层数据库查询方法。
  3. 领域层:核心层,完全独立,沉淀业务领域模型,核心业务逻辑在此层。包含实体、值对象、聚合、领域服务和仓储(仅定义接口)。
  4. 基础设施层:负责与其他微服务、外部系统、数据库及Redis等中间件交互,包括项目配置、仓储实现和对象转换器。

通用组件

提供对象转换器、仓储实现等通用组件,避免开发者编写重复代码。

示例讲解

针对简单增删改查业务,通过继承、实现通用的EntityDataObjectResultRepositoryConvertorMapper,避免编写重复代码。

安装使用步骤

创建项目

shell mvn archetype:generate \ -DgroupId=org.example \ -DartifactId=ddd-example \ -Dversion=1.0.0-SNAPSHOT \ -Dpackage=org.example.ddd \ -DarchetypeArtifactId=ddd-microservice-archetype \ -DarchetypeVersion=1.0.0-SNAPSHOT

运行项目

shell mvn spring-boot:run

架构校验

通过测试用例校验代码是否符合DDD规范,防止冲破架构。 java public class DDDArchitectureTest { @Test public void testDDDArchitecture() { ArchitectureTest.validateDDD("org.example"); } }

示例代码

  • 创建实体: ```java @Getter @Builder public class ExampleEntity implements DDDEntity { private Long id; private String username; private String password; private ExampleStatus status;

    public static ExampleEntity create(String username, String password) { // 业务逻辑 }

    public void updatePassword(String oldPassword, String newPassword) { // 业务逻辑 }

    public void enable() { // 业务逻辑 }

    public void disable() { // 业务逻辑 }

    private void checkPasswordFormat() { // 业务逻辑 } } - 创建Result对象:java @Data public class ExampleResult { private Long id; private String username; } - 创建数据对象及Mapper:java @Data public class Example extends DataObject { private String username; private String password; private ExampleStatus status; } java public interface ExampleMapper extends BaseMapper { } - 创建仓储:java public interface ExampleRepository extends DDDRepository { } java @Component public class ExampleRepositoryImpl extends DDDRepositoryImpl implements ExampleRepository { } ```

查询功能

QueryService

java public interface ExampleQueryService extends DDDQueryService<ExampleResult> { } java @Service public class ExampleQueryServiceImpl extends DDDQueryServiceImpl<ExampleEntity, Example, ExampleResult, ExampleConvertor, ExampleMapper> implements ExampleQueryService { }

Query

```java @Data public class ExamplePageQuery extends PageQuery { @QuerySortable private String username;

@QueryCondition(column = "username", operator = ConditionOperator.like)
private String usernameLike;

@QuerySortable(order = OrderType.DESC)
private ExampleStatus status;

@Override
protected Long getMaxSize() {
    return 20l;
}

} java @Data public class ExampleListQuery extends ListQuery { @QuerySortable private String username;

@QueryCondition(column = "username", operator = ConditionOperator.like)
private String usernameLike;

@QuerySortable(order = OrderType.DESC)
private ExampleStatus status;

@Override
protected Long getMaxLimit() {
    return 10l;
}

} ```

API

```java @RestController @RequestMapping("/web/example") public class ExampleController { @Autowired private ExampleQueryService exampleQueryService;

@GetMapping("/page")
public Page<ExampleResult> page(@Valid ExamplePageQuery query) {
    return exampleQueryService.page(query);
}

@GetMapping("/list")
public List<ExampleResult> list(@Valid ExampleListQuery query) {
    return exampleQueryService.list(query);
}

@GetMapping("/{id}")
public ExampleResult detail(@PathVariable Long id) {
    return exampleQueryService.detail(id);
}

} ```

增删改功能

Command

```java @Data public class ExampleCreateCommand { @NotEmpty(message = "请输入用户名") private String username;

@NotEmpty(message = "请输入密码")
private String password;

} java @Data public class ExampleUpdatePasswordCommand { @NotEmpty(message = "请输入旧密码") private String oldPassword;

@NotEmpty(message = "请输入新密码")
private String newPassword;

} ```

CommandService

```java public interface ExampleCommandService { void create(ExampleCreateCommand command);

void update(ExampleUpdatePasswordCommand command);

void enable(Long id);

void disable(Long id);

void delete(Long id);

} java @Service @Transactional public class ExampleCommandServiceImpl implements ExampleCommandService { @Autowired private ExampleRepository exampleRepository;

@Override
public void create(ExampleCreateCommand command) {
    ExampleEntity entity = ExampleEntity.create(command.getUsername(), command.getPassword());
    exampleRepository.save(entity);
}

@Override
public void update(ExampleUpdatePasswordCommand command) {
    Long userId = securityRepository.getLoginUser();
    ExampleEntity entity = exampleRepository.getById(userId);
    entity.updatePassword(command.getOldPassword(), command.getNewPassword());
    exampleRepository.save(entity);
}

@Override
public void enable(Long id) {
    ExampleEntity entity = exampleRepository.getById(id);
    entity.enable();
    exampleRepository.save(entity);
}

@Override
public void disable(Long id) {
    ExampleEntity entity = exampleRepository.getById(id);
    entity.disable();
    exampleRepository.save(entity);
}

@Override
public void delete(Long id) {
    ExampleEntity entity = exampleRepository.getById(id);
    exampleRepository.remove(entity);
}

} ```

API

```java @RestController @RequestMapping("/web/example") public class ExampleController { @Autowired private ExampleCommandService exampleCommandService;

@PostMapping
public void create(@Valid @RequestBody ExampleCreateCommand command) {
    exampleCommandService.create(command);
}

@PutMapping("/password")
public void updatePassword(@Valid @RequestBody ExampleUpdatePasswordCommand command) {
    exampleCommandService.update(command);
}

@PutMapping("/{id}/enabled")
public void enable(@PathVariable Long id) {
    exampleCommandService.enable(id);
}

@PutMapping("/{id}/disabled")
public void disable(@PathVariable Long id) {
    exampleCommandService.disable(id);
}

@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
    exampleCommandService.delete(id);
}

} ```

通过以上步骤,可快速搭建基于Spring Boot和Vue的DDD领域驱动设计微服务框架,并实现基本的增删改查功能。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】