Commit c4901b41 authored by nanahira's avatar nanahira

paginate

parent d70bebb5
...@@ -10,11 +10,13 @@ import { ...@@ -10,11 +10,13 @@ import {
} from 'typeorm'; } from 'typeorm';
import { import {
BlankReturnMessageDto, BlankReturnMessageDto,
PaginatedReturnMessageDto,
ReturnMessageDto, ReturnMessageDto,
} from '../dto/ReturnMessage.dto'; } from '../dto/ReturnMessage.dto';
import { QueryWise } from '../entities/interfaces/QueryWise'; import { QueryWise } from '../entities/interfaces/QueryWise';
import { camelCase } from 'typeorm/util/StringUtils'; import { camelCase } from 'typeorm/util/StringUtils';
import { DeletionWise } from '../entities/bases/TimeBase.entity'; import { DeletionWise } from '../entities/bases/TimeBase.entity';
import { PageSettingsFactory } from '../dto/PageSettings.dto';
export type EntityId<T extends { id: any }> = T['id']; export type EntityId<T extends { id: any }> = T['id'];
...@@ -22,7 +24,8 @@ export class CrudBase< ...@@ -22,7 +24,8 @@ export class CrudBase<
T extends Record<string, any> & { T extends Record<string, any> & {
id: string | number; id: string | number;
} & QueryWise<T> & } & QueryWise<T> &
DeletionWise DeletionWise &
PageSettingsFactory
> extends ConsoleLogger { > extends ConsoleLogger {
protected readonly entityName: string; protected readonly entityName: string;
constructor( constructor(
...@@ -181,7 +184,14 @@ export class CrudBase< ...@@ -181,7 +184,14 @@ export class CrudBase<
this.extraGetQuery(query); this.extraGetQuery(query);
extraQuery(query); extraQuery(query);
try { try {
return new ReturnMessageDto(200, 'success', await query.getMany()); const [ents, count] = await query.getManyAndCount();
return new PaginatedReturnMessageDto(
200,
'success',
ents,
count,
ent.getActualPageSettings(),
);
} catch (e) { } catch (e) {
const [sql, params] = query.getQueryAndParameters(); const [sql, params] = query.getQueryAndParameters();
this.error( this.error(
......
...@@ -3,7 +3,16 @@ import { SelectQueryBuilder } from 'typeorm'; ...@@ -3,7 +3,16 @@ import { SelectQueryBuilder } from 'typeorm';
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
import { NotWritable } from '../entities/decorators/transform'; import { NotWritable } from '../entities/decorators/transform';
export class PageSettingsDto { export interface PageSettingsWise {
pageCount: number;
recordsPerPage: number;
}
export interface PageSettingsFactory {
getActualPageSettings(): PageSettingsWise;
}
export class PageSettingsDto implements PageSettingsWise, PageSettingsFactory {
@NotWritable() @NotWritable()
@IsPositive() @IsPositive()
@IsInt() @IsInt()
...@@ -16,12 +25,23 @@ export class PageSettingsDto { ...@@ -16,12 +25,23 @@ export class PageSettingsDto {
@ApiProperty({ description: '每页显示的数量', required: false }) @ApiProperty({ description: '每页显示的数量', required: false })
recordsPerPage: number; recordsPerPage: number;
getActualPageSettings(): PageSettingsWise {
return {
pageCount: this.getPageCount(),
recordsPerPage: this.getRecordsPerPage(),
};
}
private getPageCount() {
return this.pageCount || 1;
}
private getRecordsPerPage() { private getRecordsPerPage() {
return this.recordsPerPage || 25; return this.recordsPerPage || 25;
} }
private getStartingFrom() { private getStartingFrom() {
return ((this.pageCount || 1) - 1) * this.getRecordsPerPage(); return (this.getPageCount() - 1) * this.getRecordsPerPage();
} }
applyQuery(qb: SelectQueryBuilder<PageSettingsDto>, entityName: string) { applyQuery(qb: SelectQueryBuilder<PageSettingsDto>, entityName: string) {
......
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
import { HttpException } from '@nestjs/common'; import { HttpException } from '@nestjs/common';
import { User } from '../entities/User.entity';
import { PageSettingsWise } from './PageSettings.dto';
export interface BlankReturnMessage { export interface BlankReturnMessage {
statusCode: number; statusCode: number;
...@@ -29,6 +31,31 @@ export class BlankReturnMessageDto implements BlankReturnMessage { ...@@ -29,6 +31,31 @@ export class BlankReturnMessageDto implements BlankReturnMessage {
} }
} }
export class BlankPaginatedReturnMessageDto
extends BlankReturnMessageDto
implements PageSettingsWise {
@ApiProperty({ description: '总数' })
total: number;
@ApiProperty({ description: '总页数' })
totalPages: number;
@ApiProperty({ description: '当前页' })
pageCount: number;
@ApiProperty({ description: '每页数量' })
recordsPerPage: number;
constructor(
statusCode: number,
message: string,
total: number,
pageSettings: PageSettingsWise,
) {
super(statusCode, message);
this.total = total;
this.pageCount = pageSettings.pageCount;
this.recordsPerPage = pageSettings.recordsPerPage;
this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);
}
}
export class ReturnMessageDto<T> export class ReturnMessageDto<T>
extends BlankReturnMessageDto extends BlankReturnMessageDto
implements ReturnMessage<T> { implements ReturnMessage<T> {
...@@ -40,6 +67,23 @@ export class ReturnMessageDto<T> ...@@ -40,6 +67,23 @@ export class ReturnMessageDto<T>
} }
} }
export class PaginatedReturnMessageDto<T>
extends BlankPaginatedReturnMessageDto
implements PageSettingsWise {
@ApiProperty({ description: '返回内容' })
data: T[];
constructor(
statusCode: number,
message: string,
data: T[],
total: number,
pageSettings: PageSettingsWise,
) {
super(statusCode, message, total, pageSettings);
this.data = data;
}
}
export class StringReturnMessageDto export class StringReturnMessageDto
extends BlankReturnMessageDto extends BlankReturnMessageDto
implements ReturnMessage<string> { implements ReturnMessage<string> {
......
...@@ -18,6 +18,10 @@ export class ClassGetPipe<T> extends ValidationPipe { ...@@ -18,6 +18,10 @@ export class ClassGetPipe<T> extends ValidationPipe {
constructor(private readonly classConstructor: ClassConstructor<T>) { constructor(private readonly classConstructor: ClassConstructor<T>) {
super({ super({
transform: false, transform: false,
transformOptions: {
groups: ['r'],
enableImplicitConversion: true,
},
skipMissingProperties: true, skipMissingProperties: true,
skipNullProperties: true, skipNullProperties: true,
skipUndefinedProperties: true, skipUndefinedProperties: true,
...@@ -28,7 +32,7 @@ export class ClassGetPipe<T> extends ValidationPipe { ...@@ -28,7 +32,7 @@ export class ClassGetPipe<T> extends ValidationPipe {
const obj = await super.transform(value, metadata); const obj = await super.transform(value, metadata);
return plainToClass(this.classConstructor, obj, { return plainToClass(this.classConstructor, obj, {
groups: ['r'], groups: ['r'],
enableImplicitConversion: true, enableImplicitConversion: false,
}); });
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment