2161 lines
52 KiB
Markdown
2161 lines
52 KiB
Markdown
# 菜谱 API 接口文档
|
||
|
||
> **版本**: v2.0.0
|
||
> **更新日期**: 2026-04-10
|
||
> **基础地址**: `http://eat.wktyl.com/api/`
|
||
|
||
---
|
||
|
||
|
||
---
|
||
|
||
## 📁 接口文件说明
|
||
|
||
| 文件 | 说明 | 主要功能 |
|
||
|------|------|---------|
|
||
| `api.php` | 主接口 | 列表、详情、搜索、统计、统一输出 |
|
||
| `api_action.php` | 动态接口 | 点赞、推荐、浏览量 |
|
||
| `api_what_to_eat.php` | 智能选择 | 随机推荐、动态筛选 |
|
||
| `api_feed.php` | 信息流 | 推荐、热门、个性化 |
|
||
| `stats_full.php` | 全面统计 | 热门、在线、请求统计 |
|
||
| `api_preference.php` | 用户偏好 | 标签、分类、过敏原设置 |
|
||
| `api_check_duplicate.php` | 查重接口 | 菜品、食材、营养成分、内容查重 |
|
||
| `cache.php` | 缓存系统 | 工具类 |
|
||
| `cache_manage.php` | 缓存管理 | 运维工具 |
|
||
| `response.php` | 响应格式 | 工具类 |
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [快速开始](#快速开始)
|
||
- [响应格式](#响应格式)
|
||
- [主接口 api.php](#主接口-apiphp)
|
||
- [动态接口 api_action.php](#动态接口-api_actionphp)
|
||
- [智能选择 api_what_to_eat.php](#智能选择-api_what_to_eatphp)
|
||
- [信息流 api_feed.php](#信息流-api_feedphp)
|
||
- [全面统计 stats_full.php](#全面统计-stats_fullphp)
|
||
- [用户偏好 api_preference.php](#用户偏好-api_preferencephp)
|
||
- [查重接口 api_check_duplicate.php](#查重接口-api_check_duplicatephp)
|
||
- [功能扩展指南](#功能扩展指南)
|
||
- [错误处理](#错误处理)
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 请求方式
|
||
|
||
支持 `GET` 和 `POST` 两种方式:
|
||
|
||
```
|
||
GET api.php?act=list&page=1
|
||
|
||
POST api.php
|
||
Content-Type: application/json
|
||
{"act": "list", "page": 1}
|
||
```
|
||
|
||
---
|
||
|
||
## 响应格式
|
||
|
||
### 支持格式
|
||
|
||
| 格式 | 参数 | 大小节省 | 推荐场景 |
|
||
|------|------|---------|---------|
|
||
| JSON | `_format=json` | 基准 | 调试开发 |
|
||
| Gzip | `_format=gzip` | 75%+ | 移动网络 |
|
||
| MessagePack | `_format=msgpack` | 35% | 高速网络 |
|
||
|
||
### 响应结构
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": { ... },
|
||
"_cached": false,
|
||
"_query_time": "15.23ms"
|
||
}
|
||
```
|
||
|
||
### 缓存控制
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| `_refresh=1` | 强制刷新缓存 |
|
||
| `_stale=1` | 允许返回过期缓存 |
|
||
| `_pretty=1` | 格式化JSON输出 |
|
||
|
||
---
|
||
|
||
## 主接口 api.php
|
||
|
||
### 📋 菜谱列表
|
||
|
||
```
|
||
GET api.php?act=list&page=1&limit=20&cate_id=11&search=鸡蛋
|
||
```
|
||
|
||
**功能**: 获取菜谱列表,支持分页、分类筛选、标签筛选、关键词搜索
|
||
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| page | int | 页码,默认1 |
|
||
| limit | int | 每页数量,默认20,最大100 |
|
||
| cate_id | int | 分类ID筛选 |
|
||
| tag_id | int | 标签ID筛选 |
|
||
| search | string | 搜索关键词 |
|
||
| use_preference | string | 设为"true"时应用用户偏好 |
|
||
| user_id | string | 用户ID(配合use_preference使用) |
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `id` | 菜谱唯一ID | 用于详情查询、收藏、分享链接 |
|
||
| `title` | 菜谱标题 | 用于搜索、列表展示、分享标题 |
|
||
| `intro` | 菜谱简介 | 用于列表预览、搜索结果摘要 |
|
||
| `category_id` | 分类ID | 用于分类筛选、面包屑导航 |
|
||
| `category_name` | 分类名称 | 用于分类展示、筛选标签 |
|
||
| `tags` | 标签数组 | 用于标签云、相关推荐、口味筛选 |
|
||
| `view_count` | 浏览量 | 用于热门排序、趋势分析 |
|
||
| `comment_count` | 评论数 | 用于互动排序、热门判断 |
|
||
| `cover` | 封面图 | 用于列表展示、分享缩略图 |
|
||
| `create_time` | 创建时间 | 用于最新排序、时间线展示 |
|
||
|
||
---
|
||
|
||
### 📄 菜谱详情
|
||
|
||
```
|
||
GET api.php?act=detail&id=32892&viewnums=true
|
||
```
|
||
|
||
**功能**: 获取单个菜谱的基本信息
|
||
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | int | 菜谱ID(必填) |
|
||
| viewnums | string | 设为"true"时增加浏览量 |
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `content` | 菜谱内容(HTML) | 用于详情页展示、步骤解析 |
|
||
| `ingredients` | 食材列表 | 用于购物清单、营养计算 |
|
||
| `meta` | 扩展属性 | 用于特殊功能(烹饪时间、难度等) |
|
||
| `author` | 作者信息 | 用于作者主页、贡献者展示 |
|
||
|
||
---
|
||
|
||
### 📖 菜谱完整信息
|
||
|
||
```
|
||
GET api.php?act=full&id=32892
|
||
```
|
||
|
||
**功能**: 获取菜谱的完整信息,包括所有关联数据
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `code` | 菜谱编码(如CP032892) | 用于唯一标识、二维码生成、分享码 |
|
||
| `pic_id` | 原始图片ID| 用于新旧系统图片资源关联、图片迁移 |
|
||
| `category.hierarchy` | 分类层级(最多3级) | 用于面包屑导航、分类树展示 |
|
||
| `ingredients.main` | 主料列表 | 用于购物清单、主料筛选 |
|
||
| `ingredients.auxiliary` | 辅料列表 | 用于购物清单、辅料筛选 |
|
||
| `ingredients.seasoning` | 调料列表 | 用于购物清单、调料筛选 |
|
||
| `ingredients[].detail.allergen` | 食材过敏原 | 用于过敏提醒、健康警示 |
|
||
| `ingredients[].detail.nutrition` | 食材营养信息 | 用于营养计算、健康分析 |
|
||
| `ingredients[].detail.usage_tip` | 使用技巧 | 用于烹饪提示、新手指导 |
|
||
| `allergens` | 过敏原汇总 | 用于过敏原警示、用户过滤 |
|
||
| `nutrition` | 营养数据数组 | 用于营养分析、健康报告 |
|
||
| `statistics.view_count` | 浏览量 | 用于热门排序、趋势分析 |
|
||
| `statistics.like_count` | 点赞数 | 用于推荐排序、用户喜好分析 |
|
||
| `statistics.recommend_count` | 推荐数 | 用于推荐排序、质量评估 |
|
||
| `meta.process` | 烹饪工艺 | 用于工艺筛选(炒、蒸、煮等) |
|
||
| `meta.taste` | 口味特征 | 用于口味筛选(酸甜苦辣咸) |
|
||
| `meta.difficulty` | 难度等级 | 用于难度筛选、新手推荐 |
|
||
| `meta.time` | 烹饪时间 | 用于时间筛选、快速菜谱 |
|
||
|
||
---
|
||
|
||
### 🥗 食材列表
|
||
|
||
```
|
||
GET api.php?act=ingredients&page=1&search=鸡蛋
|
||
```
|
||
|
||
**功能**: 获取食材列表
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `ingredient_id` | 食材ID | 用于详情查询、关联菜谱 |
|
||
| `name` | 食材名称 | 用于搜索、分类展示 |
|
||
| `allergen` | 过敏原标识 | 用于过敏提醒、健康过滤 |
|
||
| `allergen_type` | 过敏原类型 | 用于过敏原分类、用户设置 |
|
||
|
||
---
|
||
|
||
### 🥕 食材详情
|
||
|
||
```
|
||
GET api.php?act=ingredient_detail&id=1
|
||
```
|
||
|
||
**功能**: 获取单个食材的详细信息
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `introduction` | 食材介绍 | 用于食材详情页、知识科普 |
|
||
| `nutrition` | 营养成分 | 用于营养分析、健康报告 |
|
||
| `usage_tip` | 使用技巧 | 用于烹饪提示、新手指导 |
|
||
| `effect` | 食疗功效 | 用于养生推荐、健康指导 |
|
||
| `guidance` | 选购指南 | 用于购物指导、品质判断 |
|
||
|
||
---
|
||
|
||
### 🔍 搜索
|
||
|
||
```
|
||
GET api.php?act=search&keyword=鸡蛋&type=recipe
|
||
```
|
||
|
||
**功能**: 全局搜索,支持食谱和食材
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| keyword | 搜索关键词 |
|
||
| type | 搜索类型:all/recipe/ingredient |
|
||
|
||
**功能扩展**:
|
||
- 支持模糊搜索,可用于智能搜索建议
|
||
- 搜索结果可按相关度、时间、热度排序
|
||
- 可用于搜索历史记录、热门搜索
|
||
|
||
---
|
||
|
||
### 📂 分类列表
|
||
|
||
```
|
||
GET api.php?act=categories&type=recipe
|
||
```
|
||
|
||
**功能**: 获取分类列表
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `cate_ID` | 分类ID | 用于分类筛选 |
|
||
| `cate_Name` | 分类名称 | 用于分类展示 |
|
||
| `cate_ParentID` | 父分类ID | 用于分类树构建 |
|
||
| `cate_Count` | 分类下数量 | 用于热门分类排序 |
|
||
|
||
---
|
||
|
||
### 🏷️ 标签列表
|
||
|
||
```
|
||
GET api.php?act=tags&limit=50
|
||
```
|
||
|
||
**功能**: 获取标签列表
|
||
|
||
**功能扩展**:
|
||
- 可用于标签云展示
|
||
- 可用于口味筛选(酸甜苦辣咸)
|
||
- 可用于标签热度排行
|
||
|
||
---
|
||
|
||
### 📊 基础统计
|
||
|
||
```
|
||
GET api.php?act=stats
|
||
```
|
||
|
||
**功能**: 获取基础统计数据
|
||
|
||
**功能扩展**:
|
||
- 可用于首页数据展示
|
||
- 可用于运营分析报表
|
||
- 可用于数据大屏展示
|
||
|
||
---
|
||
|
||
### 🔎 高级查询
|
||
|
||
```
|
||
GET api.php?act=query&module=recipe&field=log_Title&value=鸡蛋&operator=like
|
||
```
|
||
|
||
**功能**: 高级数据库查询
|
||
|
||
| 操作符 | 说明 |
|
||
|--------|------|
|
||
| eq | 等于 |
|
||
| neq | 不等于 |
|
||
| like | 模糊匹配 |
|
||
| gt | 大于 |
|
||
| lt | 小于 |
|
||
| gte | 大于等于 |
|
||
| lte | 小于等于 |
|
||
|
||
**功能扩展**:
|
||
- 可用于自定义筛选条件
|
||
- 可用于数据分析导出
|
||
- 可用于后台管理查询
|
||
|
||
---
|
||
|
||
### 📦 统一格式输出(原 api_unified.php)
|
||
|
||
提供食谱和食材的一致性输出格式,方便App统一处理。
|
||
|
||
#### 统一列表
|
||
|
||
```
|
||
GET api.php?act=unified_list&type=recipe&page=1
|
||
GET api.php?act=unified_list&type=ingredient&page=1
|
||
```
|
||
|
||
**功能**: 获取统一格式的列表数据
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| type | 类型:recipe(食谱)/ ingredient(食材) |
|
||
| page | 页码 |
|
||
| limit | 每页数量 |
|
||
| cate_id | 分类筛选 |
|
||
| search | 搜索关键词 |
|
||
|
||
#### 统一详情
|
||
|
||
```
|
||
GET api.php?act=unified_detail&type=recipe&id=1
|
||
GET api.php?act=unified_detail&type=ingredient&id=1
|
||
```
|
||
|
||
**功能**: 获取统一格式的详情数据
|
||
|
||
#### 统一搜索
|
||
|
||
```
|
||
GET api.php?act=unified_search&type=recipe&keyword=鸡蛋
|
||
```
|
||
|
||
**功能**: 统一格式的搜索
|
||
|
||
#### 统一热门
|
||
|
||
```
|
||
GET api.php?act=unified_hot&type=recipe&limit=20
|
||
```
|
||
|
||
**功能**: 获取热门列表
|
||
|
||
#### 统一字段结构
|
||
|
||
```json
|
||
{
|
||
"id": 123,
|
||
"type": "recipe",
|
||
"type_name": "食谱",
|
||
"title": "菜谱名称",
|
||
"intro": "简介...",
|
||
"category": {"id": 11, "name": "家常菜"},
|
||
"statistics": {
|
||
"view_count": 1000,
|
||
"like_count": 50,
|
||
"recommend_count": 30
|
||
},
|
||
"publish_time": 1712500000,
|
||
"url": "?act=unified_detail&type=recipe&id=123"
|
||
}
|
||
```
|
||
|
||
**统一格式优势**:
|
||
- 🔄 食谱和食材使用相同结构,减少App端代码量
|
||
- 📱 适合移动端列表展示,字段精简
|
||
- 🔗 统一的URL格式,方便跳转
|
||
- 📊 统一的统计字段,方便排序和展示
|
||
|
||
---
|
||
|
||
## 动态接口 api_action.php
|
||
|
||
### 👍 点赞
|
||
|
||
```
|
||
GET api_action.php?act=like&type=recipe&id=1&action=like
|
||
```
|
||
|
||
**功能**: 点赞/取消点赞
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| type | 类型:recipe/ingredient |
|
||
| id | ID |
|
||
| action | 操作:like/unlike |
|
||
|
||
**功能扩展**:
|
||
- 可用于用户收藏功能
|
||
- 可用于点赞动画效果
|
||
- 可用于社交分享展示点赞数
|
||
|
||
---
|
||
|
||
### ⭐ 推荐
|
||
|
||
```
|
||
GET api_action.php?act=recommend&type=recipe&id=1&action=recommend&score=5
|
||
```
|
||
|
||
**功能**: 推荐/取消推荐
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| score | 推荐分数,范围0-5 |
|
||
|
||
**功能扩展**:
|
||
- 可用于五星评分系统
|
||
- 可用于推荐算法权重
|
||
- 可用于用户评价展示
|
||
|
||
---
|
||
|
||
### 👁️ 增加浏览量
|
||
|
||
```
|
||
GET api_action.php?act=view&type=recipe&id=1&count=1
|
||
```
|
||
|
||
**功能**: 增加浏览量
|
||
|
||
**功能扩展**:
|
||
- 可用于热门排行统计
|
||
- 可用于用户浏览历史
|
||
- 可用于趋势分析
|
||
|
||
---
|
||
|
||
## 智能选择 api_what_to_eat.php
|
||
|
||
### 🪜 获取筛选步骤
|
||
|
||
```
|
||
GET api_what_to_eat.php?act=filter_steps&category=13
|
||
```
|
||
|
||
**功能**: 获取当前可用的筛选选项和菜谱数量,实现逐步筛选
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `steps[].name` | 步骤名称 | 用于筛选流程展示 |
|
||
| `steps[].options` | 可选项列表 | 用于筛选选项展示 |
|
||
| `steps[].matched_count` | 匹配数量 | 用于实时显示筛选结果数 |
|
||
|
||
**功能扩展**:
|
||
- 可用于"今天吃什么"决策流程
|
||
- 可用于智能推荐引导
|
||
- 可用于用户偏好学习
|
||
|
||
---
|
||
|
||
### ✅ 应用筛选
|
||
|
||
```
|
||
GET api_what_to_eat.php?act=filter_apply&category=13&tag=2&count=5
|
||
```
|
||
|
||
**功能**: 应用筛选条件,返回随机菜谱
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| category | 分类ID,多个用逗号分隔 |
|
||
| tag | 标签ID,多个用逗号分隔 |
|
||
| count | 返回数量,默认5,最大20 |
|
||
|
||
**功能扩展**:
|
||
- 可用于随机推荐功能
|
||
- 可用于"换一批"功能
|
||
- 可用于A/B测试推荐
|
||
|
||
---
|
||
|
||
### 📄 菜谱详情
|
||
|
||
```
|
||
GET api_what_to_eat.php?act=detail&id=32892
|
||
GET api_what_to_eat.php?act=detail&code=CP032892
|
||
GET api_what_to_eat.php?act=detail&title=鸡丁&fuzzy=1
|
||
```
|
||
|
||
**功能**: 多种方式查询菜谱详情
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| id | 菜谱ID |
|
||
| code | 菜谱编码(如CP032892) |
|
||
| title | 菜谱标题 |
|
||
| fuzzy | 是否模糊匹配,1=是 |
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `id` | 菜谱唯一ID | 用于详情查询、收藏、分享链接 |
|
||
| `code` | 菜谱编码(如CP032892) | 用于二维码分享、唯一标识 |
|
||
| `pic_id` | 原始图片ID(来自zbp_recipe_id_map表) | 用于新旧系统图片资源关联、图片迁移 |
|
||
| `title` | 菜谱标题 | 用于搜索、列表展示、分享标题 |
|
||
|
||
**功能扩展**:
|
||
- `code` 可用于二维码分享、唯一标识
|
||
- `title+fuzzy` 可用于智能搜索、语音搜索
|
||
- `pic_id` 可用于关联旧系统图片资源
|
||
|
||
---
|
||
|
||
### 🎲 随机推荐
|
||
|
||
```
|
||
GET api_what_to_eat.php?act=random
|
||
```
|
||
|
||
**功能**: 随机推荐一个菜谱
|
||
|
||
**功能扩展**:
|
||
- 可用于"摇一摇"推荐
|
||
- 可用于每日推荐
|
||
- 可用于发现功能
|
||
|
||
---
|
||
|
||
### 🧠 智能推荐
|
||
|
||
```
|
||
GET api_what_to_eat.php?act=smart&include_categories=12,13&exclude_allergens=seafood
|
||
```
|
||
|
||
**功能**: 基于条件智能推荐
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| include_categories | 包含的分类ID |
|
||
| exclude_allergens | 排除的过敏原类型 |
|
||
|
||
**功能扩展**:
|
||
- 可用于个性化推荐
|
||
- 可用于过敏原过滤
|
||
- 可用于用户偏好推荐
|
||
|
||
---
|
||
|
||
## 信息流 api_feed.php
|
||
|
||
### 🔥 推荐信息流
|
||
|
||
```
|
||
GET api_feed.php?act=recommend&page=1&limit=20
|
||
```
|
||
|
||
**功能**: 混合推荐算法:热门40% + 最新40% + 随机20%
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `id` | 菜谱唯一ID | 用于详情查询、收藏、分享链接 |
|
||
| `pic_id` | 原始图片ID| 用于新旧系统图片资源关联、图片迁移 |
|
||
| `title` | 菜谱标题 | 用于搜索、列表展示、分享标题 |
|
||
| `intro` | 菜谱简介 | 用于列表预览、搜索结果摘要 |
|
||
|
||
**功能扩展**:
|
||
- 可用于首页信息流
|
||
- 可用于下拉刷新加载
|
||
- 可用于无限滚动加载
|
||
- `pic_id` 可用于关联旧系统图片资源
|
||
|
||
---
|
||
|
||
### 📈 热门信息流
|
||
|
||
```
|
||
GET api_feed.php?act=hot&page=1&limit=20
|
||
```
|
||
|
||
**功能**: 按浏览量排序
|
||
|
||
**功能扩展**:
|
||
- 可用于热门榜单
|
||
- 可用于趋势分析
|
||
- 可用于爆款推荐
|
||
|
||
---
|
||
|
||
### 🆕 最新信息流
|
||
|
||
```
|
||
GET api_feed.php?act=latest&page=1&limit=20
|
||
```
|
||
|
||
**功能**: 按发布时间排序
|
||
|
||
**功能扩展**:
|
||
- 可用于最新发布
|
||
- 可用于时间线展示
|
||
- 可用于更新提醒
|
||
|
||
---
|
||
|
||
### 👤 个性化信息流
|
||
|
||
```
|
||
GET api_feed.php?act=personal&user_id=xxx
|
||
```
|
||
|
||
**功能**: 基于用户偏好推荐,自动应用偏好分类、偏好标签、屏蔽过敏原
|
||
|
||
**功能扩展**:
|
||
- 可用于个性化首页
|
||
- 可用于用户画像推荐
|
||
- 可用于千人千面
|
||
|
||
---
|
||
|
||
### ⚡ 预加载
|
||
|
||
```
|
||
GET api_feed.php?act=prefetch&pages=3&limit=20
|
||
```
|
||
|
||
**功能**: 一次性加载多页数据
|
||
|
||
**功能扩展**:
|
||
- 可用于离线缓存
|
||
- 可用于预加载优化
|
||
- 可用于减少请求次数
|
||
|
||
---
|
||
|
||
## 全面统计 stats_full.php
|
||
|
||
### 📊 全面统计
|
||
|
||
```
|
||
GET stats_full.php?act=stats&layer=basic
|
||
```
|
||
|
||
**功能**: 获取全面统计数据
|
||
|
||
| 层级 | 说明 |
|
||
|------|------|
|
||
| basic | 基础统计 |
|
||
| detail | 详细统计 |
|
||
| full | 完整统计 |
|
||
|
||
**功能扩展**:
|
||
- 可用于数据大屏
|
||
- 可用于运营报表
|
||
- 可用于后台管理
|
||
|
||
---
|
||
|
||
### 🔥 热门统计
|
||
|
||
```
|
||
GET stats_full.php?act=hot&period=today
|
||
GET stats_full.php?act=hot&period=month
|
||
GET stats_full.php?act=hot&period=total
|
||
```
|
||
|
||
**功能**: 获取热门排行榜
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| period | 时间范围:today/month/total |
|
||
| limit | 返回数量,默认20 |
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `recipe_view` | 浏览量排行 | 用于热门榜单、趋势分析 |
|
||
| `recipe_like` | 点赞量排行 | 用于用户喜好分析、推荐权重 |
|
||
| `ingredient_view` | 食材浏览排行 | 用于热门食材、采购建议 |
|
||
|
||
---
|
||
|
||
### 👥 在线统计(原 api_online.php)
|
||
|
||
```
|
||
GET stats_full.php?act=online
|
||
```
|
||
|
||
**功能**: 获取在线用户统计
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `online_total` | 在线总人数 | 用于实时在线展示 |
|
||
| `online_10min` | 10分钟内活跃 | 用于活跃度分析 |
|
||
| `online_1hour` | 1小时内活跃 | 用于用户粘性分析 |
|
||
| `platforms` | 平台分布 | 用于多平台分析 |
|
||
| `pages` | 页面分布 | 用于热门页面分析 |
|
||
|
||
---
|
||
|
||
### 💓 心跳更新
|
||
|
||
```
|
||
GET stats_full.php?act=heartbeat&platform=ios&page=home
|
||
```
|
||
|
||
**功能**: 更新用户在线状态
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| platform | 平台:web/ios/android/wechat/miniprogram |
|
||
| page | 当前页面 |
|
||
| data_type | 数据类型 |
|
||
| data_id | 数据ID |
|
||
|
||
**功能扩展**:
|
||
- 可用于实时在线展示
|
||
- 可用于用户行为追踪
|
||
- 可用于页面热度分析
|
||
|
||
---
|
||
|
||
### 📈 请求统计(原 api_request_stats.php)
|
||
|
||
```
|
||
GET stats_full.php?act=request
|
||
```
|
||
|
||
**功能**: 获取API请求统计
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `total` | 总请求数 | 用于服务监控 |
|
||
| `today` | 今日请求数 | 用于日活分析 |
|
||
| `last_hour` | 最近1小时请求 | 用于实时监控 |
|
||
| `avg_daily` | 日均请求数 | 用于容量规划 |
|
||
| `apis` | 各接口调用统计 | 用于接口优化 |
|
||
|
||
---
|
||
|
||
## 用户偏好 api_preference.php
|
||
|
||
### 📋 获取偏好
|
||
|
||
```
|
||
GET api_preference.php?act=get&user_id=xxx
|
||
```
|
||
|
||
**功能**: 获取用户偏好设置
|
||
|
||
**返回字段及功能扩展**:
|
||
|
||
| 字段 | 说明 | 可扩展功能 |
|
||
|------|------|-----------|
|
||
| `preferred_tags` | 偏好标签 | 用于个性化推荐 |
|
||
| `preferred_categories` | 偏好分类 | 用于首页定制 |
|
||
| `blocked_allergens` | 屏蔽过敏原 | 用于健康过滤 |
|
||
|
||
---
|
||
|
||
### 💾 保存偏好
|
||
|
||
```
|
||
POST api_preference.php?act=save
|
||
{
|
||
"user_id": "xxx",
|
||
"preferred_tags": [1, 2, 3],
|
||
"preferred_categories": [11, 12],
|
||
"blocked_allergens": ["seafood", "nuts"]
|
||
}
|
||
```
|
||
|
||
**功能**: 保存用户偏好设置
|
||
|
||
**功能扩展**:
|
||
- 可用于用户画像构建
|
||
- 可用于个性化推荐
|
||
- 可用于健康饮食管理
|
||
|
||
---
|
||
|
||
### 🚫 过敏原设置
|
||
|
||
```
|
||
GET api_preference.php?act=allergens&user_id=xxx
|
||
```
|
||
|
||
**功能**: 获取/设置用户过敏原
|
||
|
||
**功能扩展**:
|
||
- 可用于健康警示
|
||
- 可用于食材过滤
|
||
- 可用于购物清单过滤
|
||
|
||
---
|
||
|
||
## 查重接口 api_check_duplicate.php
|
||
|
||
用于用户投稿时查询重复率,支持菜品、食材、营养成分、菜品内容、食材内容查重。
|
||
|
||
### 📋 菜品标题查重
|
||
|
||
```
|
||
GET api_check_duplicate.php?act=recipe_title&title=宫保鸡丁
|
||
```
|
||
|
||
**功能**: 检查菜品标题重复率
|
||
|
||
**参数**:
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| title | string | 菜品标题(必填) |
|
||
|
||
**返回示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {
|
||
"duplicate_rate": 85.5
|
||
},
|
||
"_query_time": "125.34ms"
|
||
}
|
||
```
|
||
|
||
**功能扩展**:
|
||
- 用于投稿前查重提醒
|
||
- 用于防止重复内容录入
|
||
- 用于内容质量把控
|
||
|
||
---
|
||
|
||
### 🥬 食材名称查重
|
||
|
||
```
|
||
GET api_check_duplicate.php?act=ingredient_name&name=鸡蛋
|
||
```
|
||
|
||
**功能**: 检查食材名称重复率
|
||
|
||
**参数**:
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| name | string | 食材名称(必填) |
|
||
|
||
**返回示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {
|
||
"duplicate_rate": 100.0
|
||
},
|
||
"_query_time": "45.23ms"
|
||
}
|
||
```
|
||
|
||
**功能扩展**:
|
||
- 用于食材库查重
|
||
- 用于食材数据质量检查
|
||
- 用于食材关联推荐
|
||
|
||
---
|
||
|
||
### 💊 营养成分查重
|
||
|
||
```
|
||
GET api_check_duplicate.php?act=nutrition_name&name=维生素C
|
||
```
|
||
|
||
**功能**: 检查营养成分名称重复率
|
||
|
||
**参数**:
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| name | string | 营养成分名称(必填) |
|
||
|
||
**返回示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {
|
||
"duplicate_rate": 100.0
|
||
},
|
||
"_query_time": "32.15ms"
|
||
}
|
||
```
|
||
|
||
**功能扩展**:
|
||
- 用于营养成分库查重
|
||
- 用于营养数据标准化
|
||
- 用于营养标签管理
|
||
|
||
---
|
||
|
||
### 📝 菜品内容查重
|
||
|
||
```
|
||
POST api_check_duplicate.php?act=recipe_content
|
||
Content-Type: application/json
|
||
{
|
||
"content": "1. 将鸡肉切成丁状..."
|
||
}
|
||
```
|
||
|
||
**功能**: 检查菜品内容(制作步骤)重复率
|
||
|
||
**参数**:
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| content | string | 菜品内容(必填) |
|
||
|
||
**返回示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {
|
||
"duplicate_rate": 65.3
|
||
},
|
||
"_query_time": "234.56ms"
|
||
}
|
||
```
|
||
|
||
**功能扩展**:
|
||
- 用于菜品内容原创性检查
|
||
- 用于防止抄袭内容
|
||
- 用于内容版权保护
|
||
|
||
---
|
||
|
||
### 📖 食材内容查重
|
||
|
||
```
|
||
POST api_check_duplicate.php?act=ingredient_content
|
||
Content-Type: application/json
|
||
{
|
||
"content": "鸡蛋含有丰富的蛋白质..."
|
||
}
|
||
```
|
||
|
||
**功能**: 检查食材内容(功效、营养、使用提示)重复率
|
||
|
||
**参数**:
|
||
| 参数 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| content | string | 食材内容(必填) |
|
||
|
||
**返回示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {
|
||
"duplicate_rate": 42.8
|
||
},
|
||
"_query_time": "189.32ms"
|
||
}
|
||
```
|
||
|
||
**功能扩展**:
|
||
- 用于食材内容原创性检查
|
||
- 用于食材数据质量把控
|
||
- 用于食材百科内容管理
|
||
|
||
---
|
||
|
||
### 🔍 查重算法说明
|
||
|
||
**相似度计算**:
|
||
- 使用PHP `similar_text()` 函数计算文本相似度
|
||
- 返回最高相似度作为重复率
|
||
- 重复率范围:0-100(百分比)
|
||
|
||
**性能优化**:
|
||
- 菜品内容查重限制查询1000条
|
||
- 食材内容查重限制查询1000条
|
||
- 找到100%匹配时提前终止
|
||
|
||
**应用场景**:
|
||
- 📝 用户投稿前查重提醒
|
||
- 🔒 防止重复内容录入
|
||
- 📊 内容质量把控
|
||
- 🛡️ 版权保护
|
||
|
||
---
|
||
|
||
## 功能扩展指南
|
||
|
||
本章节详细介绍每个接口返回字段的具体用途、应用场景和可实现的功能。
|
||
|
||
---
|
||
|
||
### 🍽️ 场景一:用餐时段推荐
|
||
|
||
#### 字段说明
|
||
|
||
`intro` 字段包含菜谱适用的用餐时段信息:
|
||
|
||
```json
|
||
{
|
||
"intro": "早餐、中餐、晚餐"
|
||
}
|
||
```
|
||
|
||
常见值:
|
||
- `"早餐"` - 适合早餐食用
|
||
- `"中餐"` - 适合午餐食用
|
||
- `"晚餐"` - 适合晚餐食用
|
||
- `"早餐、中餐、晚餐"` - 全天适用
|
||
- `"零食"` - 适合零食/下午茶
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 实现方式 |
|
||
|------|------|---------|
|
||
| 🌅 早餐推荐 | 根据时段推荐适合早餐的菜谱 | 筛选 `intro` 包含"早餐" |
|
||
| 🍱 午餐推荐 | 根据时段推荐适合午餐的菜谱 | 筛选 `intro` 包含"中餐" |
|
||
| 🌙 晚餐推荐 | 根据时段推荐适合晚餐的菜谱 | 筛选 `intro` 包含"晚餐" |
|
||
| ⏰ 智能时段 | 根据当前时间自动推荐 | 判断当前时段后筛选 |
|
||
| 📅 每日菜单 | 生成一日三餐菜单 | 分别获取早中晚餐菜谱 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 根据当前时间智能推荐
|
||
function getMealByTime() {
|
||
const hour = new Date().getHours();
|
||
let mealType = '中餐';
|
||
if (hour < 10) mealType = '早餐';
|
||
else if (hour > 17) mealType = '晚餐';
|
||
|
||
// 调用搜索接口
|
||
fetch(`api.php?act=search&keyword=${mealType}`);
|
||
}
|
||
|
||
// 生成一日三餐菜单
|
||
async function getDailyMenu() {
|
||
const [breakfast, lunch, dinner] = await Promise.all([
|
||
fetch('api.php?act=search&keyword=早餐&limit=3'),
|
||
fetch('api.php?act=search&keyword=中餐&limit=3'),
|
||
fetch('api.php?act=search&keyword=晚餐&limit=3')
|
||
]);
|
||
return { breakfast, lunch, dinner };
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🥗 场景二:健康饮食管理
|
||
|
||
#### 字段说明
|
||
|
||
`allergens` 和 `nutrition` 字段用于健康饮食管理:
|
||
|
||
```json
|
||
{
|
||
"allergens": ["海鲜", "花生"],
|
||
"nutrition": [
|
||
{"name": "热量", "value": 350, "unit": "kcal"},
|
||
{"name": "蛋白质", "value": 25, "unit": "g"},
|
||
{"name": "脂肪", "value": 15, "unit": "g"},
|
||
{"name": "碳水化合物", "value": 30, "unit": "g"}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| ⚠️ 过敏原警示 | 显示菜谱含有的过敏原 | 用户查看菜谱详情时提醒 |
|
||
| 🚫 过敏原过滤 | 排除含特定过敏原的菜谱 | 用户设置过敏原后自动过滤 |
|
||
| 📊 营养计算 | 计算菜谱营养成分 | 健康饮食、减肥餐规划 |
|
||
| 🔥 热量统计 | 统计每日摄入热量 | 减肥/健身用户热量管理 |
|
||
| 📈 营养分析 | 分析营养均衡度 | 营养师、健康管理App |
|
||
| 💪 健身餐推荐 | 推荐高蛋白低脂菜谱 | 健身人群饮食规划 |
|
||
| 🏥 特殊饮食 | 糖尿病/高血压饮食推荐 | 医疗健康场景 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 过敏原检查与警示
|
||
function checkAllergens(recipe, userAllergens) {
|
||
const recipeAllergens = recipe.allergens || [];
|
||
const warnings = userAllergens.filter(a => recipeAllergens.includes(a));
|
||
|
||
if (warnings.length > 0) {
|
||
return {
|
||
safe: false,
|
||
warning: `⚠️ 此菜谱含有您过敏的食材:${warnings.join('、')}`
|
||
};
|
||
}
|
||
return { safe: true };
|
||
}
|
||
|
||
// 计算每日营养摄入
|
||
function calculateDailyNutrition(recipes) {
|
||
const total = { calories: 0, protein: 0, fat: 0, carbs: 0 };
|
||
|
||
recipes.forEach(recipe => {
|
||
recipe.nutrition.forEach(n => {
|
||
if (n.name === '热量') total.calories += n.value;
|
||
if (n.name === '蛋白质') total.protein += n.value;
|
||
if (n.name === '脂肪') total.fat += n.value;
|
||
if (n.name === '碳水化合物') total.carbs += n.value;
|
||
});
|
||
});
|
||
|
||
return total;
|
||
}
|
||
|
||
// 推荐低热量菜谱
|
||
async function getLowCalorieRecipes(maxCalories = 300) {
|
||
const response = await fetch('api.php?act=list&limit=50');
|
||
const recipes = response.data.list;
|
||
|
||
return recipes.filter(r => {
|
||
const calories = r.nutrition?.find(n => n.name === '热量')?.value || 0;
|
||
return calories <= maxCalories;
|
||
});
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 📱 场景三:社交分享功能
|
||
|
||
#### 字段说明
|
||
|
||
`code` 和 `statistics` 字段用于社交分享:
|
||
|
||
```json
|
||
{
|
||
"id": 32892,
|
||
"code": "CP032892",
|
||
"title": "宫保鸡丁",
|
||
"statistics": {
|
||
"view_count": 1000,
|
||
"like_count": 50,
|
||
"recommend_count": 30
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 🔗 分享链接 | 生成唯一分享链接 | 微信/微博分享 |
|
||
| 📱 二维码 | 生成菜谱二维码 | 线下分享、海报 |
|
||
| 🔢 菜谱编码 | 短编码便于传播 | 口口相传、搜索 |
|
||
| 🔥 热度展示 | 显示浏览/点赞数 | 吸引用户点击 |
|
||
| 📊 排行榜 | 热门菜谱排行 | 发现优质内容 |
|
||
| 👍 点赞互动 | 用户点赞功能 | 社交互动 |
|
||
| ⭐ 评分系统 | 五星推荐评分 | 用户评价体系 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 生成分享链接
|
||
function generateShareLink(recipe) {
|
||
const baseUrl = 'https://eat.wktyl.com/recipe/';
|
||
return `${baseUrl}${recipe.code}`; // https://eat.wktyl.com/recipe/CP032892
|
||
}
|
||
|
||
// 生成二维码内容
|
||
function generateQRCode(recipe) {
|
||
return {
|
||
type: 'recipe',
|
||
code: recipe.code,
|
||
title: recipe.title,
|
||
url: generateShareLink(recipe)
|
||
};
|
||
}
|
||
|
||
// 显示热度标签
|
||
function getHotnessTag(statistics) {
|
||
const { view_count, like_count } = statistics;
|
||
|
||
if (view_count > 10000) return '🔥 爆款';
|
||
if (view_count > 1000) return '📈 热门';
|
||
if (like_count > 100) return '❤️ 受欢迎';
|
||
return null;
|
||
}
|
||
|
||
// 通过编码查询菜谱
|
||
async function getRecipeByCode(code) {
|
||
// code 格式: CP032892
|
||
const id = code.replace('CP', '');
|
||
return fetch(`api.php?act=full&id=${id}`);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🛒 场景四:购物清单功能
|
||
|
||
#### 字段说明
|
||
|
||
`ingredients` 字段包含完整食材信息:
|
||
|
||
```json
|
||
{
|
||
"ingredients": {
|
||
"main": [
|
||
{"name": "鸡肉", "amount": "500", "unit": "克"}
|
||
],
|
||
"auxiliary": [
|
||
{"name": "青椒", "amount": "2", "unit": "个"},
|
||
{"name": "红椒", "amount": "1", "unit": "个"}
|
||
],
|
||
"seasoning": [
|
||
{"name": "生抽", "amount": "2", "unit": "勺"},
|
||
{"name": "盐", "amount": "适量", "unit": ""}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 📝 生成清单 | 一键生成购物清单 | 准备做饭前 |
|
||
| ➕ 合并清单 | 多个菜谱合并购物清单 | 一次采购多道菜 |
|
||
| ✅ 打勾确认 | 购物时逐项确认 | 超市购物 |
|
||
| 📤 分享清单 | 分享给家人采购 | 家庭协作 |
|
||
| 🏪 智能分类 | 按食材类型/超市区域分类 | 提高购物效率 |
|
||
| 💰 预算估算 | 估算食材成本 | 家庭理财 |
|
||
| 🔄 常备食材 | 标记家中已有食材 | 避免重复购买 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 生成购物清单
|
||
function generateShoppingList(recipe) {
|
||
const { main, auxiliary, seasoning } = recipe.ingredients;
|
||
|
||
return [
|
||
{ category: '主料', items: main },
|
||
{ category: '辅料', items: auxiliary },
|
||
{ category: '调料', items: seasoning }
|
||
];
|
||
}
|
||
|
||
// 合并多个菜谱的购物清单
|
||
function mergeShoppingLists(recipes) {
|
||
const merged = {};
|
||
|
||
recipes.forEach(recipe => {
|
||
const allIngredients = [
|
||
...recipe.ingredients.main,
|
||
...recipe.ingredients.auxiliary,
|
||
...recipe.ingredients.seasoning
|
||
];
|
||
|
||
allIngredients.forEach(item => {
|
||
const key = item.name;
|
||
if (merged[key]) {
|
||
// 合并相同食材
|
||
merged[key].amount += item.amount;
|
||
} else {
|
||
merged[key] = { ...item };
|
||
}
|
||
});
|
||
});
|
||
|
||
return Object.values(merged);
|
||
}
|
||
|
||
// 按超市区域分类
|
||
function categorizeByStoreSection(shoppingList) {
|
||
const sections = {
|
||
'蔬菜区': ['青椒', '红椒', '洋葱', '蒜', '姜'],
|
||
'肉类区': ['鸡肉', '猪肉', '牛肉', '羊肉'],
|
||
'海鲜区': ['鱼', '虾', '蟹'],
|
||
'调料区': ['盐', '酱油', '醋', '料酒']
|
||
};
|
||
|
||
return shoppingList.map(item => {
|
||
for (const [section, items] of Object.entries(sections)) {
|
||
if (items.some(i => item.name.includes(i))) {
|
||
return { ...item, section };
|
||
}
|
||
}
|
||
return { ...item, section: '其他' };
|
||
});
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 📊 场景五:数据分析与运营
|
||
|
||
#### 字段说明
|
||
|
||
统计接口返回的数据:
|
||
|
||
```json
|
||
{
|
||
"total": 30916,
|
||
"today": 69,
|
||
"avg_daily": 59,
|
||
"apis": {"list": 40, "search": 9, "full": 10}
|
||
}
|
||
```
|
||
|
||
热门统计:
|
||
|
||
```json
|
||
{
|
||
"recipe_view": [
|
||
{"id": 4, "name": "姜", "count": 22},
|
||
{"id": 56897, "name": "芪菇炖乌鸡", "count": 21}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 📈 实时监控 | 监控API请求量 | 运维监控大屏 |
|
||
| 👥 在线人数 | 显示当前在线用户 | 社交氛围营造 |
|
||
| 🔥 热门趋势 | 分析热门菜谱趋势 | 内容运营 |
|
||
| 📅 日报/周报 | 自动生成运营报告 | 运营分析 |
|
||
| 🎯 用户画像 | 分析用户偏好 | 精准推荐 |
|
||
| 📱 平台分析 | 分析各平台使用情况 | 产品决策 |
|
||
| ⚡ 性能优化 | 分析接口响应时间 | 技术优化 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 构建运营数据大屏
|
||
async function buildDashboard() {
|
||
const [stats, hot, online] = await Promise.all([
|
||
fetch('stats_full.php?act=request'),
|
||
fetch('stats_full.php?act=hot&period=today'),
|
||
fetch('stats_full.php?act=online')
|
||
]);
|
||
|
||
return {
|
||
totalRecipes: stats.data.total,
|
||
todayRequests: stats.data.today,
|
||
onlineUsers: online.data.online_total,
|
||
topRecipes: hot.data.recipe_view.slice(0, 10)
|
||
};
|
||
}
|
||
|
||
// 分析用户偏好趋势
|
||
function analyzeUserPreference(hotData) {
|
||
const categories = {};
|
||
|
||
hotData.recipe_view.forEach(item => {
|
||
// 统计各分类热度
|
||
const category = item.category_name;
|
||
categories[category] = (categories[category] || 0) + item.count;
|
||
});
|
||
|
||
return Object.entries(categories)
|
||
.sort((a, b) => b[1] - a[1])
|
||
.slice(0, 5);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🎯 场景六:智能推荐系统
|
||
|
||
#### 字段说明
|
||
|
||
综合使用多个字段实现智能推荐:
|
||
|
||
```json
|
||
{
|
||
"category": {"id": 11, "name": "家常菜"},
|
||
"tags": [{"id": 2, "name": "原本味"}, {"id": 30, "name": "咖喱味"}],
|
||
"statistics": {"view_count": 1000, "like_count": 50},
|
||
"meta": {
|
||
"process": "炒",
|
||
"taste": "香辣",
|
||
"difficulty": "简单",
|
||
"time": "30分钟"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 🎲 随机推荐 | 随机推荐菜谱 | "今天吃什么" |
|
||
| 🏷️ 标签推荐 | 根据标签推荐 | 口味偏好推荐 |
|
||
| 📂 分类推荐 | 根据分类推荐 | 菜系偏好推荐 |
|
||
| ⏱️ 时间推荐 | 根据烹饪时间推荐 | 快手菜推荐 |
|
||
| 📊 热度推荐 | 根据热度推荐 | 发现优质内容 |
|
||
| 👤 个性化推荐 | 基于用户历史推荐 | 千人千面 |
|
||
| 🔄 相似推荐 | 推荐相似菜谱 | 详情页相关推荐 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 多维度智能推荐
|
||
async function smartRecommend(preferences) {
|
||
const { categories, tags, maxTime, difficulty } = preferences;
|
||
|
||
let url = 'api_what_to_eat.php?act=smart';
|
||
|
||
if (categories?.length) {
|
||
url += `&include_categories=${categories.join(',')}`;
|
||
}
|
||
if (tags?.length) {
|
||
url += `&include_tags=${tags.join(',')}`;
|
||
}
|
||
if (maxTime) {
|
||
url += `&max_time=${maxTime}`;
|
||
}
|
||
|
||
const response = await fetch(url);
|
||
return response.data;
|
||
}
|
||
|
||
// 相似菜谱推荐
|
||
async function getSimilarRecipes(recipeId) {
|
||
// 1. 获取当前菜谱信息
|
||
const current = await fetch(`api.php?act=full&id=${recipeId}`);
|
||
|
||
// 2. 根据分类和标签查找相似
|
||
const similar = await fetch(`api.php?act=list&cate_id=${current.category.id}&limit=10`);
|
||
|
||
// 3. 排除当前菜谱
|
||
return similar.data.list.filter(r => r.id !== recipeId);
|
||
}
|
||
|
||
// 快手菜推荐(30分钟内)
|
||
async function getQuickRecipes() {
|
||
const response = await fetch('api.php?act=list&limit=50');
|
||
|
||
return response.data.list.filter(recipe => {
|
||
const time = recipe.meta?.time;
|
||
if (!time) return false;
|
||
const minutes = parseInt(time);
|
||
return minutes <= 30;
|
||
});
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 📝 场景七:菜谱内容展示
|
||
|
||
#### 字段说明
|
||
|
||
`content` 字段包含菜谱详细步骤:
|
||
|
||
```json
|
||
{
|
||
"content": "<p>1.将白菜顺切成宽1.5厘米...</p><p>2.将勺置火上加入清水...</p>",
|
||
"intro": "早餐、中餐、晚餐",
|
||
"meta": {
|
||
"process": "炒",
|
||
"taste": "香辣",
|
||
"difficulty": "简单"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 📖 步骤解析 | 解析烹饪步骤 | 详情页展示 |
|
||
| 🔢 步骤编号 | 自动编号步骤 | 用户操作引导 |
|
||
| ⏰ 时间提示 | 提取步骤中的时间 | 计时器功能 |
|
||
| 🎙️ 语音播报 | 语音朗读步骤 | 做饭时解放双手 |
|
||
| 📸 步骤图片 | 提取步骤配图 | 图文教程 |
|
||
| 🖨️ 打印菜谱 | 生成可打印版本 | 纸质菜谱 |
|
||
| 📤 导出分享 | 导出为文本/图片 | 社交分享 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 解析步骤
|
||
function parseSteps(content) {
|
||
// 移除HTML标签
|
||
const text = content.replace(/<[^>]+>/g, '');
|
||
|
||
// 按步骤分割
|
||
const steps = text.split(/[1-9][.、]/).filter(s => s.trim());
|
||
|
||
return steps.map((step, index) => ({
|
||
number: index + 1,
|
||
content: step.trim(),
|
||
time: extractTime(step) // 提取时间
|
||
}));
|
||
}
|
||
|
||
// 提取步骤中的时间
|
||
function extractTime(text) {
|
||
const patterns = [
|
||
/(\d+)\s*分钟/,
|
||
/(\d+)\s*秒/,
|
||
/(\d+)\s*小时/
|
||
];
|
||
|
||
for (const pattern of patterns) {
|
||
const match = text.match(pattern);
|
||
if (match) return match[0];
|
||
}
|
||
return null;
|
||
}
|
||
|
||
// 生成计时器提醒
|
||
function generateTimers(steps) {
|
||
return steps
|
||
.filter(step => step.time)
|
||
.map(step => ({
|
||
step: step.number,
|
||
duration: step.time,
|
||
label: `步骤${step.number}需要${step.time}`
|
||
}));
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🔍 场景八:搜索与发现
|
||
|
||
#### 字段说明
|
||
|
||
搜索相关字段:
|
||
|
||
```json
|
||
{
|
||
"title": "宫保鸡丁",
|
||
"intro": "中餐、晚餐",
|
||
"category": {"id": 11, "name": "家常菜"},
|
||
"tags": [{"id": 2, "name": "原本味"}]
|
||
}
|
||
```
|
||
|
||
#### 可实现功能
|
||
|
||
| 功能 | 说明 | 应用场景 |
|
||
|------|------|---------|
|
||
| 🔎 关键词搜索 | 按菜名/食材搜索 | 快速查找 |
|
||
| 🏷️ 标签搜索 | 按标签筛选 | 口味筛选 |
|
||
| 📂 分类浏览 | 按分类浏览 | 菜系浏览 |
|
||
| 📜 搜索历史 | 记录搜索历史 | 快速重搜 |
|
||
| 🔥 热门搜索 | 显示热门关键词 | 发现内容 |
|
||
| 💡 搜索建议 | 输入时提供建议 | 提升体验 |
|
||
| 🎤 语音搜索 | 语音输入搜索 | 解放双手 |
|
||
|
||
#### 实现代码示例
|
||
|
||
```javascript
|
||
// 搜索建议
|
||
async function getSearchSuggestions(keyword) {
|
||
if (keyword.length < 2) return [];
|
||
|
||
const response = await fetch(`api.php?act=search&keyword=${keyword}&limit=5`);
|
||
|
||
return response.data.list.map(item => ({
|
||
id: item.id,
|
||
title: item.title,
|
||
type: 'recipe'
|
||
}));
|
||
}
|
||
|
||
// 热门搜索关键词
|
||
function getHotKeywords(hotData) {
|
||
return hotData.recipe_view
|
||
.slice(0, 10)
|
||
.map(item => item.name);
|
||
}
|
||
|
||
// 多条件组合搜索
|
||
function buildSearchQuery(filters) {
|
||
const params = new URLSearchParams();
|
||
|
||
if (filters.keyword) params.set('keyword', filters.keyword);
|
||
if (filters.category) params.set('cate_id', filters.category);
|
||
if (filters.tag) params.set('tag_id', filters.tag);
|
||
|
||
return `api.php?act=search&${params.toString()}`;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 📋 字段功能速查表
|
||
|
||
| 字段 | 可实现功能 | 推荐接口 |
|
||
|------|-----------|---------|
|
||
| `id` | 详情查询、收藏、分享链接 | `api.php?act=detail` |
|
||
| `code` | 二维码、短链接、语音搜索 | `api_what_to_eat.php?act=detail&code=` |
|
||
| `title` | 搜索、分享标题、列表展示 | `api.php?act=search` |
|
||
| `intro` | 用餐时段筛选、列表预览 | 客户端过滤 |
|
||
| `category` | 分类筛选、面包屑导航 | `api.php?act=list&cate_id=` |
|
||
| `tags` | 标签云、口味筛选、相关推荐 | `api.php?act=list&tag_id=` |
|
||
| `allergens` | 过敏警示、健康过滤 | `api.php?act=full` |
|
||
| `nutrition` | 营养计算、健康分析 | `api.php?act=full` |
|
||
| `ingredients` | 购物清单、营养计算 | `api.php?act=full` |
|
||
| `statistics` | 热门排序、热度展示 | `stats_full.php?act=hot` |
|
||
| `meta.process` | 工艺筛选(炒/蒸/煮) | 客户端过滤 |
|
||
| `meta.taste` | 口味筛选(酸甜苦辣咸) | 客户端过滤 |
|
||
| `meta.difficulty` | 难度筛选、新手推荐 | 客户端过滤 |
|
||
| `meta.time` | 时间筛选、快手菜推荐 | 客户端过滤 |
|
||
| `content` | 步骤解析、语音播报 | `api.php?act=detail` |
|
||
|
||
---
|
||
|
||
## 错误处理
|
||
|
||
### 错误码
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 200 | 成功 |
|
||
| 301 | 重定向 |
|
||
| 400 | 参数错误 |
|
||
| 404 | 资源不存在 |
|
||
| 429 | 请求过于频繁 |
|
||
| 500 | 服务器错误 |
|
||
|
||
### 错误响应
|
||
|
||
```json
|
||
{
|
||
"code": 404,
|
||
"message": "菜谱不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 缓存时间
|
||
|
||
| 接口 | 缓存时间 |
|
||
|------|---------|
|
||
| list | 3分钟 |
|
||
| detail | 5分钟 |
|
||
| full | 10分钟 |
|
||
| ingredients | 5分钟 |
|
||
| search | 2分钟 |
|
||
| categories | 10分钟 |
|
||
| stats | 1分钟 |
|
||
| hot | 5分钟 |
|
||
| online | 30秒 |
|
||
|
||
---
|
||
|
||
## 📦 数据资源文件
|
||
|
||
本章节介绍API提供的静态数据资源文件,这些文件包含菜谱系统的核心基础数据,可配合API接口实现更丰富的功能。
|
||
|
||
---
|
||
|
||
### 🍽️ 用餐时段数据
|
||
|
||
**文件地址**: `http://eat.wktyl.com/api/assets/eating_times.json`
|
||
|
||
**数据结构**:
|
||
```json
|
||
{
|
||
"standard_times": [
|
||
{"id": 1, "name": "中餐", "count": 2485},
|
||
{"id": 2, "name": "晚餐", "count": 2422},
|
||
{"id": 3, "name": "早餐", "count": 1408},
|
||
{"id": 4, "name": "零食", "count": 244}
|
||
],
|
||
"combined_times": [...],
|
||
"frequency_times": [...],
|
||
"method_times": [...],
|
||
"other_times": [...]
|
||
}
|
||
```
|
||
|
||
**数据分类**:
|
||
|
||
| 分类 | 说明 | 数量 | 用途 |
|
||
|------|------|------|------|
|
||
| standard_times | 标准用餐时段 | 9个 | 早中晚餐、零食等标准时段 |
|
||
| combined_times | 组合时段 | 3个 | 多时段组合(如中晚餐均可) |
|
||
| frequency_times | 食用频率 | 11个 | 药膳频率(每日2次、连服10天等) |
|
||
| method_times | 食用方式 | 8个 | 食用方法(佐餐、温服等) |
|
||
| other_times | 其他时段 | 3个 | 特殊描述 |
|
||
|
||
**配合API使用**:
|
||
|
||
1. **时段筛选功能**
|
||
```javascript
|
||
// 获取用餐时段列表
|
||
const eatingTimes = await fetch('http://eat.wktyl.com/api/assets/eating_times.json');
|
||
const times = await eatingTimes.json();
|
||
|
||
// 用户选择时段后,调用API筛选菜谱
|
||
const selectedTime = times.standard_times[0].name; // "中餐"
|
||
const recipes = await fetch(`api.php?act=search&keyword=${selectedTime}`);
|
||
```
|
||
|
||
2. **智能时段推荐**
|
||
```javascript
|
||
// 根据当前时间自动推荐
|
||
function getMealByTime() {
|
||
const hour = new Date().getHours();
|
||
let mealType = '中餐';
|
||
if (hour < 10) mealType = '早餐';
|
||
else if (hour > 17) mealType = '晚餐';
|
||
|
||
// 使用时段数据验证
|
||
const times = await getEatingTimes();
|
||
const isValid = times.standard_times.some(t => t.name === mealType);
|
||
|
||
if (isValid) {
|
||
return fetch(`api.php?act=search&keyword=${mealType}`);
|
||
}
|
||
}
|
||
```
|
||
|
||
3. **用餐时段选择器**
|
||
```javascript
|
||
// 构建时段选择UI
|
||
function buildTimeSelector() {
|
||
const times = await getEatingTimes();
|
||
|
||
return {
|
||
standard: times.standard_times.map(t => ({
|
||
label: t.name,
|
||
count: t.count,
|
||
value: t.name
|
||
})),
|
||
frequency: times.frequency_times.map(t => ({
|
||
label: t.name,
|
||
count: t.count,
|
||
value: t.name
|
||
}))
|
||
};
|
||
}
|
||
```
|
||
|
||
**应用场景**:
|
||
- 🕐 智能时段推荐:根据当前时间自动推荐适合的菜谱
|
||
- 📅 每日菜单规划:生成早中晚餐完整菜单
|
||
- 🏥 药膳管理:根据食用频率规划药膳食谱
|
||
- 📊 时段统计分析:分析不同时段的菜谱分布
|
||
|
||
---
|
||
|
||
### 🥗 营养成分数据
|
||
|
||
**文件地址**: `http://eat.wktyl.com/api/assets/nutrition_types.json`
|
||
|
||
**数据结构**:
|
||
```json
|
||
[
|
||
{"id": 1, "name": "叶酸", "unit": "微克"},
|
||
{"id": 2, "name": "核黄素", "unit": "毫克"},
|
||
{"id": 3, "name": "泛酸", "unit": "毫克"},
|
||
{"id": 4, "name": "烟酸", "unit": "毫克"},
|
||
{"id": 5, "name": "生物素", "unit": "微克"},
|
||
...
|
||
]
|
||
```
|
||
|
||
**数据统计**: 共31种营养成分类型
|
||
|
||
**营养成分分类**:
|
||
|
||
| 分类 | 成分 | 数量 |
|
||
|------|------|------|
|
||
| 维生素类 | 维生素A、B、C、D、E、K、叶酸等 | 12种 |
|
||
| 矿物质类 | 钙、铁、锌、硒、碘、铜、锰、镁等 | 8种 |
|
||
| 宏量营养素 | 蛋白质、脂肪、碳水化合物、膳食纤维 | 4种 |
|
||
| 其他 | 能量、胆固醇、胡萝卜素等 | 7种 |
|
||
|
||
**配合API使用**:
|
||
|
||
1. **营养分析功能**
|
||
```javascript
|
||
// 获取营养成分类型
|
||
const nutritionTypes = await fetch('http://eat.wktyl.com/api/assets/nutrition_types.json');
|
||
const types = await nutritionTypes.json();
|
||
|
||
// 获取菜谱营养信息
|
||
const recipe = await fetch('api.php?act=full&id=32892');
|
||
const recipeData = await recipe.json();
|
||
|
||
// 匹配营养成分单位
|
||
recipeData.nutrition.forEach(n => {
|
||
const type = types.find(t => t.name === n.name);
|
||
if (type) {
|
||
n.unit = type.unit;
|
||
n.id = type.id;
|
||
}
|
||
});
|
||
```
|
||
|
||
2. **营养目标追踪**
|
||
```javascript
|
||
// 用户设置营养目标
|
||
const nutritionGoals = [
|
||
{name: "蛋白质", target: 60, unit: "克"},
|
||
{name: "维生素C", target: 100, unit: "毫克"}
|
||
];
|
||
|
||
// 计算菜谱营养贡献
|
||
function calculateNutrition(recipe) {
|
||
const types = await getNutritionTypes();
|
||
const contribution = {};
|
||
|
||
recipe.nutrition.forEach(n => {
|
||
const type = types.find(t => t.name === n.name);
|
||
const goal = nutritionGoals.find(g => g.name === n.name);
|
||
|
||
if (goal && type) {
|
||
contribution[n.name] = {
|
||
value: n.value,
|
||
unit: type.unit,
|
||
percentage: (n.value / goal.target * 100).toFixed(1) + '%'
|
||
};
|
||
}
|
||
});
|
||
|
||
return contribution;
|
||
}
|
||
```
|
||
|
||
3. **营养筛选器**
|
||
```javascript
|
||
// 构建营养筛选UI
|
||
function buildNutritionFilter() {
|
||
const types = await getNutritionTypes();
|
||
|
||
return types.map(t => ({
|
||
id: t.id,
|
||
label: t.name,
|
||
unit: t.unit,
|
||
type: categorizeNutrition(t.name) // 维生素/矿物质/宏量营养素
|
||
}));
|
||
}
|
||
|
||
function categorizeNutrition(name) {
|
||
if (name.includes('维生素') || name.includes('叶酸')) return 'vitamin';
|
||
if (['钙', '铁', '锌', '硒', '碘', '铜', '锰', '镁'].includes(name)) return 'mineral';
|
||
if (['蛋白质', '脂肪', '碳水化合物', '膳食纤维'].includes(name)) return 'macro';
|
||
return 'other';
|
||
}
|
||
```
|
||
|
||
**应用场景**:
|
||
- 📊 营养分析:计算菜谱营养成分及占比
|
||
- 🎯 营养目标:追踪每日营养摄入目标
|
||
- 🏋️ 健身餐规划:高蛋白、低碳水化合物菜谱推荐
|
||
- 🏥 健康管理:糖尿病、高血压等特殊饮食规划
|
||
- 👶 孕期营养:叶酸、铁、钙等关键营养素追踪
|
||
|
||
---
|
||
|
||
### ⚠️ 过敏原数据
|
||
|
||
**文件地址**: `http://eat.wktyl.com/api/assets/gmy.json`
|
||
|
||
**数据结构**:
|
||
```json
|
||
[
|
||
{
|
||
"name": "蔬菜类及制品",
|
||
"items": [
|
||
{
|
||
"name": "姜",
|
||
"allergens": ["姜"],
|
||
"allergen_type": ["蔬菜类"]
|
||
},
|
||
{
|
||
"name": "洋葱(白皮)",
|
||
"allergens": ["葱", "洋葱"],
|
||
"allergen_type": ["蔬菜类"]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
```
|
||
|
||
**数据统计**:
|
||
- 总分类数:21个
|
||
- 总食材数:585种(仅含过敏原信息)
|
||
- 过敏原类型:蔬菜类、水果类、谷物类、菌类、豆类、海鲜类、肉类等
|
||
|
||
**主要分类**:
|
||
|
||
| 分类 | 食材数 | 常见过敏原 |
|
||
|------|--------|-----------|
|
||
| 蔬菜类及制品 | 63 | 姜、葱、蒜、韭菜、芹菜、茄子等 |
|
||
| 水果类及制品 | 28 | 菠萝、芒果、桃、草莓、荔枝等 |
|
||
| 干豆类及制品 | 33 | 黄豆、绿豆、豌豆、蚕豆等 |
|
||
| 鱼虾蟹贝类 | 101 | 各类海鲜、鱼类、虾蟹等 |
|
||
| 畜肉类及制品 | 88 | 牛肉、羊肉、猪肉等 |
|
||
| 禽肉类及制品 | 55 | 鸡肉、鸭肉、鹅肉等 |
|
||
| 蛋类及制品 | 10 | 鸡蛋、鸭蛋、鹌鹑蛋等 |
|
||
| 乳类及制品 | 10 | 牛奶、羊奶、奶酪等 |
|
||
| 坚果种子类 | 22 | 花生、核桃、杏仁等 |
|
||
| 调味品类 | 57 | 酱油、醋、味精等 |
|
||
|
||
**配合API使用**:
|
||
|
||
1. **过敏原检查**
|
||
```javascript
|
||
// 获取过敏原数据
|
||
const allergenData = await fetch('http://eat.wktyl.com/api/assets/gmy.json');
|
||
const allergens = await allergenData.json();
|
||
|
||
// 检查食材是否含过敏原
|
||
function checkAllergen(ingredientName, userAllergens) {
|
||
for (const category of allergens) {
|
||
const item = category.items.find(i => i.name === ingredientName);
|
||
if (item && item.allergens) {
|
||
const hasAllergen = item.allergens.some(a => userAllergens.includes(a));
|
||
if (hasAllergen) {
|
||
return {
|
||
safe: false,
|
||
allergens: item.allergens.filter(a => userAllergens.includes(a)),
|
||
types: item.allergen_type
|
||
};
|
||
}
|
||
}
|
||
}
|
||
return { safe: true };
|
||
}
|
||
```
|
||
|
||
2. **菜谱过敏原过滤**
|
||
```javascript
|
||
// 获取菜谱详情
|
||
const recipe = await fetch('api.php?act=full&id=32892');
|
||
const recipeData = await recipe.json();
|
||
|
||
// 检查菜谱是否安全
|
||
function checkRecipeSafety(recipe, userAllergens) {
|
||
const allergenData = await getAllergenData();
|
||
const warnings = [];
|
||
|
||
// 检查所有食材
|
||
recipe.ingredients.forEach(ing => {
|
||
const check = checkAllergen(ing.name, userAllergens);
|
||
if (!check.safe) {
|
||
warnings.push({
|
||
ingredient: ing.name,
|
||
allergens: check.allergens,
|
||
types: check.types
|
||
});
|
||
}
|
||
});
|
||
|
||
return {
|
||
safe: warnings.length === 0,
|
||
warnings: warnings
|
||
};
|
||
}
|
||
```
|
||
|
||
3. **过敏原设置界面**
|
||
```javascript
|
||
// 构建过敏原选择UI
|
||
function buildAllergenSelector() {
|
||
const allergenData = await getAllergenData();
|
||
const allergenTypes = new Set();
|
||
|
||
// 收集所有过敏原类型
|
||
allergenData.forEach(category => {
|
||
category.items.forEach(item => {
|
||
item.allergen_type.forEach(type => allergenTypes.add(type));
|
||
});
|
||
});
|
||
|
||
return Array.from(allergenTypes).map(type => ({
|
||
label: type,
|
||
value: type,
|
||
count: countItemsByType(allergenData, type)
|
||
}));
|
||
}
|
||
```
|
||
|
||
4. **智能替代推荐**
|
||
```javascript
|
||
// 为含过敏原食材推荐替代品
|
||
function suggestAlternatives(ingredient, userAllergens) {
|
||
const allergenData = await getAllergenData();
|
||
const category = findCategory(allergenData, ingredient);
|
||
|
||
if (!category) return [];
|
||
|
||
// 查找同类但不含过敏原的食材
|
||
return category.items.filter(item => {
|
||
const hasAllergen = item.allergens.some(a => userAllergens.includes(a));
|
||
return !hasAllergen && item.name !== ingredient;
|
||
}).slice(0, 5);
|
||
}
|
||
```
|
||
|
||
**应用场景**:
|
||
- ⚠️ 过敏原警示:用户查看菜谱时显示过敏原提醒
|
||
- 🚫 智能过滤:自动过滤含用户过敏原的菜谱
|
||
- 🔄 食材替代:推荐不含过敏原的替代食材
|
||
- 📋 过敏原报告:生成菜谱过敏原分析报告
|
||
- 👶 儿童饮食:儿童常见过敏原特殊处理
|
||
- 🏥 医疗饮食:为特殊人群定制安全食谱
|
||
|
||
---
|
||
|
||
### 🔗 数据文件与API协同使用
|
||
|
||
**完整工作流程**:
|
||
|
||
```javascript
|
||
// 1. 初始化:加载基础数据
|
||
async function initializeApp() {
|
||
const [eatingTimes, nutritionTypes, allergenData] = await Promise.all([
|
||
fetch('http://eat.wktyl.com/api/assets/eating_times.json').then(r => r.json()),
|
||
fetch('http://eat.wktyl.com/api/assets/nutrition_types.json').then(r => r.json()),
|
||
fetch('http://eat.wktyl.com/api/assets/gmy.json').then(r => r.json())
|
||
]);
|
||
|
||
return { eatingTimes, nutritionTypes, allergenData };
|
||
}
|
||
|
||
// 2. 智能推荐:结合时段、营养、过敏原
|
||
async function smartRecommend(userProfile) {
|
||
const data = await initializeApp();
|
||
|
||
// 根据时段推荐
|
||
const currentMeal = getCurrentMealType(data.eatingTimes);
|
||
|
||
// 获取推荐菜谱
|
||
const recipes = await fetch(`api.php?act=search&keyword=${currentMeal}`);
|
||
|
||
// 过滤过敏原
|
||
const safeRecipes = recipes.filter(recipe => {
|
||
const safety = checkRecipeSafety(recipe, userProfile.allergens, data.allergenData);
|
||
return safety.safe;
|
||
});
|
||
|
||
// 计算营养匹配度
|
||
const scoredRecipes = safeRecipes.map(recipe => ({
|
||
...recipe,
|
||
nutritionScore: calculateNutritionScore(recipe, userProfile.nutritionGoals, data.nutritionTypes)
|
||
}));
|
||
|
||
// 排序返回
|
||
return scoredRecipes.sort((a, b) => b.nutritionScore - a.nutritionScore);
|
||
}
|
||
|
||
// 3. 生成个性化报告
|
||
async function generateReport(recipeId, userProfile) {
|
||
const data = await initializeApp();
|
||
const recipe = await fetch(`api.php?act=full&id=${recipeId}`).then(r => r.json());
|
||
|
||
return {
|
||
mealTime: matchMealTime(recipe, data.eatingTimes),
|
||
nutrition: analyzeNutrition(recipe, data.nutritionTypes, userProfile.goals),
|
||
allergens: checkAllergens(recipe, data.allergenData, userProfile.allergens),
|
||
suggestions: generateSuggestions(recipe, data, userProfile)
|
||
};
|
||
}
|
||
```
|
||
|
||
**最佳实践**:
|
||
|
||
1. **数据缓存策略**
|
||
```javascript
|
||
// 本地缓存基础数据,减少网络请求
|
||
const CACHE_KEY = 'recipe_base_data';
|
||
const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24小时
|
||
|
||
async function getBaseData() {
|
||
const cached = localStorage.getItem(CACHE_KEY);
|
||
if (cached) {
|
||
const { data, timestamp } = JSON.parse(cached);
|
||
if (Date.now() - timestamp < CACHE_DURATION) {
|
||
return data;
|
||
}
|
||
}
|
||
|
||
const data = await initializeApp();
|
||
localStorage.setItem(CACHE_KEY, JSON.stringify({
|
||
data,
|
||
timestamp: Date.now()
|
||
}));
|
||
|
||
return data;
|
||
}
|
||
```
|
||
|
||
2. **增量更新**
|
||
```javascript
|
||
// 定期检查数据更新
|
||
async function checkForUpdates() {
|
||
const response = await fetch('http://eat.wktyl.com/api/assets/version.json');
|
||
const { version } = await response.json();
|
||
|
||
const currentVersion = localStorage.getItem('data_version');
|
||
if (version !== currentVersion) {
|
||
localStorage.clear();
|
||
await getBaseData();
|
||
localStorage.setItem('data_version', version);
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 过敏原类型
|
||
|
||
| 类型 | 说明 |
|
||
|------|------|
|
||
| seafood | 海鲜 |
|
||
| nuts | 坚果 |
|
||
| dairy | 乳制品 |
|
||
| egg | 蛋类 |
|
||
| gluten | 麸质 |
|
||
| soy | 大豆 |
|
||
| peanut | 花生 |
|
||
|
||
---
|
||
|
||
## 菜谱编码格式
|
||
|
||
格式:`CP` + 6位数字
|
||
|
||
示例:`CP032892` 对应 ID `32892`
|
||
|
||
**用途**:
|
||
- 唯一标识分享
|
||
- 二维码生成
|
||
- 语音搜索识别
|
||
- 快速定位菜谱
|