52 KiB
菜谱 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
- 动态接口 api_action.php
- 智能选择 api_what_to_eat.php
- 信息流 api_feed.php
- 全面统计 stats_full.php
- 用户偏好 api_preference.php
- 查重接口 api_check_duplicate.php
- 功能扩展指南
- 错误处理
快速开始
请求方式
支持 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% | 高速网络 |
响应结构
{
"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
功能: 获取热门列表
统一字段结构
{
"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 | 菜品标题(必填) |
返回示例:
{
"code": 200,
"message": "success",
"data": {
"duplicate_rate": 85.5
},
"_query_time": "125.34ms"
}
功能扩展:
- 用于投稿前查重提醒
- 用于防止重复内容录入
- 用于内容质量把控
🥬 食材名称查重
GET api_check_duplicate.php?act=ingredient_name&name=鸡蛋
功能: 检查食材名称重复率
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| name | string | 食材名称(必填) |
返回示例:
{
"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 | 营养成分名称(必填) |
返回示例:
{
"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 | 菜品内容(必填) |
返回示例:
{
"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 | 食材内容(必填) |
返回示例:
{
"code": 200,
"message": "success",
"data": {
"duplicate_rate": 42.8
},
"_query_time": "189.32ms"
}
功能扩展:
- 用于食材内容原创性检查
- 用于食材数据质量把控
- 用于食材百科内容管理
🔍 查重算法说明
相似度计算:
- 使用PHP
similar_text()函数计算文本相似度 - 返回最高相似度作为重复率
- 重复率范围:0-100(百分比)
性能优化:
- 菜品内容查重限制查询1000条
- 食材内容查重限制查询1000条
- 找到100%匹配时提前终止
应用场景:
- 📝 用户投稿前查重提醒
- 🔒 防止重复内容录入
- 📊 内容质量把控
- 🛡️ 版权保护
功能扩展指南
本章节详细介绍每个接口返回字段的具体用途、应用场景和可实现的功能。
🍽️ 场景一:用餐时段推荐
字段说明
intro 字段包含菜谱适用的用餐时段信息:
{
"intro": "早餐、中餐、晚餐"
}
常见值:
"早餐"- 适合早餐食用"中餐"- 适合午餐食用"晚餐"- 适合晚餐食用"早餐、中餐、晚餐"- 全天适用"零食"- 适合零食/下午茶
可实现功能
| 功能 | 说明 | 实现方式 |
|---|---|---|
| 🌅 早餐推荐 | 根据时段推荐适合早餐的菜谱 | 筛选 intro 包含"早餐" |
| 🍱 午餐推荐 | 根据时段推荐适合午餐的菜谱 | 筛选 intro 包含"中餐" |
| 🌙 晚餐推荐 | 根据时段推荐适合晚餐的菜谱 | 筛选 intro 包含"晚餐" |
| ⏰ 智能时段 | 根据当前时间自动推荐 | 判断当前时段后筛选 |
| 📅 每日菜单 | 生成一日三餐菜单 | 分别获取早中晚餐菜谱 |
实现代码示例
// 根据当前时间智能推荐
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 字段用于健康饮食管理:
{
"allergens": ["海鲜", "花生"],
"nutrition": [
{"name": "热量", "value": 350, "unit": "kcal"},
{"name": "蛋白质", "value": 25, "unit": "g"},
{"name": "脂肪", "value": 15, "unit": "g"},
{"name": "碳水化合物", "value": 30, "unit": "g"}
]
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| ⚠️ 过敏原警示 | 显示菜谱含有的过敏原 | 用户查看菜谱详情时提醒 |
| 🚫 过敏原过滤 | 排除含特定过敏原的菜谱 | 用户设置过敏原后自动过滤 |
| 📊 营养计算 | 计算菜谱营养成分 | 健康饮食、减肥餐规划 |
| 🔥 热量统计 | 统计每日摄入热量 | 减肥/健身用户热量管理 |
| 📈 营养分析 | 分析营养均衡度 | 营养师、健康管理App |
| 💪 健身餐推荐 | 推荐高蛋白低脂菜谱 | 健身人群饮食规划 |
| 🏥 特殊饮食 | 糖尿病/高血压饮食推荐 | 医疗健康场景 |
实现代码示例
// 过敏原检查与警示
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 字段用于社交分享:
{
"id": 32892,
"code": "CP032892",
"title": "宫保鸡丁",
"statistics": {
"view_count": 1000,
"like_count": 50,
"recommend_count": 30
}
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 🔗 分享链接 | 生成唯一分享链接 | 微信/微博分享 |
| 📱 二维码 | 生成菜谱二维码 | 线下分享、海报 |
| 🔢 菜谱编码 | 短编码便于传播 | 口口相传、搜索 |
| 🔥 热度展示 | 显示浏览/点赞数 | 吸引用户点击 |
| 📊 排行榜 | 热门菜谱排行 | 发现优质内容 |
| 👍 点赞互动 | 用户点赞功能 | 社交互动 |
| ⭐ 评分系统 | 五星推荐评分 | 用户评价体系 |
实现代码示例
// 生成分享链接
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 字段包含完整食材信息:
{
"ingredients": {
"main": [
{"name": "鸡肉", "amount": "500", "unit": "克"}
],
"auxiliary": [
{"name": "青椒", "amount": "2", "unit": "个"},
{"name": "红椒", "amount": "1", "unit": "个"}
],
"seasoning": [
{"name": "生抽", "amount": "2", "unit": "勺"},
{"name": "盐", "amount": "适量", "unit": ""}
]
}
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 📝 生成清单 | 一键生成购物清单 | 准备做饭前 |
| ➕ 合并清单 | 多个菜谱合并购物清单 | 一次采购多道菜 |
| ✅ 打勾确认 | 购物时逐项确认 | 超市购物 |
| 📤 分享清单 | 分享给家人采购 | 家庭协作 |
| 🏪 智能分类 | 按食材类型/超市区域分类 | 提高购物效率 |
| 💰 预算估算 | 估算食材成本 | 家庭理财 |
| 🔄 常备食材 | 标记家中已有食材 | 避免重复购买 |
实现代码示例
// 生成购物清单
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: '其他' };
});
}
📊 场景五:数据分析与运营
字段说明
统计接口返回的数据:
{
"total": 30916,
"today": 69,
"avg_daily": 59,
"apis": {"list": 40, "search": 9, "full": 10}
}
热门统计:
{
"recipe_view": [
{"id": 4, "name": "姜", "count": 22},
{"id": 56897, "name": "芪菇炖乌鸡", "count": 21}
]
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 📈 实时监控 | 监控API请求量 | 运维监控大屏 |
| 👥 在线人数 | 显示当前在线用户 | 社交氛围营造 |
| 🔥 热门趋势 | 分析热门菜谱趋势 | 内容运营 |
| 📅 日报/周报 | 自动生成运营报告 | 运营分析 |
| 🎯 用户画像 | 分析用户偏好 | 精准推荐 |
| 📱 平台分析 | 分析各平台使用情况 | 产品决策 |
| ⚡ 性能优化 | 分析接口响应时间 | 技术优化 |
实现代码示例
// 构建运营数据大屏
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);
}
🎯 场景六:智能推荐系统
字段说明
综合使用多个字段实现智能推荐:
{
"category": {"id": 11, "name": "家常菜"},
"tags": [{"id": 2, "name": "原本味"}, {"id": 30, "name": "咖喱味"}],
"statistics": {"view_count": 1000, "like_count": 50},
"meta": {
"process": "炒",
"taste": "香辣",
"difficulty": "简单",
"time": "30分钟"
}
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 🎲 随机推荐 | 随机推荐菜谱 | "今天吃什么" |
| 🏷️ 标签推荐 | 根据标签推荐 | 口味偏好推荐 |
| 📂 分类推荐 | 根据分类推荐 | 菜系偏好推荐 |
| ⏱️ 时间推荐 | 根据烹饪时间推荐 | 快手菜推荐 |
| 📊 热度推荐 | 根据热度推荐 | 发现优质内容 |
| 👤 个性化推荐 | 基于用户历史推荐 | 千人千面 |
| 🔄 相似推荐 | 推荐相似菜谱 | 详情页相关推荐 |
实现代码示例
// 多维度智能推荐
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 字段包含菜谱详细步骤:
{
"content": "<p>1.将白菜顺切成宽1.5厘米...</p><p>2.将勺置火上加入清水...</p>",
"intro": "早餐、中餐、晚餐",
"meta": {
"process": "炒",
"taste": "香辣",
"difficulty": "简单"
}
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 📖 步骤解析 | 解析烹饪步骤 | 详情页展示 |
| 🔢 步骤编号 | 自动编号步骤 | 用户操作引导 |
| ⏰ 时间提示 | 提取步骤中的时间 | 计时器功能 |
| 🎙️ 语音播报 | 语音朗读步骤 | 做饭时解放双手 |
| 📸 步骤图片 | 提取步骤配图 | 图文教程 |
| 🖨️ 打印菜谱 | 生成可打印版本 | 纸质菜谱 |
| 📤 导出分享 | 导出为文本/图片 | 社交分享 |
实现代码示例
// 解析步骤
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}`
}));
}
🔍 场景八:搜索与发现
字段说明
搜索相关字段:
{
"title": "宫保鸡丁",
"intro": "中餐、晚餐",
"category": {"id": 11, "name": "家常菜"},
"tags": [{"id": 2, "name": "原本味"}]
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 🔎 关键词搜索 | 按菜名/食材搜索 | 快速查找 |
| 🏷️ 标签搜索 | 按标签筛选 | 口味筛选 |
| 📂 分类浏览 | 按分类浏览 | 菜系浏览 |
| 📜 搜索历史 | 记录搜索历史 | 快速重搜 |
| 🔥 热门搜索 | 显示热门关键词 | 发现内容 |
| 💡 搜索建议 | 输入时提供建议 | 提升体验 |
| 🎤 语音搜索 | 语音输入搜索 | 解放双手 |
实现代码示例
// 搜索建议
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 | 服务器错误 |
错误响应
{
"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
数据结构:
{
"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使用:
- 时段筛选功能
// 获取用餐时段列表
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}`);
- 智能时段推荐
// 根据当前时间自动推荐
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}`);
}
}
- 用餐时段选择器
// 构建时段选择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
数据结构:
[
{"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使用:
- 营养分析功能
// 获取营养成分类型
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;
}
});
- 营养目标追踪
// 用户设置营养目标
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;
}
- 营养筛选器
// 构建营养筛选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
数据结构:
[
{
"name": "蔬菜类及制品",
"items": [
{
"name": "姜",
"allergens": ["姜"],
"allergen_type": ["蔬菜类"]
},
{
"name": "洋葱(白皮)",
"allergens": ["葱", "洋葱"],
"allergen_type": ["蔬菜类"]
}
]
}
]
数据统计:
- 总分类数:21个
- 总食材数:585种(仅含过敏原信息)
- 过敏原类型:蔬菜类、水果类、谷物类、菌类、豆类、海鲜类、肉类等
主要分类:
| 分类 | 食材数 | 常见过敏原 |
|---|---|---|
| 蔬菜类及制品 | 63 | 姜、葱、蒜、韭菜、芹菜、茄子等 |
| 水果类及制品 | 28 | 菠萝、芒果、桃、草莓、荔枝等 |
| 干豆类及制品 | 33 | 黄豆、绿豆、豌豆、蚕豆等 |
| 鱼虾蟹贝类 | 101 | 各类海鲜、鱼类、虾蟹等 |
| 畜肉类及制品 | 88 | 牛肉、羊肉、猪肉等 |
| 禽肉类及制品 | 55 | 鸡肉、鸭肉、鹅肉等 |
| 蛋类及制品 | 10 | 鸡蛋、鸭蛋、鹌鹑蛋等 |
| 乳类及制品 | 10 | 牛奶、羊奶、奶酪等 |
| 坚果种子类 | 22 | 花生、核桃、杏仁等 |
| 调味品类 | 57 | 酱油、醋、味精等 |
配合API使用:
- 过敏原检查
// 获取过敏原数据
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 };
}
- 菜谱过敏原过滤
// 获取菜谱详情
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
};
}
- 过敏原设置界面
// 构建过敏原选择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)
}));
}
- 智能替代推荐
// 为含过敏原食材推荐替代品
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协同使用
完整工作流程:
// 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)
};
}
最佳实践:
- 数据缓存策略
// 本地缓存基础数据,减少网络请求
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;
}
- 增量更新
// 定期检查数据更新
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
用途:
- 唯一标识分享
- 二维码生成
- 语音搜索识别
- 快速定位菜谱