Skip to content

接口层

接口层是对外提供服务的接口,它是一个纯接口,不包含任何实现。接口层的作用是定义接口的输入和输出,以及接口的功能。

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架构的介绍,我会在后面的章节中介绍。简单理解就是将数据更新数据查询分离,这样可以提高系统的性能和可扩展性。