Files
wushu/lib/services/API_DOCUMENTATION.md
2026-03-30 02:35:31 +08:00

412 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 诗词API接口文档
## 概述
本文档描述了诗词应用的所有API接口包括诗词推荐、搜索、点赞、统计等功能。
**基础URL**: `https://yy.vogov.cn/api/`
---
## 1. 诗词推荐接口 (`/pms.php`)
### 接口说明
提供诗词随机推荐、获取指定站点信息及点赞功能,支持朝代、标签多条件筛选。
**请求方式**: GET / POST 均可
**重要**: 只要接口成功返回 `data` 字段,即会自动增加该站点的浏览次数(日、月、总)。
### 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|
| `lid` | int | 否 | 点赞ID。传入时直接对该站点执行点赞/取消点赞,返回更新后的信息,并增加浏览次数统计。此时忽略其他所有参数。 |
| `id` | int | 否 | 站点ID。返回该站点的完整信息不点赞可与 `like` 组合实现同时点赞。 |
| `like` | 标志 | 否 | 无值参数。若存在,则对本次请求返回的站点(通过 `id` 指定或随机推荐)执行点赞/取消点赞。可与 `id``dyn``tag` 组合。 |
| `dyn` | string | 否 | 朝代,多个用英文逗号分隔,例如 `宋代,唐代`。条件为"或",即满足任一朝代。 |
| `tag` | string | 否 | 标签,多个用英文逗号分隔,例如 `友情,柳树`。条件为"或",即满足任一标签。 |
### 优先级说明
- `lid` > `id` > 随机推荐。若同时提供 `lid``like``like` 无效(以 `lid` 为准)。
- 若不提供任何参数,则从全站随机返回一条。
- 若同时提供 `dyn``tag`,则取交集(必须同时满足朝代和标签条件)。
### 返回格式
始终返回 JSON 格式,包含以下字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| `code` | int | 状态码0 成功非0 失败 |
| `msg` | string | 提示信息(如"点赞成功"、"取消点赞"等) |
| `data` | object | 站点完整信息 |
### data 对象字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | int | 站点ID |
| `name` | string | 诗词名称/诗句 |
| `alias` | string | 朝代 |
| `keywords` | string | 标签(多个用逗号分隔) |
| `introduce` | string | 译文/介绍 |
| `drtime` | string | 原文 |
| `like` | int | 点赞数 |
| `url` | string | 诗人和<标题> |
| `tui` | int | 是否推荐1是0否 |
| `star` | int | 星级 |
| `hits_total` | int | 总浏览数 |
| `hits_month` | int | 月浏览数 |
| `hits_day` | int | 日浏览数 |
| `date` | string | 最后统计日期Y-m-d |
| `datem` | string | 最后统计月份Y-m |
| `time` | string | 收录时间 |
| `create_time` | string | 创建时间 |
| `update_time` | string | 更新时间 |
| …… | | 其他数据库字段均返回 |
### 示例请求
#### 1. 随机推荐(无参数)
```
GET /pms.php
```
#### 2. 随机推荐并点赞
```
GET /pms.php?like
```
#### 3. 获取指定站点信息id=5
```
GET /pms.php?id=5
```
#### 4. 获取指定站点信息并点赞id=5 且 like
```
GET /pms.php?id=5&like
```
#### 5. 按朝代筛选(宋代或唐代)并随机推荐
```
GET /pms.php?dyn=宋代,唐代
```
#### 6. 按朝代筛选并点赞like 标志)
```
GET /pms.php?like&dyn=宋代
```
#### 7. 按标签筛选(友情)并点赞
```
GET /pms.php?like&tag=友情
```
#### 8. 同时筛选(朝代=宋代 且 标签=友情)并点赞
```
GET /pms.php?like&dyn=宋代&tag=友情
```
#### 9. 直接点赞指定站点lid=5
```
POST /pms.php?lid=5
```
### 返回示例
```json
{
"code": 0,
"msg": "点赞成功",
"data": {
"id": 15572,
"name": "良将不怯死以苟免,烈士不毁节以求生",
"alias": "暂无朝代",
"keywords": "三国志",
"introduce": "优秀的将领不会畏惧死亡而苟且偷生,忠烈之士不会毁坏名节而求得生存。",
"drtime": "(赏析)此句强调了人的尊严和信仰是不能被牺牲和放弃...",
"like": 1,
"tui": 0,
"star": 4,
"hits_total": 156,
"hits_month": 12,
"hits_day": 3,
"date": "2026-03-21",
"datem": "2026-03",
"create_time": "2026-03-13 06:38:24",
"update_time": "2026-03-13 21:03:58"
}
}
```
### 注意事项
1. **浏览次数统计**:只要接口成功返回 data该站点的日、月、总浏览次数均会 +1。
2. **朝代对应**:数据库字段 alias标签对应 keywords支持模糊匹配
3. **多个值分隔**:用英文逗号分隔,不要混用中文逗号。
4. **点赞/取消点赞**:基于 IP 进行限制,同一 IP 对同一站点切换状态。
5. **like 是无值参数**:只需在 URL 中包含 &like 或 ?like 即可,无需赋值。
6. **频率限制**:每个 IP 每秒最多请求 2 次,超出将返回 `{"code":429, "msg":"请求过于频繁,请稍后再试"}`
7. **接口未做严格的频率限制**,但建议合理调用。
---
## 2. 搜索接口 (`/searchs.php`)
**Flutter 客户端**`lib/utils/http/poetry_api.dart``PoetryApi.searchPoetry` 已对接本接口;全站搜索 UI 为 `lib/views/active/active_search_page.dart`
### 接口说明
提供诗词内容搜索功能,支持模糊搜索和精确搜索,多关键字搜索,以及自定义搜索字段。
**请求方式**: GET / POST 均可
### 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|
| `q` | string | 否 | 搜索关键词 |
| `field` | string | 否 | 搜索字段name(标题), keywords(标签), introduce(译文) |
| `page` | int | 否 | 页码默认1 |
| `limit` | int | 否 | 每页数量默认20 |
### 返回格式
```json
{
"code": 0,
"msg": "搜索成功",
"data": {
"total": 156,
"page": 1,
"limit": 20,
"list": [
{
"id": 123,
"name": "诗词标题",
"alias": "唐代",
"keywords": "友情,离别",
"introduce": "译文内容...",
"like": 25,
"hits_total": 1024
}
]
}
}
```
### 示例请求
#### 1. 基础搜索
```
GET /searchs.php?q=李白
```
#### 2. 按标题搜索
```
GET /searchs.php?q=李白&field=name
```
#### 3. 分页搜索
```
GET /searchs.php?q=爱情&page=2&limit=10
```
---
## 3. 朝代列表接口 (`/dyn.php`)
### 接口说明
获取所有可用的朝代列表。
**请求方式**: GET
### 返回格式
```json
{
"code": 0,
"msg": "success",
"data": {
"total": 8,
"dynasties": [
"先秦",
"汉代",
"唐代",
"宋代",
"元代",
"明代",
"清代",
"暂无朝代"
]
}
}
```
---
## 4. 排行榜接口 (`/apilist.php`)
### 接口说明
获取诗词排行榜信息,包括点赞排行、浏览排行等。
**请求方式**: GET
### 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|
| `type` | string | 否 | 排行类型like(点赞), hits(浏览) |
| `period` | string | 否 | 时间周期day(日), month(月), total(总) |
| `limit` | int | 否 | 返回数量默认10 |
### 返回格式
```json
{
"code": 0,
"msg": "success",
"data": {
"top_like": [
{"id": 123, "name": "诗词标题", "like": 156}
],
"top_hits_day": [
{"id": 456, "name": "诗词标题", "hits_day": 89}
],
"top_hits_month": [
{"id": 789, "name": "诗词标题", "hits_month": 456}
],
"top_hits_total": [
{"id": 101, "name": "诗词标题", "hits_total": 2341}
]
}
}
```
---
## 5. 网站统计接口 (`/stat.php`)
### 接口说明
获取网站整体统计信息。
**请求方式**: GET
### 返回格式
```json
{
"code": 0,
"msg": "网站统计",
"data": {
"build_time": "2026-03-13 06:38:24",
"category": 25,
"site": 1568,
"apply": 45,
"apply_reject": 12,
"article": 89,
"article_category": 8,
"notice": 6,
"link": 23,
"top_hits_day": [
{"id": 123, "name": "诗词标题", "hits_day": 156}
],
"top_hits_month": [
{"id": 456, "name": "诗词标题", "hits_month": 892}
],
"top_hits_total": [
{"id": 789, "name": "诗词标题", "hits_total": 3456}
],
"top_like": [
{"id": 101, "name": "诗词标题", "like": 234}
]
}
}
```
---
## 通用说明
### 错误码
| 错误码 | 说明 |
|------|------|
| 0 | 成功 |
| -1 | 数据不存在或参数错误 |
| 429 | 请求过于频繁 |
| 500 | 服务器内部错误 |
### 通用响应格式
所有接口都遵循统一的响应格式:
```json
{
"code": 0, // 状态码
"msg": "success", // 提示信息
"data": {} // 具体数据,成功时返回
}
```
### 开发建议
1. **错误处理**:检查 `code` 字段非0时处理错误信息
2. **频率控制**避免短时间内大量请求建议每秒不超过2次
3. **缓存策略**:对于不常变化的数据(如朝代列表),建议本地缓存
4. **分页处理**:搜索接口支持分页,合理设置每页数量
5. **字段验证**:传入参数前进行基本验证
---
## Flutter客户端使用示例
### 使用HttpClient
```dart
import 'package:your_app/utils/http/http_client.dart';
import 'package:your_app/utils/http/poetry_api.dart';
// 获取随机诗词
try {
final response = await PoetryApi.getRandomPoetry();
print('诗词标题: ${response.data?.name}');
print('朝代: ${response.data?.alias}');
} catch (e) {
print('获取失败: $e');
}
// 按朝代获取
final response = await PoetryApi.getRandomPoetry(dynasty: '唐代');
// 搜索诗词
final searchResponse = await PoetryApi.searchPoetry('李白');
// 点赞
if (poetryData?.id != null) {
await PoetryApi.toggleLike(poetryData!.id);
}
```
### 网络权限配置
确保在 `AndroidManifest.xml``module.json5` 中配置了网络权限:
**Android**:
```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```
**鸿蒙**:
```json
"requestPermissions": [
{"name": "ohos.permission.INTERNET"},
{"name": "ohos.permission.GET_NETWORK_INFO"}
]
```
---
*最后更新时间: 2026-03-21*
*API版本: v1.0*