Skip to content

API Reference

one-ea edited this page Apr 25, 2026 · 3 revisions

📡 API 参考

Monolith 后端为纯 REST + JSON,全部路径以 /api 前缀。前端 Pages Functions 已在生产环境同源代理。


通用约定

认证

后台路由需在请求头携带 JWT:

Authorization: Bearer <token>

Token 通过 POST /api/auth/login 获取,默认有效期 8 小时。

内容类型

Content-Type: application/json

文件上传使用 multipart/form-data

通用响应

// 成功
200/201 OK
{ "data": ... } 或直接对象

// 错误
4xx/5xx
{ "error": "message" }

分页

GET /api/posts?page=1&pageSize=10

返回包含 total / page / pageSize 字段。


健康检查

GET /api/health

公开。返回服务状态。

{ "status": "ok", "timestamp": "2026-04-25T00:00:00Z" }

认证 (/api/auth/*)

POST /api/auth/login

公开。限流 5 次/15 分钟。

// Request
{ "password": "your-admin-password" }

// Response
{ "token": "eyJhbGciOi...", "expiresAt": "2026-04-25T08:00:00Z" }

POST /api/auth/logout

需鉴权。撤销当前 token(加入黑名单直到过期)。

GET /api/auth/me

需鉴权。返回当前会话信息。


公开 — 文章 (/api/posts/*)

GET /api/posts

列表。支持过滤参数:

参数 类型 说明
page int 页码,默认 1
pageSize int 每页数量,默认 10,最大 50
category string 按分类 slug 过滤
tag string 按标签过滤
series string 按系列 slug 过滤
q string 全文搜索

GET /api/posts/:slug

文章详情。自动递增 viewCount(异步)。

GET /api/posts/:slug/related

相关文章推荐(基于分类/标签)。

POST /api/posts/:slug/reactions

提交反应。限流,使用 IP+UA+REACTION_SALT 指纹去重。

{ "type": "heart" }  // heart / like / wow / sad / angry

GET /api/posts/:slug/reactions

获取反应统计。

{ "heart": 12, "like": 5, "wow": 2 }

公开 — 评论 (/api/comments/*)

GET /api/posts/:slug/comments

文章评论列表(已审核)。

POST /api/posts/:slug/comments

提交评论。限流。匿名邮箱后台不可见(隐私加固)。

{
  "author": "匿名",
  "email": "optional@example.com",
  "content": "**Markdown** 支持"
}

公开 — 分类与系列

GET /api/categories

全部分类。

GET /api/categories/:slug

分类详情含文章列表。

GET /api/series

全部系列(合集)。

GET /api/series/:slug

系列详情含按顺序排列的文章。


公开 — 静态页

GET /api/pages/:slug

静态页(如 /about/privacy)。


公开 — RSS / Sitemap

GET /rss.xml

RSS 2.0 订阅源。边缘缓存 5 分钟。

GET /sitemap.xml

站点地图。包含全部已发布文章 + 静态页。


后台 — 文章管理 (/api/admin/posts/*)

全部需 Authorization: Bearer <token>

GET /api/admin/posts

管理后台文章列表(含草稿/计划发布)。

POST /api/admin/posts

创建文章。

{
  "slug": "hello-world",
  "title": "你好世界",
  "content": "Markdown 内容",
  "status": "draft",       // draft | scheduled | published
  "publishAt": null,        // ISO 8601, 仅 scheduled
  "categoryIds": [1, 2],
  "tagIds": [3],
  "seriesId": null,
  "isPinned": false
}

GET /api/admin/posts/:slug

含完整字段(草稿/计划/统计数据)。

PUT /api/admin/posts/:slug

更新。自动创建版本快照(用于历史回滚)。

DELETE /api/admin/posts/:slug

软删除。

POST /api/admin/posts/:slug/restore

从软删除恢复。

GET /api/admin/posts/:slug/versions

历史版本列表。

POST /api/admin/posts/:slug/versions/:versionId/restore

恢复到指定版本。

POST /api/admin/posts/:slug/localize-images

抓取文章中的远程图片,下载到 R2 并替换 URL(防外链失效)。


后台 — 批量操作

POST /api/admin/posts/batch

{
  "action": "publish",  // publish | unpublish | delete | pin | unpin
  "slugs": ["hello", "world"]
}

POST /api/admin/import

批量导入。Body 为统一的 ImportPayload 格式(前端 importer 输出)。

{
  "posts": [...],
  "categories": [...],
  "tags": [...],
  "attachments": [...]
}

支持来源: WordPress / Ghost / Hexo / Hugo / Jekyll / Halo。


后台 — 分类 / 标签 / 系列

GET / POST / PUT / DELETE /api/admin/categories[/:id]

分类 CRUD。

GET / POST / PUT / DELETE /api/admin/tags[/:id]

标签 CRUD。

GET / POST / PUT / DELETE /api/admin/series[/:id]

系列 CRUD。


后台 — 评论审核 (/api/admin/comments/*)

GET /api/admin/comments

待审核 + 已审核列表。

PUT /api/admin/comments/:id

通过 / 拒绝。

{ "status": "approved" }  // approved | rejected | pending

DELETE /api/admin/comments/:id

删除。


后台 — 媒体 (/api/admin/media/*)

GET /api/admin/media

R2 文件列表。

POST /api/admin/media/upload

上传。multipart/form-data

POST /api/admin/media/upload
Content-Type: multipart/form-data

file: <binary>

返回:

{ "key": "uploads/...", "url": "/cdn/uploads/..." }

DELETE /api/admin/media/:key

删除文件。


后台 — 静态页 (/api/admin/pages/*)

GET / POST / PUT / DELETE /api/admin/pages[/:slug]

CRUD 操作。publish 字段控制是否对公开 /api/pages/:slug 暴露。


后台 — 备份 / 恢复

POST /api/admin/backup

导出全站数据 + 媒体清单为 JSON,并写入 R2 backups/

{ "key": "backups/2026-04-25.json", "size": 123456 }

POST /api/admin/restore

从备份 JSON 恢复(覆盖现有数据,谨慎)。

POST /api/admin/r2-restore

仅从 R2 备份重新导入媒体清单(不动数据库)。


后台 — 数据分析

GET /api/admin/analytics/overview

总览:浏览量 / 评论 / 反应趋势。

GET /api/admin/analytics/posts

文章维度统计(按 viewCount 排序)。

GET /api/admin/analytics/referrers

引荐源 Top N。


后台 — 系统设置

GET / PUT /api/admin/settings

站点配置(标题、描述、社交链接、Logo 等)。


静态资源 (/cdn/*)

GET /cdn/uploads/:filename

R2 反向代理。1 年强缓存。immutable

GET /cdn/backups/:filename

需鉴权。备份文件下载。


错误码

状态 含义 常见原因
400 Bad Request 参数缺失/格式错
401 Unauthorized 缺 token / token 过期
403 Forbidden 权限不足
404 Not Found 资源不存在
409 Conflict slug 重复
413 Payload Too Large 上传文件超限
429 Too Many Requests 触发限流
500 Internal Server Error 服务器异常

延伸阅读

Clone this wiki locally