diff --git a/src/training-plans/dto/training-plan.dto.ts b/src/training-plans/dto/training-plan.dto.ts index 65ef852..8c0f2be 100644 --- a/src/training-plans/dto/training-plan.dto.ts +++ b/src/training-plans/dto/training-plan.dto.ts @@ -7,6 +7,11 @@ export class CreateTrainingPlanDto { @IsDateString() startDate: string; + @ApiProperty({ description: '计划名称' }) + @IsString() + @IsOptional() + name: string; + @ApiProperty({ enum: ['daysOfWeek', 'sessionsPerWeek'] }) @IsEnum(['daysOfWeek', 'sessionsPerWeek']) mode: PlanMode; diff --git a/src/training-plans/models/training-plan.model.ts b/src/training-plans/models/training-plan.model.ts index a42b838..f20bc97 100644 --- a/src/training-plans/models/training-plan.model.ts +++ b/src/training-plans/models/training-plan.model.ts @@ -15,6 +15,10 @@ export class TrainingPlan extends Model { @Column({ type: DataType.STRING, allowNull: false }) declare userId: string; + // 计划名称 + @Column({ type: DataType.STRING, allowNull: true }) + declare name: string; + @Column({ type: DataType.DATE, allowNull: false }) declare createdAt: Date; @@ -44,6 +48,9 @@ export class TrainingPlan extends Model { @Column({ type: DataType.DATE, defaultValue: DataType.NOW }) declare updatedAt: Date; + + @Column({ type: DataType.BOOLEAN, defaultValue: false }) + declare deleted: boolean; } diff --git a/src/training-plans/training-plans.controller.ts b/src/training-plans/training-plans.controller.ts index f5648d0..c3f0216 100644 --- a/src/training-plans/training-plans.controller.ts +++ b/src/training-plans/training-plans.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, UseGuards } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; import { ApiBody, ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger'; import { TrainingPlansService } from './training-plans.service'; import { CreateTrainingPlanDto } from './dto/training-plan.dto'; @@ -28,8 +28,12 @@ export class TrainingPlansController { @Get() @ApiOperation({ summary: '训练计划列表' }) - async list(@CurrentUser() user: AccessTokenPayload) { - return this.service.list(user.sub); + async list( + @CurrentUser() user: AccessTokenPayload, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10, + ) { + return this.service.list(user.sub, page, limit); } @Get(':id') diff --git a/src/training-plans/training-plans.service.ts b/src/training-plans/training-plans.service.ts index 619eedc..e65d7fb 100644 --- a/src/training-plans/training-plans.service.ts +++ b/src/training-plans/training-plans.service.ts @@ -19,6 +19,7 @@ export class TrainingPlansService { const plan = await this.trainingPlanModel.create({ id, userId, + name: dto.name ?? '', createdAt, startDate: new Date(dto.startDate), mode: dto.mode, @@ -39,7 +40,10 @@ export class TrainingPlansService { } async remove(userId: string, id: string) { - const count = await this.trainingPlanModel.destroy({ where: { id, userId } }); + const [count] = await this.trainingPlanModel.update( + { deleted: true }, + { where: { id, userId, deleted: false } } + ); if (count > 0) { await this.activityLogsService.record({ userId, @@ -52,14 +56,26 @@ export class TrainingPlansService { return { success: count > 0 }; } - async list(userId: string) { - const rows = await this.trainingPlanModel.findAll({ where: { userId }, order: [['created_at', 'DESC']] }); - return rows.map(r => ({ - id: r.id, - createdAt: r.createdAt, - startDate: r.startDate, - goal: r.goal, - })); + async list(userId: string, page: number = 1, limit: number = 10) { + const offset = (page - 1) * limit; + const { rows, count } = await this.trainingPlanModel.findAndCountAll({ + where: { userId, deleted: false }, + order: [['created_at', 'DESC']], + limit, + offset, + }); + + return { + data: rows.map(r => ({ + id: r.id, + createdAt: r.createdAt, + startDate: r.startDate, + goal: r.goal, + })), + total: count, + page, + limit, + }; } async detail(userId: string, id: string) {