项目简介
本项目是一个基于Spring Boot和Vue的DDD(领域驱动设计)微服务框架,旨在助力开发者快速实现领域驱动设计的工程化落地。项目采用四层架构,包含接口层、应用层、领域层和基础设施层,通过CQRS(命令查询职责分离)模式将应用服务分为CommandService和QueryService,达成高内聚、低耦合的设计。
项目的主要特性和功能
架构说明
- 接口层:对外提供REST接口,按调用方不同分包。
- 应用层:负责业务逻辑编排,应用服务按CQRS模式分为CommandService和QueryService。
- CommandService:处理改变系统状态的业务场景(写操作),仅依赖领域层。
- QueryService:处理查询数据的业务场景(读操作),可穿透领域层直接调用基础设施层数据库查询方法。
- 领域层:核心层,完全独立,沉淀业务领域模型,核心业务逻辑在此层。包含实体、值对象、聚合、领域服务和仓储(仅定义接口)。
- 基础设施层:负责与其他微服务、外部系统、数据库及Redis等中间件交互,包括项目配置、仓储实现和对象转换器。
通用组件
提供对象转换器、仓储实现等通用组件,避免开发者编写重复代码。
示例讲解
针对简单增删改查业务,通过继承、实现通用的Entity
、DataObject
、Result
、Repository
、Convertor
、Mapper
,避免编写重复代码。
安装使用步骤
创建项目
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】