- 新增 TastePreferenceService 用于管理用户口味偏好设置 - 实现菜谱分享功能,包括 RecipeShareService 和分享页面 - 更新平台工具类以支持鸿蒙系统检测 - 优化收藏页和农场商店页面的UI交互 - 添加新的参考文献和关于页面内容 - 更新API文档至v3.3.0版本
68 KiB
菜谱 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_count、ingredient_count、parent_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 |
响应格式 | 工具类 |
目录
- 快速开始
- 响应格式
- 主接口 api.php
- 动态接口 api_action.php
- 智能选择 api_what_to_eat.php
- 信息流 api_feed.php
- 筛选接口 api_filter.php
- 热门排行 api_hot.php
- 全面统计 stats_full.php
- 查重接口 api_check_duplicate.php
- 发现页 api_discover.php
- 点餐助手 kitchen.php
- SSE推送 kitchen_sse.php
- 菜谱分享 recipe_share.php
- 功能扩展指南
- 错误处理
快速开始
请求方式
支持 GET 和 POST 两种方式:
GET api.php?act=list&page=1
POST api.php
Content-Type: application/json
{"act": "list", "page": 1}
响应格式
支持格式
| 格式 | 参数 | 大小节省 | 推荐场景 |
|---|---|---|---|
| JSON | _format=json |
基准 | 调试开发 |
| Gzip | _format=gzip |
75%+ | 移动网络 |
| MessagePack | _format=msgpack |
35% | 高速网络 |
响应结构
{
"code": 200,
"message": "success",
"data": { ... },
"_cached": false,
"_query_time": "15.23ms"
}
缓存控制
| 参数 | 说明 |
|---|---|
_refresh=1 |
强制刷新缓存 |
_stale=1 |
允许返回过期缓存 |
_pretty=1 |
格式化JSON输出 |
评分对象结构
所有菜谱相关的接口返回数据中都包含 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}`);
🥗 场景二:健康饮食管理
字段说明
allergens 和 nutrition 字段用于健康饮食管理:
{
"allergens": ["海鲜", "花生"],
"nutrition": [
{"name": "热量", "value": 350, "unit": "kcal"},
{"name": "蛋白质", "value": 25, "unit": "g"},
{"name": "脂肪", "value": 15, "unit": "g"},
{"name": "碳水化合物", "value": 30, "unit": "g"}
]
}
可实现功能
| 功能 | 说明 | 应用场景 |
|---|---|---|
| ⚠️ 过敏原警示 | 显示菜谱含有的过敏原 | 用户查看菜谱详情时提醒 |
| 🚫 过敏原过滤 | 排除含特定过敏原的菜谱 | 用户设置过敏原后自动过滤 |
| 📊 营养计算 | 计算菜谱营养成分 | 健康饮食、减肥餐规划 |
| 🔥 热量统计 | 统计每日摄入热量 | 减肥/健身用户热量管理 |
| 📈 营养分析 | 分析营养均衡度 | 营养师、健康管理App |
| 💪 健身餐推荐 | 推荐高蛋白低脂菜谱 | 健身人群饮食规划 |
| 🏥 特殊饮食 | 糖尿病/高血压饮食推荐 | 医疗健康场景 |
实现代码示例
// 过敏原检查
const warnings = userAllergens.filter(a => recipe.allergens?.includes(a));
📱 场景三:社交分享功能
字段说明
code 和 statistics 字段用于社交分享:
{
"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使用:
- 时段筛选功能
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}`);
- 智能时段推荐
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使用:
- 营养分析功能
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());
- 营养目标追踪
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使用:
- 过敏原检查
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));
- 菜谱过敏原过滤
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())
]);
最佳实践:
- 数据缓存策略
// 本地缓存基础数据,减少网络请求
const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24小时
async function getBaseData() {
const cached = localStorage.getItem(CACHE_KEY);
if (cached) {
const { data, timestamp } = JSON.parse(cached);
if (Date.now() - timestamp < CACHE_DURATION) {
return data;
}
}
const data = await initializeApp();
localStorage.setItem(CACHE_KEY, JSON.stringify({
data,
timestamp: Date.now()
}));
return data;
}
- 增量更新
// 定期检查数据更新
async function checkForUpdates() {
const response = await fetch('http://eat.wktyl.com/api/assets/version.json');
const { version } = await response.json();
const currentVersion = localStorage.getItem('data_version');
if (version !== currentVersion) {
localStorage.clear();
await getBaseData();
localStorage.setItem('data_version', version);
}
}
过敏原类型
| 类型 | 说明 |
|---|---|
| seafood | 海鲜 |
| nuts | 坚果 |
| dairy | 乳制品 |
| egg | 蛋类 |
| gluten | 麸质 |
| soy | 大豆 |
| peanut | 花生 |
菜谱编码格式
格式:CP + 6位数字
示例:CP032892 对应 ID 32892
用途:
- 唯一标识分享
- 二维码生成
- 语音搜索识别
- 快速定位菜谱
缓存管理 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'));