Files
kitchen/docs/api/doc/API_DOC.md
2026-04-11 07:07:13 +08:00

52 KiB
Raw Blame History

菜谱 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 响应格式 工具类

目录


快速开始

请求方式

支持 GETPOST 两种方式:

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 };
}

🥗 场景二:健康饮食管理

字段说明

allergensnutrition 字段用于健康饮食管理:

{
  "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;
  });
}

📱 场景三:社交分享功能

字段说明

codestatistics 字段用于社交分享:

{
  "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使用:

  1. 时段筛选功能
// 获取用餐时段列表
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}`);
  1. 智能时段推荐
// 根据当前时间自动推荐
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}`);
  }
}
  1. 用餐时段选择器
// 构建时段选择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使用:

  1. 营养分析功能
// 获取营养成分类型
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;
  }
});
  1. 营养目标追踪
// 用户设置营养目标
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;
}
  1. 营养筛选器
// 构建营养筛选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使用:

  1. 过敏原检查
// 获取过敏原数据
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 };
}
  1. 菜谱过敏原过滤
// 获取菜谱详情
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
  };
}
  1. 过敏原设置界面
// 构建过敏原选择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)
  }));
}
  1. 智能替代推荐
// 为含过敏原食材推荐替代品
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)
  };
}

最佳实践:

  1. 数据缓存策略
// 本地缓存基础数据,减少网络请求
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;
}
  1. 增量更新
// 定期检查数据更新
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

用途:

  • 唯一标识分享
  • 二维码生成
  • 语音搜索识别
  • 快速定位菜谱