Files
kitchen/docs/api/doc/API_DOC.md
Developer ceb11d9aac feat: 新增口味偏好服务和菜谱分享功能
- 新增 TastePreferenceService 用于管理用户口味偏好设置
- 实现菜谱分享功能,包括 RecipeShareService 和分享页面
- 更新平台工具类以支持鸿蒙系统检测
- 优化收藏页和农场商店页面的UI交互
- 添加新的参考文献和关于页面内容
- 更新API文档至v3.3.0版本
2026-04-18 08:29:31 +08:00

68 KiB
Raw Blame History

菜谱 API 接口文档

版本: v3.3.0
更新日期: 2026-04-18
基础地址: http://eat.wktyl.com/api/


📝 更新日志

v3.3.0 (2026-04-18)

  • 新增点餐助手接口kitchen.php 支持点单CRUD操作JSON文件存储SSE实时推送
  • 新增SSE推送端点kitchen_sse.php 实现订单实时更新推送
  • 新增菜谱分享页面recipe_share.php 扫码展示菜谱详情,支持统计和管理

v3.2.1 (2026-04-13)

  • 文档同步更新:完善发现页接口字段说明
  • 分类字段补充:添加 id 字段到分类返回结构

v3.2.0 (2026-04-12)

  • 发现页接口优化api_discover.php 多项改进
    • 去重机制:同一客户端多次请求返回不重复数据
    • 自动重置30分钟后自动重置
    • 混合分类菜谱分类60% + 食材分类40%
    • 新增字段:recipe_countingredient_countparent_name
    • 标签 count 字段修复

📁 接口文件说明

文件 说明 主要功能
api.php 主接口 列表、详情、搜索、统计、统一输出
api_action.php 动态接口 点赞、评分、浏览量
api_what_to_eat.php 智能选择 随机推荐、动态筛选
api_feed.php 信息流 推荐、热门、最新
api_filter.php 筛选接口 分类筛选、标签筛选、时段筛选
api_hot.php 热门排行 菜谱排行、食材排行
api_discover.php 发现页 随机数据、瀑布流、响应式布局
stats_full.php 全面统计 热门、在线、请求统计
api_check_duplicate.php 查重接口 菜品、食材、营养成分、内容查重
diagnose.php 诊断工具 数据库诊断、运维检查
kitchen.php 点餐助手 点单CRUD、JSON存储、过期清理
kitchen_sse.php SSE推送 订单实时更新推送
recipe_share.php 菜谱分享 扫码展示、访问统计、OG标签
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输出

评分对象结构

所有菜谱相关的接口返回数据中都包含 rating 字段,用于显示评分信息:

{
  "rating": {
    "score": 4.5,
    "nums": 128,
    "display": "4.5分 (128人评分)",
    "status": "sufficient",
    "level": "推荐",
    "star": 5
  }
}

评分字段说明:

字段 类型 说明
score float 平均评分0-5
nums int 评分总次数
display string 格式化显示文本
status string 评分状态none(暂无评分) / few(样本较少) / normal(正常) / sufficient(充足) / abnormal(异常)
level string 评分等级:优秀(≥4.5) / 推荐(≥4.0) / 一般(≥3.0) / 较差(≥2.0) / 不推荐(<2.0)
star int 星级整数用于UI显示

评分状态说明:

状态 条件 显示文本
none 评分次数为0 "暂无评分"
few 评分次数 < 3 "X.X分 (N人评分样本较少)"
normal 评分次数 3-9 "X.X分 (N人评分)"
sufficient 评分次数 ≥ 10 "X.X分 (N人评分)"
abnormal 评分不在0-5范围 "评分异常"

简化评分摘要:

部分列表接口返回简化版的评分摘要:

{
  "rating": {
    "score": 4.5,
    "nums": 128,
    "display": "4.5分",
    "star": 5
  }
}

主接口 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 搜索关键词

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=list&page=$page&cate_id=$cateId'));

📄 菜谱详情

GET api.php?act=detail&id=32892&viewnums=true

功能: 获取单个菜谱的基本信息

参数 类型 说明
id int 菜谱ID必填
viewnums string 设为"true"时增加浏览量

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=detail&id=$id'));

📱 菜谱迷你信息

GET api.php?act=mini&id=32892

功能: 获取菜谱的迷你版信息,适用于列表页、卡片展示等需要快速加载的场景

返回字段:

字段 说明 用途
id 菜谱ID 唯一标识
code 菜谱编码如CP032892 二维码生成、分享码
pic_id 原始图片ID 图片资源关联
title 菜谱标题 列表展示
intro 简介(含用餐时段) 快速预览
category 分类信息 分类筛选
category.hierarchy 分类层级 面包屑导航
allergens 过敏原汇总 过敏提醒
nutrition 营养数据 营养分析

返回示例:

{
  "code": 200,
  "message": "success",
  "data": {
    "id": 32892,
    "code": "CP32892",
    "pic_id": 7735,
    "title": "三色玉米沙拉",
    "intro": "早餐、中餐、晚餐、零食",
    "category": {
      "id": 42,
      "name": "家常菜",
      "hierarchy": [
        {"id": 11, "name": "菜谱"},
        {"id": 12, "name": "中国菜"},
        {"id": 42, "name": "家常菜"}
      ]
    },
    "allergens": ["豆", "豌豆", "蟹", "松子", "胡椒"],
    "nutrition": [
      {"name": "叶酸", "value": 170.2, "unit": "微克"},
      {"name": "镁", "value": 112.5, "unit": "毫克"}
    ]
  }
}

与 full 接口对比:

对比项 mini full
返回字段数 8个 20+个
响应大小 ~1KB ~10KB
查询时间 ~50ms ~200ms
适用场景 列表、卡片 详情页

📖 菜谱完整信息

GET api.php?act=full&id=32892

功能: 获取菜谱的完整信息,包括所有关联数据

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=full&id=$id'));

🥗 食材列表

GET api.php?act=ingredients&page=1&search=鸡蛋

功能: 获取食材列表

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=ingredients&page=$page'));

🥕 食材详情

GET api.php?act=ingredient_detail&id=1

功能: 获取单个食材的详细信息

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=ingredient_detail&id=$id'));

🔍 搜索

GET api.php?act=search&keyword=鸡蛋&type=recipe

功能: 全局搜索,支持食谱和食材

参数 说明
keyword 搜索关键词
type 搜索类型all/recipe/ingredient

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=search&keyword=${Uri.encodeComponent(keyword)}'));

📂 分类列表

GET api.php?act=categories&type=recipe

功能: 获取分类列表

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=categories&type=recipe'));

🏷️ 标签列表

GET api.php?act=tags&limit=50

功能: 获取标签列表

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=tags&limit=50'));

📊 基础统计

GET api.php?act=stats

功能: 获取基础统计数据

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=stats'));

🔎 高级查询

GET api.php?act=query&module=recipe&field=log_Title&value=鸡蛋&operator=like

功能: 高级数据库查询

操作符 说明
eq 等于
neq 不等于
like 模糊匹配
gt 大于
lt 小于
gte 大于等于
lte 小于等于

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=query&module=recipe&field=$field&value=$value'));

📦 统一格式输出(原 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 搜索关键词

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=unified_list&type=$type&page=$page'));

统一详情

GET api.php?act=unified_detail&type=recipe&id=1
GET api.php?act=unified_detail&type=ingredient&id=1

功能: 获取统一格式的详情数据

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=unified_detail&type=$type&id=$id'));

统一搜索

GET api.php?act=unified_search&type=recipe&keyword=鸡蛋

功能: 统一格式的搜索

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=unified_search&type=$type&keyword=${Uri.encodeComponent(keyword)}'));

统一热门

GET api.php?act=unified_hot&type=recipe&limit=20

功能: 获取热门列表

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api.php?act=unified_hot&type=$type&limit=$limit'));

统一字段结构

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

动态接口 api_action.php

👍 点赞

GET api_action.php?act=like&type=recipe&id=1&action=like

功能: 点赞/取消点赞

参数 说明
type 类型recipe/ingredient
id ID
action 操作like/unlike

客户端实现

await http.get(Uri.parse('$baseUrl/api_action.php?act=like&type=recipe&id=$id&action=like'));

评分

GET api_action.php?act=rate&type=recipe&id=1&score=5

功能: 提交评分1-5分不可取消每日限制30次

参数 说明
type 类型recipe/ingredient
id ID
score 评分范围1-5必填

返回字段:

字段 说明
score 用户提交的评分
rate_nums 总评分次数
rate_score 平均评分
ip_remaining 今日剩余评分次数

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_action.php?act=rate&type=recipe&id=$id&score=5'));

注意事项:

  • 每个IP每天最多评分30次
  • 评分不可取消
  • 评分后自动计算平均分

👁️ 增加浏览量

GET api_action.php?act=view&type=recipe&id=1&count=1

功能: 增加浏览量

客户端实现

await http.get(Uri.parse('$baseUrl/api_action.php?act=view&type=recipe&id=$id'));

🌐 IP状态查询

GET api_action.php?act=ip_status

功能: 查询当前IP的操作状态点赞、评分等

返回字段:

字段 说明
ip 当前IP地址
today_rate_count 今日评分次数
remaining_rate 今日剩余评分次数
daily_limit 每日评分上限

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_action.php?act=ip_status'));

智能选择 api_what_to_eat.php

🪜 获取筛选步骤

GET api_what_to_eat.php?act=filter_steps&category=13

功能: 获取当前可用的筛选选项和菜谱数量,实现逐步筛选

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_what_to_eat.php?act=filter_steps&category=$categoryId'));

应用筛选

GET api_what_to_eat.php?act=filter_apply&category=13&tag=2&count=5

功能: 应用筛选条件,返回随机菜谱

参数 说明
category 分类ID多个用逗号分隔
tag 标签ID多个用逗号分隔
count 返回数量默认5最大20

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_what_to_eat.php?act=filter_apply&category=$categoryId&count=5'));

📄 菜谱详情

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=是

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_what_to_eat.php?act=detail&code=$code'));

🎲 随机推荐

GET api_what_to_eat.php?act=filter_apply&count=1

功能: 随机推荐一个菜谱使用filter_apply接口count=1

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_what_to_eat.php?act=filter_apply&count=1'));

信息流 api_feed.php

📱 信息流

GET api_feed.php?act=feed&page=1&limit=20

功能: 获取混合信息流(推荐接口的别名)

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_feed.php?act=feed&page=$page'));

🔥 推荐信息流

GET api_feed.php?act=recommend&page=1&limit=20

功能: 混合推荐算法热门40% + 最新40% + 随机20%

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_feed.php?act=recommend&page=$page'));

📈 热门信息流

GET api_feed.php?act=hot&page=1&limit=20

功能: 按浏览量排序

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_feed.php?act=hot&page=$page'));

🆕 最新信息流

GET api_feed.php?act=latest&page=1&limit=20

功能: 按发布时间排序

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_feed.php?act=latest&page=$page'));

筛选接口 api_filter.php

📋 接口索引

GET api_filter.php?act=index

功能: 获取筛选接口所有可用端点

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_filter.php?act=index'));

🍳 食谱大类

GET api_filter.php?act=recipe_main_categories

功能: 获取食谱大类列表(中国菜、脏腑调理、人群营养等)

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_filter.php?act=recipe_main_categories'));

🍳 食谱子类

GET api_filter.php?act=recipe_sub_categories&parent_id=12

功能: 根据大类ID获取子分类列表

参数 说明
parent_id 大类ID必填

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_filter.php?act=recipe_sub_categories&parent_id=$parentId'));

| 字段 | 说明 |
|------|------|
| `parent_id` | 父分类ID |
| `parent_name` | 父分类名称 |
| `list` | 子分类列表 |

---

### 🥗 食材大类

GET api_filter.php?act=ingredient_main_categories


**功能**: 获取食材大类列表(蔬菜类、水果类、谷物类等)

**返回字段**:

| 字段 | 说明 |
|------|------|
| `id` | 分类ID |
| `name` | 分类名称 |
| `ingredient_count` | 该分类下食材数量 |

---

### 🥗 食材子类

GET api_filter.php?act=ingredient_sub_categories&parent_id=1001


**功能**: 根据大类ID获取子分类或食材列表

| 参数 | 说明 |
|------|------|
| parent_id | 大类ID必填 |

---

### 🏷️ 口味标签

GET api_filter.php?act=taste_tags&limit=20


**功能**: 获取口味标签列表(咸鲜味、甜味、酸辣味等)

| 参数 | 说明 |
|------|------|
| limit | 返回数量默认50最大100 |

---

### 🔧 工艺标签

GET api_filter.php?act=cooking_tags&limit=20


**功能**: 获取工艺标签列表(炒、煮、蒸、炸等)

| 参数 | 说明 |
|------|------|
| limit | 返回数量默认50最大100 |

---

### ⏰ 时段列表

GET api_filter.php?act=meal_times


**功能**: 获取用餐时段列表(早餐、中餐、晚餐等)

**返回字段**:

| 字段 | 说明 |
|------|------|
| `id` | 时段ID |
| `name` | 时段名称 |
| `count` | 该时段食谱数量 |

---

### 🏷️ 分类标签

GET api_filter.php?act=category_tags&category_id=13


**功能**: 获取指定分类下的口味和工艺标签

| 参数 | 说明 |
|------|------|
| category_id | 分类ID必填 |

**返回字段**:

| 字段 | 说明 |
|------|------|
| `taste_tags` | 口味标签列表 |
| `cooking_tags` | 工艺标签列表 |
| `id` | 标签ID |
| `name` | 标签名称 |
| `count` | 该标签在分类下的使用次数 |

**返回示例**:
```json
{
  "code": 200,
  "data": {
    "type": "category_tags",
    "category_id": 13,
    "taste_tags": [
      {"id": 1, "name": "咸鲜味", "count": 150},
      {"id": 4, "name": "甜味", "count": 80}
    ],
    "cooking_tags": [
      {"id": 50, "name": "炒", "count": 200},
      {"id": 59, "name": "清蒸", "count": 120}
    ]
  }
}

🔍 筛选食谱

GET api_filter.php?act=filter_recipes&main_category=12&sub_category=13,14&taste_tag=1&cooking_tag=50&meal_time=中餐&page=1

功能: 根据多条件筛选食谱,支持分类、标签、时段、营养成分、过敏原、食材、作者等

基础参数

参数 说明
main_category 大类ID
sub_category 子类ID多个用逗号分隔
category_name 分类名称(如"家常菜"与ID参数二选一
taste_tag 口味标签ID
cooking_tag 工艺标签ID
taste_name 口味名称(如"甜味"与ID参数二选一
cooking_name 工艺名称(如"炒"与ID参数二选一
meal_time 用餐时段(如"早餐"、"中餐"、"晚餐"
keyword 搜索关键词
page 页码默认1
limit 每页数量默认20最大50

高级筛选参数

参数 说明 示例
nutrition_name 营养成分名称 nutrition_name=镁
nutrition_min 营养成分最小值 nutrition_min=100
nutrition_max 营养成分最大值 nutrition_max=200
allergen 排除含该过敏原的菜品 allergen=豆
ingredient 包含该食材的菜品 ingredient=色拉酱
author_id 作者ID author_id=1

排除筛选参数

参数 说明 示例
exclude_category 排除分类ID多个用逗号分隔 exclude_category=42,43
exclude_category_name 排除分类名称 exclude_category_name=凉菜
exclude_taste 排除口味标签ID多个用逗号分隔 exclude_taste=1,2
exclude_taste_name 排除口味名称 exclude_taste_name=辣味
exclude_cooking 排除工艺标签ID多个用逗号分隔 exclude_cooking=50,51
exclude_cooking_name 排除工艺名称 exclude_cooking_name=炸
exclude_ingredient 排除含该食材的菜品 exclude_ingredient=花生
exclude_allergen 排除含该过敏原的菜品 exclude_allergen=虾
exclude_author 排除作者ID多个用逗号分隔 exclude_author=1,2
exclude_meal_time 排除用餐时段 exclude_meal_time=早餐

使用示例

# 按分类筛选
GET api_filter.php?act=filter_recipes&category_name=家常菜

# 按用餐时段筛选
GET api_filter.php?act=filter_recipes&meal_time=早餐

# 按营养成分筛选(含镁的菜品)
GET api_filter.php?act=filter_recipes&nutrition_name=镁

# 按营养成分范围筛选镁含量100-200毫克
GET api_filter.php?act=filter_recipes&nutrition_name=镁&nutrition_min=100&nutrition_max=200

# 按过敏原筛选(排除含豆的菜品)
GET api_filter.php?act=filter_recipes&allergen=豆

# 按食材筛选(含色拉酱的菜品)
GET api_filter.php?act=filter_recipes&ingredient=色拉酱

# 按作者筛选
GET api_filter.php?act=filter_recipes&author_id=1

# 按口味/工艺名称筛选
GET api_filter.php?act=filter_recipes&taste_name=甜味
GET api_filter.php?act=filter_recipes&cooking_name=拌

# 排除分类筛选(排除凉菜)
GET api_filter.php?act=filter_recipes&exclude_category_name=凉菜

# 排除口味筛选(排除辣味菜品)
GET api_filter.php?act=filter_recipes&exclude_taste_name=辣味

# 排除工艺筛选(排除油炸菜品)
GET api_filter.php?act=filter_recipes&exclude_cooking_name=炸

# 排除食材筛选(排除含花生的菜品)
GET api_filter.php?act=filter_recipes&exclude_ingredient=花生

# 排除过敏原筛选(排除含虾的菜品)
GET api_filter.php?act=filter_recipes&exclude_allergen=虾

# 排除作者筛选
GET api_filter.php?act=filter_recipes&exclude_author=1

# 排除用餐时段筛选(排除早餐)
GET api_filter.php?act=filter_recipes&exclude_meal_time=早餐

# 组合筛选
GET api_filter.php?act=filter_recipes&category_name=家常菜&meal_time=早餐&nutrition_name=叶酸

# 组合排除筛选(家常菜中排除辣味和油炸菜品)
GET api_filter.php?act=filter_recipes&category_name=家常菜&exclude_taste_name=辣味&exclude_cooking_name=炸

返回字段:

字段 说明
id 食谱唯一ID
pic_id 原始图片ID
title 食谱标题
cover 封面图
category 分类信息
statistics 统计数据
url 详情跳转URL

返回示例:

{
  "code": 200,
  "data": {
    "type": "filter_recipes",
    "filters": {
      "main_category": 0,
      "sub_category": [],
      "taste_tag": 0,
      "cooking_tag": 0,
      "meal_time": "早餐",
      "keyword": "",
      "nutrition_name": "镁",
      "nutrition_min": null,
      "nutrition_max": null,
      "allergen": "",
      "ingredient": "",
      "author_id": 0,
      "category_name": "",
      "taste_name": "",
      "cooking_name": ""
    },
    "list": [...],
    "page": 1,
    "limit": 20,
    "total": 150,
    "has_more": true
  }
}

🔍 筛选食材

GET api_filter.php?act=filter_ingredients&main_category=1001&keyword=鸡蛋&page=1

功能: 根据条件筛选食材

参数 说明
main_category 大类ID
sub_category 子类ID多个用逗号分隔
keyword 搜索关键词
page 页码默认1
limit 每页数量默认20最大50

返回字段:

字段 说明
id 食材唯一ID
name 食材名称
category 分类信息
allergen 过敏原信息
url 详情跳转URL

🍳 食材对应菜品

GET api_filter.php?act=ingredient_recipes&ingredient_id=1&page=1&limit=10

功能: 获取指定食材对应的菜品列表

参数 说明
ingredient_id 食材ID必填
page 页码默认1
limit 每页数量默认10最大20

返回字段:

字段 说明
id 食谱唯一ID
title 食谱标题
cover 封面图
category_id 分类ID
category_name 分类名称
view_count 浏览量
like_count 点赞数
url 详情跳转URL

返回示例:

{
  "code": 200,
  "data": {
    "type": "ingredient_recipes",
    "ingredient_id": 1,
    "list": [
      {
        "id": 123,
        "title": "番茄炒蛋",
        "cover": "https://...",
        "category_name": "家常菜",
        "view_count": 1000,
        "like_count": 50
      }
    ],
    "total": 25,
    "has_more": true
  }
}

🔍 全局搜索

GET api_filter.php?act=global_search&keyword=鸡蛋&type=all&limit=10

功能: 全局搜索食谱、食材、口味标签、工艺标签

参数 说明
keyword 搜索关键词(必填),支持模糊搜索
type 搜索类型:all(全部)、recipes(食谱)、ingredients(食材)、taste_tags(口味标签)、cooking_tags(工艺标签)默认all
limit 每类返回数量默认10最大20

返回字段:

字段 说明
keyword 搜索关键词
result 搜索结果对象

食谱结果字段:

字段 说明
id 食谱ID
title 食谱标题
cover 封面图
category_name 所属分类名称
view_count 浏览量
like_count 点赞数
url 详情跳转URL

食材结果字段:

字段 说明
id 食材ID
name 食材名称
category_name 所属分类名称
recipe_count 关联菜品数量
view_count 浏览量
url 详情跳转URL

标签结果字段:

字段 说明
id 标签ID
name 标签名称
type 标签类型:taste(口味)、cooking(工艺)
url 筛选跳转URL

返回示例:

{
  "code": 200,
  "data": {
    "type": "global_search",
    "keyword": "鸡蛋",
    "result": {
      "recipes": [
        {
          "id": 123,
          "title": "番茄炒鸡蛋",
          "cover": "https://...",
          "category_name": "家常菜",
          "view_count": 1000,
          "like_count": 50,
          "url": "?act=detail&id=123"
        }
      ],
      "ingredients": [
        {
          "id": 9,
          "name": "鸡蛋",
          "category_name": "蛋类",
          "recipe_count": 783,
          "view_count": 5000,
          "url": "?act=ingredient_detail&id=9"
        }
      ],
      "taste_tags": [],
      "cooking_tags": []
    }
  }
}

使用场景:

  • 首页搜索框
  • 快速查找功能
  • 智能推荐入口

热门排行 api_hot.php

🔥 热门菜谱排行

GET api_hot.php?type=recipe&sort=view&limit=20

功能: 获取热门菜谱排行榜

参数 说明
type 类型recipe(菜谱) / ingredient(食材) / all(全部)默认recipe
sort 排序view(浏览量) / like(点赞数) / rate(评分)默认view
limit 返回数量默认20最大100
cate_id 分类ID筛选可选

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_hot.php?type=recipe&sort=view&limit=20'));

🔥 热门食材排行

GET api_hot.php?type=ingredient&sort=view&limit=20

功能: 获取热门食材排行榜

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_hot.php?type=ingredient&sort=view'));

🔥 全部排行

GET api_hot.php?type=all&limit=10

功能: 同时获取菜谱和食材的热门排行

返回字段:

字段 说明
recipe_view 按浏览量排序的菜谱
recipe_like 按点赞数排序的菜谱
ingredient_view 按浏览量排序的食材

客户端实现

final response = await http.get(Uri.parse('$baseUrl/api_hot.php?type=all&limit=10'));

全面统计 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_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%匹配时提前终止

应用场景:

  • 📝 用户投稿前查重提醒
  • 🔒 防止重复内容录入
  • 📊 内容质量把控
  • 🛡️ 版权保护

发现页 api_discover.php

🎲 随机数据接口

GET api_discover.php?total=30
GET api_discover.php?recipe=8&ingredient=5&category=4&tag=6&nutrition=4&meal_time=3
GET api_discover.php?total=30&_refresh=1

功能: 获取随机数据用于首页/发现页瀑布流展示

核心特性:

  • 去重机制同一客户端多次请求返回不重复数据基于IP记录已返回ID
  • 自动重置30分钟后自动重置重新开始展示
  • 混合分类分类返回混合类型菜谱分类60% + 食材分类40%
  • 完整信息:分类包含父分类名称,标签包含实际使用次数

请求参数:

参数 类型 默认值 说明
total int 30 总数量(自动分配各类型比例)
recipe int - 菜品数量(指定后覆盖自动分配)
ingredient int - 食材数量
category int - 分类数量
tag int - 标签数量
nutrition int - 营养成分数量
meal_time int - 时段数量
_refresh int 0 强制刷新清除已返回ID记录

数量分配比例(使用 total 参数时):

类型 比例 说明
recipe 25% 菜品
ingredient 15% 食材
category 15% 分类
tag 20% 标签
nutrition 15% 营养成分
meal_time 10% 时段

返回字段:

字段 说明
recipes 随机菜品列表
ingredients 随机食材列表
categories 随机分类列表(混合类型)
tags 随机标签列表
nutrition_types 营养成分类型列表
meal_times 用餐时段列表
meta.cache_status 缓存状态fresh
meta.counts 各类型实际返回数量

菜品字段:

字段 说明
id 菜品ID
title 菜品名称
cover 封面图URL
category.id 分类ID
category.name 分类名称
rating 评分摘要
views 浏览量

食材字段:

字段 说明
id 食材ID
name 食材名称
category.id 分类ID
category.name 分类名称
allergen 过敏原数组
intro 简介截取100字

分类字段(新增):

字段 类型 说明
id int 分类ID
name string 分类名称
type string 类型recipe(菜谱分类) / ingredient(食材分类) / recipe_main(食谱大类)
recipe_count int 该分类下的菜品数量
ingredient_count int 该分类下的食材数量
count int 根据类型自动选择ingredient显示食材数recipe显示菜品数
parent_id int 父分类ID
parent_name string 父分类名称

标签字段:

字段 类型 说明
id int 标签ID
name string 标签名称
type string 类型taste(口味) / cooking(工艺)
count int 使用次数(已修复)

返回示例:

{
  "code": 200,
  "message": "success",
  "data": {
    "recipes": [
      {
        "id": 26940,
        "title": "酸菜蛇段汤",
        "cover": "http://eat.wktyl.com/api/assets/pic/1030a.jpg",
        "category": {"id": 175, "name": "汤类"},
        "rating": {"score": 0, "nums": 0, "display": "暂无评分", "star": 0},
        "views": 0
      }
    ],
    "ingredients": [
      {
        "id": 1,
        "name": "姜",
        "category": {"id": 1002, "name": "调味品类"},
        "allergen": ["姜"],
        "intro": "姜是一种常用调味品..."
      }
    ],
    "categories": [
      {
        "id": 42,
        "name": "家常菜",
        "type": "recipe",
        "recipe_count": 4581,
        "ingredient_count": 0,
        "count": 4581,
        "parent_id": 12,
        "parent_name": "中国菜"
      },
      {
        "id": 1150,
        "name": "杭椒",
        "type": "ingredient",
        "recipe_count": 0,
        "ingredient_count": 1,
        "count": 1,
        "parent_id": 1001,
        "parent_name": "蔬菜类"
      }
    ],
    "tags": [
      {"id": 1, "name": "咸鲜味", "type": "taste", "count": 12973},
      {"id": 50, "name": "炒", "type": "cooking", "count": 2053}
    ],
    "nutrition_types": [
      {"name": "蛋白质", "unit": "克"}
    ],
    "meal_times": [
      {"id": 1, "name": "中餐", "count": 481}
    ]
  },
  "meta": {
    "cache_status": "fresh",
    "counts": {"recipe": 8, "ingredient": 5, "category": 4, "tag": 6, "nutrition": 4, "meal_time": 3}
  },
  "_query_time": "45.23ms"
}

使用场景:

  • 🏠 首页/发现页瀑布流
  • 📱 响应式布局展示
  • 🎨 动态卡片生成
  • 🔄 下拉刷新加载
  • 📂 分类导航(显示父分类名称)

客户端实现:

// Flutter 示例
final response = await http.get(
  Uri.parse('$baseUrl/api_discover.php?total=30')
);
final data = json.decode(response.body)['data'];

// 显示分类卡片
Widget buildCategoryCard(Map<String, dynamic> category) {
  return Card(
    child: Column(
      children: [
        Text('${category['parent_name']} > ${category['name']}'),
        Text('${category['count']}${category['type'] == 'ingredient' ? '食材' : '菜谱'}'),
      ],
    ),
  );
}

点餐助手 kitchen.php

📋 接口索引

GET kitchen.php?act=index

功能: 获取点餐助手API所有可用端点

客户端实现:

final response = await http.get(Uri.parse('$baseUrl/kitchen.php?act=index'));

创建点单

POST kitchen.php?act=create
Content-Type: application/json
{
  "items": [{"id": "1", "name": "宫保鸡丁", "quantity": 1}],
  "tableNo": "A01",
  "peopleCount": 2
}

功能: 创建新点单

参数 类型 必填 说明
items array 菜品列表
tableNo string 桌号
peopleCount int 人数
note string 备注
type int 类型0=用户点餐1=商家推单

返回字段:

字段 说明
id 订单唯一ID自动生成
orderNo 订单号(自动生成,如 OD123456789
status 状态0=草稿1=进行中2=已完成3=已取消
createdAt 创建时间ISO 8601格式
updatedAt 更新时间
createdBy 创建者IP
recordCount 全局订单计数

客户端实现:

final response = await http.post(
  Uri.parse('$baseUrl/kitchen.php?act=create'),
  headers: {'Content-Type': 'application/json'},
  body: json.encode({
    'items': [
      {'id': '1', 'name': '宫保鸡丁', 'quantity': 1, 'price': 28.0}
    ],
    'tableNo': 'A01',
    'peopleCount': 2,
  }),
);

📄 获取点单

GET kitchen.php?act=get&id=ord_xxx

功能: 根据订单ID获取点单详情

参数 类型 必填 说明
id string 订单ID

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/kitchen.php?act=get&id=$orderId')
);

✏️ 更新点单

POST kitchen.php?act=update
Content-Type: application/json
{
  "id": "ord_xxx",
  "items": [...],
  "status": 2
}

功能: 更新现有订单(如修改菜品、更改状态)

客户端实现:

final response = await http.post(
  Uri.parse('$baseUrl/kitchen.php?act=update'),
  headers: {'Content-Type': 'application/json'},
  body: json.encode({
    'id': orderId,
    'status': 2, // 标记为已完成
  }),
);

📋 点单列表

GET kitchen.php?act=list&page=1&limit=20&status=1

功能: 获取点单列表,支持分页和状态筛选

参数 类型 说明
page int 页码默认1
limit int 每页数量默认20最大100
status int 状态筛选0=草稿1=进行中2=已完成3=已取消
type int 类型筛选0=用户点餐1=商家推单

返回字段:

字段 说明
list 订单列表
total 总记录数
page 当前页码
limit 每页数量
pages 总页数

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/kitchen.php?act=list&page=$page&limit=$limit&status=$status')
);

🗑️ 删除点单

GET kitchen.php?act=delete&id=ord_xxx

功能: 删除指定订单

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/kitchen.php?act=delete&id=$orderId')
);

🧹 清理过期数据

GET kitchen.php?act=cleanup&days=30

功能: 清理超过指定天数的订单数据

参数 类型 说明
days int 过期天数默认30

返回字段:

字段 说明
deleted_count 删除的记录数
remaining_count 剩余记录数
cutoff_date 截止日期
expire_days 过期天数设置

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/kitchen.php?act=cleanup&days=30')
);

🧨 清空全部数据

POST kitchen.php?act=clear_all&confirm=yes

功能: 清空所有点餐数据(需确认参数)

客户端实现:

final response = await http.post(
  Uri.parse('$baseUrl/kitchen.php?act=clear_all&confirm=yes')
);

📊 统计信息

GET kitchen.php?act=stats

功能: 获取点餐统计信息

返回字段:

字段 说明
total_orders 历史总订单数
today_orders 今日订单数
stored_orders 当前存储订单数
by_status 按状态分类的订单数
by_type 按类型分类的订单数

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/kitchen.php?act=stats')
);

SSE推送 kitchen_sse.php

📡 建立SSE连接

GET kitchen_sse.php?order_id=ord_xxx

功能: 建立Server-Sent Events连接实时接收订单更新推送

参数 类型 必填 说明
order_id string 监听的订单ID不传则监听全局
last_timestamp float 上次已知时间戳

事件类型:

事件 说明 数据
connected 连接成功 连接信息
order_update 订单更新 最新订单数据
order_deleted 订单删除 删除的订单ID
global_update 全局更新 时间戳信息
heartbeat 心跳包 时间戳和迭代次数
close 连接关闭 关闭原因

JavaScript 客户端实现:

const evtSource = new EventSource('kitchen_sse.php?order_id=ord_xxx');

evtSource.addEventListener('connected', (e) => {
  console.log('SSE连接已建立', JSON.parse(e.data));
});

evtSource.addEventListener('order_update', (e) => {
  const order = JSON.parse(e.data);
  console.log('订单更新:', order);
  updateOrderUI(order);
});

evtSource.addEventListener('heartbeat', (e) => {
  console.log('心跳包', JSON.parse(e.data));
});

evtSource.addEventListener('close', (e) => {
  console.log('连接关闭,准备重连');
  evtSource.close();
  setTimeout(connectSSE, 3000);
});

Dart 客户端实现:

import 'package:sse/sse_client.dart';

final client = SseClient(Uri.parse('$baseUrl/kitchen_sse.php?order_id=$orderId'));
client.messages.listen((message) {
  final data = json.decode(message);
  if (data['event'] == 'order_update') {
    updateOrderUI(data['data']);
  }
});

注意事项:

  • SSE连接最长保持2分钟超时后自动关闭
  • 客户端断开后需重新连接
  • 心跳包每10秒发送一次
  • 订单更新通过 kitchen.php 的写操作触发

菜谱分享 recipe_share.php

📱 分享页面

GET recipe_share.php?code=CP032892
GET recipe_share.php?id=32892

功能: 渲染美观的菜谱分享页面iOS风格支持深色模式

参数 类型 必填 说明
code string 二选一 菜谱编码(如 CP032892
id int 二选一 菜谱ID

页面特性:

  • 🎨 iOS风格设计深色模式自适应
  • 📊 自动记录访问统计
  • 🏷️ OG标签支持微信/社交媒体分享预览)
  • 📱 响应式设计,移动端适配

客户端实现:

// 生成分享链接
String generateShareLink(Recipe recipe) {
  if (recipe.code != null) {
    return '$baseUrl/recipe_share.php?code=${recipe.code}';
  }
  return '$baseUrl/recipe_share.php?id=${recipe.id}';
}

// 在WebView中打开
WebView(
  initialUrl: generateShareLink(recipe),
);

📊 分享统计

GET recipe_share.php?act=stats

功能: 获取菜谱分享的访问统计

返回字段:

字段 说明
total_views 总访问量
today_views 今日访问量
today_date 统计日期
recipes 各菜谱访问统计按菜谱ID分组

返回示例:

{
  "code": 200,
  "data": {
    "total_views": 1250,
    "today_views": 85,
    "today_date": "2026-04-18",
    "recipes": {
      "r_32892": {
        "id": 32892,
        "title": "三色玉米沙拉",
        "code": "CP032892",
        "views": 120,
        "first_access": "2026-04-15T10:30:00+08:00",
        "last_access": "2026-04-18T14:20:00+08:00"
      }
    }
  }
}

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/recipe_share.php?act=stats')
);

📝 访问日志

GET recipe_share.php?act=log&page=1&limit=20

功能: 获取分享访问日志保留最近200条

参数 类型 说明
page int 页码默认1
limit int 每页数量默认20最大50

返回字段:

字段 说明
list 日志列表
total 总日志数
page 当前页码
limit 每页数量

日志字段:

字段 说明
time 访问时间
recipe_id 菜谱ID
title 菜谱标题
code 菜谱编码
ip 访问者IP
ua 用户代理
referer 来源页面

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/recipe_share.php?act=log&page=$page&limit=$limit')
);

🔌 JSON数据接口

GET recipe_share.php?act=api&code=CP032892
GET recipe_share.php?act=api&id=32892

功能: 返回菜谱JSON数据通过调用 api.php 获取,不直接查数据库)

客户端实现:

final response = await http.get(
  Uri.parse('$baseUrl/recipe_share.php?act=api&code=$code')
);

📖 接口说明

GET recipe_share.php?act=index

功能: 获取菜谱分享API所有可用端点


功能扩展指南

本章节详细介绍每个接口返回字段的具体用途、应用场景和可实现的功能。


🍽️ 场景一:用餐时段推荐

字段说明

intro 字段包含菜谱适用的用餐时段信息:

{
  "intro": "早餐、中餐、晚餐"
}

常见值:

  • "早餐" - 适合早餐食用
  • "中餐" - 适合午餐食用
  • "晚餐" - 适合晚餐食用
  • "早餐、中餐、晚餐" - 全天适用
  • "零食" - 适合零食/下午茶

可实现功能

功能 说明 实现方式
🌅 早餐推荐 根据时段推荐适合早餐的菜谱 筛选 intro 包含"早餐"
🍱 午餐推荐 根据时段推荐适合午餐的菜谱 筛选 intro 包含"中餐"
🌙 晚餐推荐 根据时段推荐适合晚餐的菜谱 筛选 intro 包含"晚餐"
智能时段 根据当前时间自动推荐 判断当前时段后筛选
📅 每日菜单 生成一日三餐菜单 分别获取早中晚餐菜谱

实现代码示例

// 根据当前时间智能推荐
fetch(`api.php?act=search&keyword=${mealType}`);

🥗 场景二:健康饮食管理

字段说明

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

{
  "allergens": ["海鲜", "花生"],
  "nutrition": [
    {"name": "热量", "value": 350, "unit": "kcal"},
    {"name": "蛋白质", "value": 25, "unit": "g"},
    {"name": "脂肪", "value": 15, "unit": "g"},
    {"name": "碳水化合物", "value": 30, "unit": "g"}
  ]
}

可实现功能

功能 说明 应用场景
⚠️ 过敏原警示 显示菜谱含有的过敏原 用户查看菜谱详情时提醒
🚫 过敏原过滤 排除含特定过敏原的菜谱 用户设置过敏原后自动过滤
📊 营养计算 计算菜谱营养成分 健康饮食、减肥餐规划
🔥 热量统计 统计每日摄入热量 减肥/健身用户热量管理
📈 营养分析 分析营养均衡度 营养师、健康管理App
💪 健身餐推荐 推荐高蛋白低脂菜谱 健身人群饮食规划
🏥 特殊饮食 糖尿病/高血压饮食推荐 医疗健康场景

实现代码示例

// 过敏原检查
const warnings = userAllergens.filter(a => recipe.allergens?.includes(a));

📱 场景三:社交分享功能

字段说明

codestatistics 字段用于社交分享:

{
  "id": 32892,
  "code": "CP032892",
  "title": "宫保鸡丁",
  "statistics": {
    "view_count": 1000,
    "like_count": 50,
    "recommend_count": 30
  }
}

可实现功能

功能 说明 应用场景
🔗 分享链接 生成唯一分享链接 微信/微博分享
📱 二维码 生成菜谱二维码 线下分享、海报
🔢 菜谱编码 短编码便于传播 口口相传、搜索
🔥 热度展示 显示浏览/点赞数 吸引用户点击
📊 排行榜 热门菜谱排行 发现优质内容
👍 点赞互动 用户点赞功能 社交互动
评分系统 五星推荐评分 用户评价体系

实现代码示例

// 生成分享链接
const shareLink = `https://eat.wktyl.com/recipe/${recipe.code}`;

🛒 场景四:购物清单功能

字段说明

ingredients 字段包含完整食材信息:

{
  "ingredients": {
    "main": [
      {"name": "鸡肉", "amount": "500", "unit": "克"}
    ],
    "auxiliary": [
      {"name": "青椒", "amount": "2", "unit": "个"},
      {"name": "红椒", "amount": "1", "unit": "个"}
    ],
    "seasoning": [
      {"name": "生抽", "amount": "2", "unit": "勺"},
      {"name": "盐", "amount": "适量", "unit": ""}
    ]
  }
}

可实现功能

功能 说明 应用场景
📝 生成清单 一键生成购物清单 准备做饭前
合并清单 多个菜谱合并购物清单 一次采购多道菜
打勾确认 购物时逐项确认 超市购物
📤 分享清单 分享给家人采购 家庭协作
🏪 智能分类 按食材类型/超市区域分类 提高购物效率
💰 预算估算 估算食材成本 家庭理财
🔄 常备食材 标记家中已有食材 避免重复购买

实现代码示例

// 生成购物清单
const items = [...recipe.ingredients.main, ...recipe.ingredients.auxiliary, ...recipe.ingredients.seasoning];

📊 场景五:数据分析与运营

字段说明

统计接口返回的数据:

{
  "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请求量 运维监控大屏
👥 在线人数 显示当前在线用户 社交氛围营造
🔥 热门趋势 分析热门菜谱趋势 内容运营
📅 日报/周报 自动生成运营报告 运营分析
🎯 用户画像 分析用户偏好 精准推荐
📱 平台分析 分析各平台使用情况 产品决策
性能优化 分析接口响应时间 技术优化

实现代码示例

// 构建运营数据大屏
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')]);

🎯 场景六:智能推荐系统

字段说明

综合使用多个字段实现智能推荐:

{
  "category": {"id": 11, "name": "家常菜"},
  "tags": [{"id": 2, "name": "原本味"}, {"id": 30, "name": "咖喱味"}],
  "statistics": {"view_count": 1000, "like_count": 50},
  "meta": {
    "process": "炒",
    "taste": "香辣",
    "difficulty": "简单",
    "time": "30分钟"
  }
}

可实现功能

功能 说明 应用场景
🎲 随机推荐 随机推荐菜谱 "今天吃什么"
🏷️ 标签推荐 根据标签推荐 口味偏好推荐
📂 分类推荐 根据分类推荐 菜系偏好推荐
⏱️ 时间推荐 根据烹饪时间推荐 快手菜推荐
📊 热度推荐 根据热度推荐 发现优质内容
👤 个性化推荐 基于用户历史推荐 千人千面
🔄 相似推荐 推荐相似菜谱 详情页相关推荐

实现代码示例

// 智能推荐
const response = await fetch(`api_what_to_eat.php?act=filter_apply&category=${categoryId}&count=5`);

📝 场景七:菜谱内容展示

字段说明

content 字段包含菜谱详细步骤:

{
  "content": "<p>1.将白菜顺切成宽1.5厘米...</p><p>2.将勺置火上加入清水...</p>",
  "intro": "早餐、中餐、晚餐",
  "meta": {
    "process": "炒",
    "taste": "香辣",
    "difficulty": "简单"
  }
}

可实现功能

功能 说明 应用场景
📖 步骤解析 解析烹饪步骤 详情页展示
🔢 步骤编号 自动编号步骤 用户操作引导
时间提示 提取步骤中的时间 计时器功能
🎙️ 语音播报 语音朗读步骤 做饭时解放双手
📸 步骤图片 提取步骤配图 图文教程
🖨️ 打印菜谱 生成可打印版本 纸质菜谱
📤 导出分享 导出为文本/图片 社交分享

实现代码示例

// 解析步骤
const steps = content.replace(/<[^>]+>/g, '').split(/[1-9][.、]/).filter(s => s.trim());

🔍 场景八:搜索与发现

字段说明

搜索相关字段:

{
  "title": "宫保鸡丁",
  "intro": "中餐、晚餐",
  "category": {"id": 11, "name": "家常菜"},
  "tags": [{"id": 2, "name": "原本味"}]
}

可实现功能

功能 说明 应用场景
🔎 关键词搜索 按菜名/食材搜索 快速查找
🏷️ 标签搜索 按标签筛选 口味筛选
📂 分类浏览 按分类浏览 菜系浏览
📜 搜索历史 记录搜索历史 快速重搜
🔥 热门搜索 显示热门关键词 发现内容
💡 搜索建议 输入时提供建议 提升体验
🎤 语音搜索 语音输入搜索 解放双手

实现代码示例

// 搜索建议
const response = await fetch(`api.php?act=search&keyword=${keyword}&limit=5`);

📋 字段功能速查表

字段 可实现功能 推荐接口
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 times = await fetch('http://eat.wktyl.com/api/assets/eating_times.json').then(r => r.json());
const recipes = await fetch(`api.php?act=search&keyword=${times.standard_times[0].name}`);
  1. 智能时段推荐
const mealType = hour < 10 ? '早餐' : (hour > 17 ? '晚餐' : '中餐');
const recipes = await fetch(`api.php?act=search&keyword=${mealType}`);

应用场景:

  • 🕐 智能时段推荐:根据当前时间自动推荐适合的菜谱
  • 📅 每日菜单规划:生成早中晚餐完整菜单
  • 🏥 药膳管理:根据食用频率规划药膳食谱
  • 📊 时段统计分析:分析不同时段的菜谱分布

🥗 营养成分数据

文件地址: 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 types = await fetch('http://eat.wktyl.com/api/assets/nutrition_types.json').then(r => r.json());
const recipe = await fetch('api.php?act=full&id=32892').then(r => r.json());
  1. 营养目标追踪
const contribution = recipe.nutrition.map(n => ({name: n.name, value: n.value, percentage: (n.value / goal.target * 100).toFixed(1) + '%'}));

应用场景:

  • 📊 营养分析:计算菜谱营养成分及占比
  • 🎯 营养目标:追踪每日营养摄入目标
  • 🏋️ 健身餐规划:高蛋白、低碳水化合物菜谱推荐
  • 🏥 健康管理:糖尿病、高血压等特殊饮食规划
  • 👶 孕期营养:叶酸、铁、钙等关键营养素追踪

⚠️ 过敏原数据

文件地址: 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 allergens = await fetch('http://eat.wktyl.com/api/assets/gmy.json').then(r => r.json());
const hasAllergen = item.allergens.some(a => userAllergens.includes(a));
  1. 菜谱过敏原过滤
const recipe = await fetch('api.php?act=full&id=32892').then(r => r.json());
const warnings = recipe.ingredients.filter(ing => checkAllergen(ing.name, userAllergens));

应用场景:

  • ⚠️ 过敏原警示:用户查看菜谱时显示过敏原提醒
  • 🚫 智能过滤:自动过滤含用户过敏原的菜谱
  • 🔄 食材替代:推荐不含过敏原的替代食材
  • 📋 过敏原报告:生成菜谱过敏原分析报告
  • 👶 儿童饮食:儿童常见过敏原特殊处理
  • 🏥 医疗饮食:为特殊人群定制安全食谱

🔗 数据文件与API协同使用

完整工作流程:

// 初始化:并行加载基础数据
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())
]);

最佳实践:

  1. 数据缓存策略
// 本地缓存基础数据,减少网络请求
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

用途:

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

缓存管理 cache_manage.php

运维工具接口,用于缓存管理和监控。

📊 缓存统计

GET cache_manage.php?action=stats

功能: 获取缓存统计数据

返回字段:

字段 说明
total_files 缓存文件总数
total_size 缓存总大小
expired_files 过期文件数

客户端实现

final response = await http.get(Uri.parse('$baseUrl/cache_manage.php?action=stats'));

🧹 清理过期缓存

GET cache_manage.php?action=clean

功能: 清理过期的缓存文件

客户端实现

await http.get(Uri.parse('$baseUrl/cache_manage.php?action=clean'));

🗑️ 清除缓存

GET cache_manage.php?action=clear
GET cache_manage.php?action=clear&act=list

功能: 清除所有缓存或指定接口的缓存

参数 说明
act 可选,指定要清除的接口名称

客户端实现

await http.get(Uri.parse('$baseUrl/cache_manage.php?action=clear'));

⚙️ 缓存配置

GET cache_manage.php?action=config

功能: 获取缓存配置信息

返回字段:

字段 说明
ttl_config 各接口缓存时间配置
auto_clean 自动清理策略

客户端实现

final response = await http.get(Uri.parse('$baseUrl/cache_manage.php?action=config'));