跳转到内容

DataAction

DataAction获取数据包括获取单条数据,获取多条数据,分别实现不同的接口,实现对应的load方法。

入参 QueryValues

前端在多选、Filter 等不同的交互场景下可能为同一个字段提交单值、集合值或者范围值。为了兼容前端交互场景,前端入参通过QueryValues接收。

包含的方法如下,详情见QueryValues类:

方法功能
public boolean isType(String key, QueryValue.Type type)判断给定 key 的值类型
public V getOneValue(String key)按 key 获取单值 value 。如果非单值 value 会抛出错误
public Collection getCollectionValue按 key 获取集合 value 。如果非集合 value 会抛出错误
public V getStartValue(String key)按 key 获取范围 value 的起始值。如果非范围 value 会抛出错误
public V getEndValue(String key)按 key 获取范围 value 的终点值。如果非范围 value 会抛出错误
public Map<String, Object> flatten()将所有 QueryValue 展平,获取内包的 value 值

返回单条数据

实现 io.terminus.trantor.sdk.datasource.SingleDataAction 并注入为 SpringBean 即可。

public interface SingleDataAction<M extends BaseModel> {
M load(QueryValues queryValues);
}

举例:

//这里演示dataAction 返回单条数据的场景
@Component
public class StudentSingleDataAction implements SingleDataAction<Student> {
@Autowired
private StudentRepository studentRepo;
@Override
public SingleDataResult<Student> load(SingleDataParams singleDataParams) {
Integer id = singleDataParams.getQueryValues().getOneValue("id");
Student student = studentRepo.findById(Long.valueOf(id)).get();
return new SingleDataResult(student);
}
}

Trantor 会在启动时扫描到该 bean ,并将其注册为一个 DataSource 类型的 Action 。key 为 moduleKey_ClassSimpleName 。所属模型为产生的数据的所属模型(即泛型的具体类型)。在上面示意的例子下,该 Action 的 key 为 example_action_Student_StudentSingleDataAction ,属于 example_action_Student 模型

返回多条数据

和返回单条数据类似,区别在于需要实现不同的 interface

public interface MultiDataAction<M extends BaseModel> {
MultiDataResult<M> load(QueryValues queryValues, MultiDataParams multiDataParams);
}

其中多出的第二个参数 MultiDataParams 里包括了 paging 、order 和 group 的参数信息。

举例:

/**
* 这里演示dataAction 返回多条数据的场景
*/
@Component
public class StudentMultiDataAction implements MultiDataAction<Student> {
@Autowired
private StudentRepository studentRepo;
@Override
public MultiDataResult<Student> load(MultiDataParams multiDataParams) {
int pageNo = multiDataParams.getPaging() != null ? multiDataParams.getPaging().getNo() : 1;
int pageSize = multiDataParams.getPaging() != null ? multiDataParams.getPaging().getSize() : 10;
Paging<Student> solutions = studentRepo.page(conditionSet -> {
}, pageNo, pageSize);
return new MultiDataResult<>(solutions.getData(), solutions.getTotal());
}
}