feat: 添加食物识别功能,支持根据图片URL识别食物并转换为饮食记录格式

This commit is contained in:
richarjiang
2025-08-31 14:14:33 +08:00
parent d0b02b6228
commit 0488fe62a1
5 changed files with 216 additions and 7 deletions

View File

@@ -15,7 +15,7 @@ import {
} from '@nestjs/common';
import { ApiOperation, ApiBody, ApiResponse, ApiTags, ApiQuery } from '@nestjs/swagger';
import { DietRecordsService } from './diet-records.service';
import { CreateDietRecordDto, UpdateDietRecordDto, GetDietHistoryQueryDto, DietRecordResponseDto, DietHistoryResponseDto, NutritionSummaryDto } from '../users/dto/diet-record.dto';
import { CreateDietRecordDto, UpdateDietRecordDto, GetDietHistoryQueryDto, DietRecordResponseDto, DietHistoryResponseDto, NutritionSummaryDto, FoodRecognitionRequestDto, FoodRecognitionResponseDto, FoodRecognitionToDietRecordsResponseDto } from '../users/dto/diet-record.dto';
import { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
import { CurrentUser } from '../common/decorators/current-user.decorator';
import { AccessTokenPayload } from '../users/services/apple-auth.service';
@@ -121,4 +121,44 @@ export class DietRecordsController {
const count = mealCount ? parseInt(mealCount) : 10;
return this.dietRecordsService.getRecentNutritionSummary(user.sub, count);
}
/**
* 根据图片URL识别食物并转换为饮食记录格式
*/
@UseGuards(JwtAuthGuard)
@Post('recognize-food-to-records')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: '根据图片URL识别食物并转换为饮食记录格式' })
@ApiBody({ type: FoodRecognitionRequestDto })
@ApiResponse({ status: 200, description: '成功识别食物并转换为饮食记录格式', type: FoodRecognitionToDietRecordsResponseDto })
async recognizeFoodToDietRecords(
@Body() requestDto: FoodRecognitionRequestDto,
@CurrentUser() user: AccessTokenPayload,
): Promise<FoodRecognitionToDietRecordsResponseDto> {
this.logger.log(`识别食物转饮食记录 - 用户ID: ${user.sub}, 图片URL: ${requestDto.imageUrl}`);
return this.dietRecordsService.recognizeFoodToDietRecords(
requestDto.imageUrl,
requestDto.mealType
);
}
/**
* 根据图片URL识别食物原始格式
*/
@UseGuards(JwtAuthGuard)
@Post('recognize-food')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: '根据图片URL识别食物' })
@ApiBody({ type: FoodRecognitionRequestDto })
@ApiResponse({ status: 200, description: '成功识别食物', type: FoodRecognitionResponseDto })
async recognizeFood(
@Body() requestDto: FoodRecognitionRequestDto,
@CurrentUser() user: AccessTokenPayload,
): Promise<FoodRecognitionResponseDto> {
this.logger.log(`识别食物 - 用户ID: ${user.sub}, 图片URL: ${requestDto.imageUrl}`);
return this.dietRecordsService.recognizeFood(
requestDto.imageUrl,
requestDto.mealType
);
}
}