封装了r2dbc实现了动态DDL,DSL动态条件等便捷操作.实现一个增删改差只需要2步.

创建实体类,使用jpa注解描述映射关系.

在需要使用crud的地方直接注入ReactiveRepository<TestEntity,String>即可,如:

  1. @Autowired
  2. ReactiveRepository<TestEntity,String> testRepository;

TIP

启动类上需要注解: @EnableEasyormRepository("实体类所在包,如: org.jetlinks.community.**.entity").

CRUD Service

hsweb提供了GenericReactiveCrudService,使用ReactiveRepository实现通用增删该查.例如:

支持缓存的Service

  1. @Service
  2. public class TestService extends GenericReactiveCacheSupportCrudService<TestEntity, String> {
  3. @Override
  4. public String getCacheName() {
  5. return "test-entity-cache";
  6. }

GenericReactiveTreeSupportCrudService,提供了对树结构数据对一些通用处理,如List树结构互转.

TIP

树结构实体需要实现: TreeSortSupportEntity接口,或者继承GenericTreeSortSupportEntity

hsweb和jetlinks都使用注解式来声明web映射,方式与spring-mvc类似.

Web Crud

增删改查与Service类似,实现接口:ReactiveCrudController(基于ReactiveRepository),或者ReactiveServiceCrudController基于(ReactiveCrudService)即可.树结构实体还可以实现:ReactiveTreeServiceQueryController接口.

具体的接口内容请查看对应源代码.

hsweb提供来一套统一的权限控制API,方便进行细粒度的权限控制.

注解式

常用注解:

  1. : 用于定义资源,通常注解在类上.
  2. @ResourceAction: 定义对资源对操作,通常注解在方法上.
  3. @QueryAction: 继承自@ResourceAction(id = "query", name = "查询")
  4. @SaveAction: 继承自@ResourceAction(id = "save", name = "保存")
  5. @DeleteAction: 继承自@ResourceAction(id = "delete", name = "删除")
  6. @Authorze: 声明权限控制,注解在类或者方法上,可通过注解属性配置控制权限方式.
  7. @EnableAopAuthorize: 注解在启动类上,开启权限控制.

TIP

@ResourceAction通常使用注解继承的方式来使用,可以更好的管理操作定义.详细使用方法可参照:@QueryAction

在有的场景需要编程方式获取当前用户权限信息,例如:

  1. @GetMapping("/user/detaul/current")
  2. public Mono<UserDetail> getCurrentUserDetail(){
  3. return Authentication
  4. .currentReactive()
  5. .switchIfEmpty(Mono.error(UnAuthorizedException::new))//如果没有用户信息则抛出异常
  6. .map(autz->service.getUserDetail(autz.getUser().getId()))
  7. }

权限维度

hsweb抽象来一个权限维度的概念,例如 用户,角色,公司是维度类型,那么具体的一个用户,角色或者人员就是维度信息. 在Authentication中,没有角色这些固有概念,只有维度,维度是可拓展的.不同的系统,可能维度不同,但是权限控制使用同一套API.

自定义维度

实现接口:DimensionProvider,然后注入到spring即可.例如:

  1. @Component
  2. public class CompanyDimensionProvider implements DimensionProvider {
  3. @Autowired
  4. private CompanyService service;
  5. @Override
  6. public Flux<DimensionType> getAllType() {
  7. //建议使用枚举来实现DimensionType
  8. }
  9. @Override
  10. public Flux<Dimension> getDimensionByUserId(String userId) {
  11. //根据userId获取维度
  12. return service
  13. .findByUserId(userId)
  14. .map(CompanyEntity::toDimension);
  15. }
  16. @Override
  17. public Mono<? extends Dimension> getDimensionById(DimensionType type, String id) {
  18. //根据维度id获取维度
  19. return service.findById(id)
  20. .map(CompanyEntity::toDimension);
  21. }
  22. @Override
  23. public Flux<String> getUserIdByDimensionId(String dimensionId) {
  24. //根据维度ID获取所有用户ID
  25. return service.findUserBind(dimensionId)
  26. .map(CompanyUserBindEntity::getUserId);
  27. }