接口层
接口层是对外提供服务的接口,它是一个纯接口,不包含任何实现。接口层的作用是定义接口的输入和输出,以及接口的功能。
form
表单层
是用于接收前端传递的数据的对象,它是一个纯对象,不包含任何实现。`form` 表单层的
作用是定义表单的输入和输出,以及表单的功能。
├── form
│ ├── NewXXXForm.java
│ ├── UpdateXXXForm.java
│ ├── QueryXXXForm.java
代码示例:
java
@Data
public class CreateApiForm {
// 菜单模块
private Long module;
// 名称
@NotBlank(message = "名称不能为空!")
private String name;
// 权限标识
private String access;
// 类型
private Integer type;
// 是否启用(0 否 1 是)
private Boolean enabled;
// 是否删除(0 否 1 是)
private Boolean deleted;
}
vo
视图层
是用于返回前端的数据的对象,它是一个纯对象,不包含任何实现。`vo` 视图层的作用是定义视图的
输入和输出,以及视图的功能。
├── vo
│ ├── ApiVO.java
代码示例:
java
// 这是用于前端展示的数据对象,前端要什么数据格式就给什么数据格式
@Data
public class ApiVO implements BaseVO {
// ID
private Long id;
// 创建时间
private Instant createTime;
// 更新时间
private Instant updateTime;
// 创建人
private Long createUser;
// 更新人
private Long updateUser;
// 名称
private String name;
// 权限标识
private String access;
// 类型
private Integer type;
// 是否启用(0 否 1 是)
private Boolean enabled;
// 是否删除(0 否 1 是)
private Boolean deleted;
// 菜单模块
private Module module;
}
controller
接口层
是用于接收前端传递的数据的对象,它是一个纯对象,不包含任何实现。`controller` 接口层的作用是
定义接口的输入和输出,以及接口的功能。
├── controller
│ ├── ApiController.java
代码示例:
java
@RestController
@RequestMapping("/api/v1/api")
public class ApiController {
@Autowired
private UniversalCommandBus commandBus; // 注入通用CommandBus
@Autowired
private UniversalQueryBus queryBus;
@PreAuthorize("hasAuthority('development:api:add')")
@PostMapping
public Result<Void> createApi(@RequestBody @Valid CreateApiForm createApiForm){
Void result = commandBus.execute(ApiCommandMapper.INSTANCE.covertToCreateApiCommand(createApiForm));
return Result.success("创建成功", result);
}
@PreAuthorize("hasAuthority('development:api:modify')")
@PutMapping("/{id}")
public Result<Void> updateApi(@PathVariable Long id, @RequestBody @Valid UpdateApiForm apiForm){
UpdateApiCommand command = ApiCommandMapper.INSTANCE.covertToUpdateApiCommand(apiForm);
command.setId(id);
Void result = commandBus.execute(command);
return Result.success("更新成功",result);
}
@PreAuthorize("hasAuthority('development:api:list')")
@GetMapping("/{currentPage}/{pageSize}")
public Result<PageVO<ApiListVO>> getApis(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize, @ModelAttribute QueryApiForm apiForm){
GetPageApiQuery getPageApiQuery = ApiQueryMapper.INSTANCE.covertToGetPageApiQuery(apiForm);
getPageApiQuery.setCurrentPage(currentPage);
getPageApiQuery.setPageSize(pageSize);
PageVO<ApiListVO> pageVO = queryBus.execute(getPageApiQuery);
return Result.success("查询成功",pageVO);
}
@PreAuthorize("hasAuthority('development:api:get')")
@GetMapping("/{id}")
public Result<ApiVO> getApiById(@PathVariable("id") Long id) {
GetApiDetailQuery detailQuery = new GetApiDetailQuery(id);
return Result.success("获取成功", queryBus.execute(detailQuery));
}
@PreAuthorize("hasAuthority('development:api:remove')")
@DeleteMapping
public Result<Void> removeApi(@RequestBody List<Long> ids){
DeleteApiCommand deleteApiCommand = new DeleteApiCommand();
deleteApiCommand.setIds(ids);
return Result.success("删除成功", commandBus.execute(deleteApiCommand));
}
}
这里没有直接调用Service来处理,是因为使用了CQRS
架构,这里是使用了通用CommandBus
和通用QueryBus
来处理,具体的处理逻辑是在Service中实现的。
关于CQRS架构
的介绍,我会在后面的章节中介绍。简单理解就是将数据更新
和数据查询
分离,这样可以提高系统的性能和可扩展性。