# 菜谱 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": "
1.将白菜顺切成宽1.5厘米...
2.将勺置火上加入清水...
", "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` **用途**: - 唯一标识分享 - 二维码生成 - 语音搜索识别 - 快速定位菜谱