feat: 新增食物识别API,调整字段名,扩展识别功能与提示逻辑

This commit is contained in:
richarjiang
2025-09-04 09:36:07 +08:00
parent 02f21f0858
commit d34f752776
5 changed files with 253 additions and 27 deletions

View File

@@ -0,0 +1,135 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsArray, IsBoolean, IsNotEmpty, IsOptional, IsString, IsInt, Min, Max } from 'class-validator';
/**
* 食物营养数据DTO
*/
export class FoodNutritionDataDto {
@ApiProperty({ description: '蛋白质含量(克)', required: false })
@IsOptional()
@IsInt()
@Min(0)
proteinGrams?: number;
@ApiProperty({ description: '碳水化合物含量(克)', required: false })
@IsOptional()
@IsInt()
@Min(0)
carbohydrateGrams?: number;
@ApiProperty({ description: '脂肪含量(克)', required: false })
@IsOptional()
@IsInt()
@Min(0)
fatGrams?: number;
@ApiProperty({ description: '膳食纤维含量(克)', required: false })
@IsOptional()
@IsInt()
@Min(0)
fiberGrams?: number;
}
/**
* 食物确认选项DTO
*/
export class FoodConfirmationOptionDto {
@ApiProperty({ description: '食物选项唯一标识符' })
@IsString()
@IsNotEmpty()
id: string;
@ApiProperty({ description: '显示给用户的完整选项文本' })
@IsString()
@IsNotEmpty()
label: string;
@ApiProperty({ description: '食物名称' })
@IsString()
@IsNotEmpty()
foodName: string;
@ApiProperty({ description: '份量描述' })
@IsString()
@IsNotEmpty()
portion: string;
@ApiProperty({ description: '估算热量' })
@IsInt()
@Min(0)
@Max(5000)
calories: number;
@ApiProperty({ description: '餐次类型' })
@IsString()
@IsNotEmpty()
mealType: string;
@ApiProperty({ description: '营养数据', type: FoodNutritionDataDto })
nutritionData: FoodNutritionDataDto;
}
/**
* 食物识别请求DTO
*/
export class FoodRecognitionRequestDto {
@ApiProperty({ description: '图片URL数组' })
@IsArray()
@IsString({ each: true })
@IsNotEmpty({ each: true })
imageUrls: string[];
}
/**
* 食物识别响应DTO - 总是返回数组结构
*/
export class FoodRecognitionResponseDto {
@ApiProperty({
description: '识别到的食物列表,即使只有一种食物也返回数组格式',
type: [FoodConfirmationOptionDto]
})
@IsArray()
items: FoodConfirmationOptionDto[];
@ApiProperty({ description: '识别说明文字' })
@IsString()
analysisText: string;
@ApiProperty({
description: '识别置信度',
minimum: 0,
maximum: 100
})
@IsInt()
@Min(0)
@Max(100)
confidence: number;
@ApiProperty({
description: '是否识别到食物',
default: true
})
@IsBoolean()
isFoodDetected: boolean;
@ApiProperty({
description: '非食物提示信息当isFoodDetected为false时显示',
required: false
})
@IsOptional()
@IsString()
nonFoodMessage?: string;
}
/**
* 食物确认请求DTO
*/
export class FoodConfirmationRequestDto {
@ApiProperty({ description: '用户选择的食物选项' })
selectedOption: FoodConfirmationOptionDto;
@ApiProperty({ description: '图片URL', required: false })
@IsOptional()
@IsString()
imageUrl?: string;
}