Skip to content

$Dto.queryPage/DtoQueryPageBase

$Dto.queryPage/DtoQueryPageBase用于标注带分页的 Query 参数

DtoQueryPageBase的用法

DtoQueryPageBase继承自DtoQueryBase,提供了与分页相关的 Query 参数:pageNo, pageSize

1. 创建DTO

在 VSCode 中,可以通过右键菜单Vona Create/Dto创建 DTO 的代码骨架:

typescript
@Dto()
export class DtoOrderQueryPage {}

2. 继承DtoQueryPageBase

typescript
@Dto()
export class DtoOrderQueryPage extends DtoQueryPageBase {}

DtoQueryPageBase成员字段

由于DtoOrderQueryPage继承自DtoQueryPageBase,因此,有以下成员字段:

名称说明举例
columns要查询的字段清单*, id,orderNo,remark, ["id","orderNo","remark"]
where条件语句{ "orderNo": { "_include_": "order001" } }
orders排序orderNo,desc, [["orderNo", "desc"], ["createdAt", "desc"]]
pageNo页码默认值:1
pageSize每页条数默认值:20

标注Query参数

以 Controller Order 的 findMany 方法为例,标注 Query 参数:

diff
+ import type { IQueryParams } from 'vona-module-a-orm';
+ import { Arg } from 'vona-module-a-web';

class ControllerOrder extends BeanBase {
  @Web.get('findMany')
  @Api.body(DtoOrderResultPage)
  async findMany(
+   @Arg.queryPro(DtoOrderQueryPage) params: IQueryParams<ModelOrder>,
  ): Promise<DtoOrderResultPage> {
    return this.scope.model.order.selectAndCount(params);
  }
}
  • @Arg.queryPro:此 Pipe 对 Query 参数进行 transform,需要传入参数DtoOrderQueryPage
  • IQueryParams: Pipe 对 Query 参数进行 transform 后的数据类型为IQueryParams,需要传入泛型参数ModelOrder,从而与model.order.selectAndCount方法的参数类型相匹配

基于DtoOrderQueryPage生成的 Swagger/Openapi 效果如下:

$Dto.queryPage

如果需要在 DTO 中添加业务字段的查询条件,可以使用$Dto.queryPage

diff
@Dto()
export class DtoOrderQueryPage
+ extends $Dto.queryPage(EntityOrder, ['orderNo', 'remark']) {}
  • $Dto.queryPage:自动从EntityOrder中提取字段orderNo/remark,然后与DtoQueryPageBase成员字段进行合并

基于DtoOrderQueryPage生成的 Swagger/Openapi 效果如下:

pageSize配置

1. App Config

pageSize 默认值为20,可以修改 App Config 配置:

src/backend/config/config/config.dev.ts

typescript
// modules
config.modules = {
  'a-orm': {
    rest: {
      query: {
        pageSize: {
          default: 50,
          max: 200,
        },
      },
    },
  },
};
名称说明
default默认值
max最大值

2. DTO配置

也可以针对具体的 DTO 提供不同的 pageSize 配置:

diff
@Dto()
export class DtoOrderQueryPage
+ extends $Class.omit($Dto.queryPage(EntityOrder, ['orderNo', 'remark']), ['pageSize']) {
+ @Api.field(z.number().min(1).max(300).default(30))
+ pageSize: number;
}
  • $Class.omit:从基类中排除字段pageSize,从而避免 Typescript 报错
  • 关于$Class的更多信息,参见:API: Dto

或者:

diff
@Dto({
+ fields: {
+   pageSize: z.number().min(1).max(300).default(30),
+ },
})
export class DtoOrderQueryPage extends $Dto.queryPage(EntityOrder, ['orderNo', 'remark']) {}
  • 关于fields的更多信息,参见:API: Dto

基于 MIT 许可发布