feat: 支持用户自定义食物

This commit is contained in:
richarjiang
2025-08-29 15:57:28 +08:00
parent c0bdb3bf0a
commit 6542988cb6
9 changed files with 748 additions and 50 deletions

View File

@@ -0,0 +1,130 @@
# 用户自定义食物功能实现总结
## 实现概述
已成功实现用户添加自定义食物的功能包括数据库表设计、后端API接口和完整的业务逻辑。用户可以创建、查看、搜索和删除自己的自定义食物这些食物会与系统食物一起显示在食物库中。
## 实现的功能
### 1. 数据库层面
- ✅ 创建了 `t_user_custom_foods`
- ✅ 包含与系统食物库相同的营养字段
- ✅ 通过 `user_id` 字段关联用户
- ✅ 通过外键约束确保分类的有效性
### 2. 模型层面
- ✅ 创建了 `UserCustomFood` Sequelize模型
- ✅ 定义了完整的字段映射和关联关系
- ✅ 更新了食物库模块以包含新模型
### 3. 服务层面
- ✅ 扩展了 `FoodLibraryService` 以支持用户自定义食物
- ✅ 实现了创建自定义食物的方法
- ✅ 实现了删除自定义食物的方法
- ✅ 更新了获取食物库列表的方法,合并系统食物和用户自定义食物
- ✅ 更新了搜索食物的方法,包含用户自定义食物
- ✅ 更新了获取食物详情的方法,支持系统食物和自定义食物
### 4. 控制器层面
- ✅ 添加了创建自定义食物的 POST 接口
- ✅ 添加了删除自定义食物的 DELETE 接口
- ✅ 更新了现有接口以支持用户认证和自定义食物
- ✅ 添加了完整的 Swagger 文档注解
### 5. DTO层面
- ✅ 创建了 `CreateCustomFoodDto` 用于创建自定义食物
- ✅ 添加了完整的验证规则
- ✅ 扩展了 `FoodItemDto` 以标识是否为自定义食物
## 核心特性
### 权限控制
- 所有接口都需要用户认证
- 用户只能看到和操作自己的自定义食物
- 系统食物对所有用户可见
### 数据隔离
- 用户自定义食物通过 `user_id` 字段实现数据隔离
- 搜索和列表查询都会自动过滤用户权限
### 智能合并
- 获取食物库列表时,自动合并系统食物和用户自定义食物
- 常见分类只显示系统食物,其他分类显示合并后的食物
- 搜索结果中用户自定义食物优先显示
### 数据验证
- 食物名称和分类键为必填项
- 营养成分有合理的数值范围限制
- 分类键必须是有效的系统分类
## API接口
### 获取食物库列表
```
GET /food-library
Authorization: Bearer <token>
```
### 搜索食物
```
GET /food-library/search?keyword=关键词
Authorization: Bearer <token>
```
### 创建自定义食物
```
POST /food-library/custom
Authorization: Bearer <token>
Content-Type: application/json
```
### 删除自定义食物
```
DELETE /food-library/custom/{id}
Authorization: Bearer <token>
```
### 获取食物详情
```
GET /food-library/{id}
Authorization: Bearer <token>
```
## 文件清单
### 新增文件
- `sql-scripts/user-custom-foods-table.sql` - 数据库表创建脚本
- `src/food-library/models/user-custom-food.model.ts` - 用户自定义食物模型
- `src/food-library/USER_CUSTOM_FOODS.md` - 功能说明文档
- `test-custom-foods.sh` - 功能测试脚本
### 修改文件
- `src/food-library/food-library.module.ts` - 添加新模型到模块
- `src/food-library/food-library.service.ts` - 扩展服务以支持自定义食物
- `src/food-library/food-library.controller.ts` - 添加新接口和更新现有接口
- `src/food-library/dto/food-library.dto.ts` - 添加新DTO和扩展现有DTO
## 使用说明
1. **运行数据库脚本**:执行 `sql-scripts/user-custom-foods-table.sql` 创建用户自定义食物表
2. **重启应用**重启NestJS应用以加载新的模型和接口
3. **测试功能**:使用 `test-custom-foods.sh` 脚本测试各个接口(需要先获取有效的访问令牌)
4. **前端集成**前端可以通过新的API接口实现用户自定义食物的增删查功能
## 注意事项
- 所有接口都需要用户认证,确保在请求头中包含有效的 Bearer token
- 创建自定义食物时,分类键必须是系统中已存在的分类
- 用户只能删除自己创建的自定义食物
- 营养成分字段都是可选的,但建议提供准确的营养信息
## 扩展建议
1. **图片上传**:可以添加图片上传功能,让用户为自定义食物添加图片
2. **营养计算**:可以添加营养成分的自动计算功能
3. **食物分享**:可以考虑添加用户间分享自定义食物的功能
4. **批量导入**:可以添加批量导入自定义食物的功能
5. **食物模板**:可以提供常见食物的营养模板,方便用户快速创建