REST API 接口文档
GEO Wiki Pro REST API 完整接口参考,包含认证、文档管理、分类、标签、媒体上传等所有端点
# REST API 接口文档
> GEO Wiki Pro 后端 REST API 完整接口参考手册
---
## 概述
GEO Wiki Pro 提供基于 RESTful 风格的 HTTP API,所有接口均在 `/api/v1/` 路径下。公开接口无需认证,管理接口需要 JWT 认证和管理员角色。
### 基础信息
| 项目 | 说明 |
|------|------|
| 基础 URL | `https://your-domain.com/api/v1` |
| 认证方式 | JWT(httpOnly cookie) |
| CSRF 保护 | Double-submit cookie HMAC |
| 内容类型 | `application/json` |
| 限流策略 | 全局 300 次/分钟,认证接口 10 次/分钟 |
### 响应格式
**成功响应:**
```json
{
"success": true,
"data": { ... }
}
```
**分页响应:**
```json
{
"success": true,
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 20,
"total": 42,
"totalPages": 3
}
}
```
**错误响应:**
```json
{
"success": false,
"message": "Not found"
}
```
---
## 公开接口
以下接口无需认证,任何人都可以访问。
### 获取文档列表
```
GET /api/v1/docs
```
**查询参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `lang` | string | 否 | 语言代码(zh/en/jp),默认 zh |
| `category` | string | 否 | 分类 slug 筛选 |
| `page` | number | 否 | 页码,默认 1 |
| `limit` | number | 否 | 每页条数,默认 20 |
**示例:**
```bash
curl "https://geowiki.pro/api/v1/docs?lang=en&category=can-motion&page=1&limit=10"
```
**响应:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"category": "can-motion",
"tags": ["can-bus", "protocol"],
"author": "admin",
"sort": 1,
"description": "CAN bus communication protocol overview",
"updated_at": "2026-05-20T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3
}
}
```
### 获取单篇文档
```
GET /api/v1/docs/:slug
```
**路径参数:**
| 参数 | 类型 | 说明 |
|------|------|------|
| `slug` | string | 文档 slug |
**查询参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `lang` | string | 否 | 语言代码,默认 zh |
**示例:**
```bash
curl "https://geowiki.pro/api/v1/docs/can-bus-protocol?lang=en"
```
**响应:**
```json
{
"success": true,
"data": {
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"category": "can-motion",
"tags": ["can-bus", "protocol"],
"author": "admin",
"sort": 1,
"description": "CAN bus communication protocol overview",
"content": "# CAN Bus Protocol\n\nThe Controller Area Network (CAN)...",
"updated_at": "2026-05-20T10:30:00Z"
}
}
```
::: note
对于非默认语言的请求,系统会执行级联合并:先读取中文文档作为基础,再用目标语言文档覆盖匹配的 slug。因此即使某文档只有中文版本,英文请求也能返回内容。
:::
### 文档搜索
```
GET /api/v1/docs/search
```
**查询参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `q` | string | 是 | 搜索关键词 |
| `lang` | string | 否 | 语言代码 |
| `category` | string | 否 | 分类 slug |
| `page` | number | 否 | 页码 |
| `limit` | number | 否 | 每页条数 |
**示例:**
```bash
curl "https://geowiki.pro/api/v1/docs/search?q=can+bus&lang=en&category=can-motion"
```
**响应:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"description": "CAN bus communication protocol overview",
"score": 0.95
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 5,
"totalPages": 1
}
}
```
### 获取分类列表
```
GET /api/v1/categories
```
**响应:**
```json
{
"success": true,
"data": [
{
"slug": "can-motion",
"name": "CAN 运动控制",
"name_en": "CAN Motion Control",
"description": "CAN 总线运动控制产品文档"
}
]
}
```
### 获取标签列表
```
GET /api/v1/tags
```
**响应:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus",
"name": "CAN 总线",
"name_en": "CAN Bus"
}
]
}
```
### 获取站点配置
```
GET /api/v1/config
```
**响应:**
```json
{
"success": true,
"data": {
"hero_title": "GEO Wiki Pro",
"hero_subtitle": "Technical Documentation Platform",
"featured_slugs": ["quick-start", "faq"],
"logo_url": "/media/logo.png",
"favicon_url": "/media/favicon.ico"
}
}
```
### 获取组合元数据
```
GET /api/v1/meta
```
返回分类、标签和通知信息的组合数据。
**响应:**
```json
{
"success": true,
"data": {
"categories": [ ... ],
"tags": [ ... ],
"notice": "Important announcement text"
}
}
```
### AI 爬虫 Feed
```
GET /api/v1/llms.txt
```
返回专为 AI 爬虫优化的文本内容。
### 站点地图
```
GET /api/v1/geo/sitemap.xml
```
返回 XML 格式的站点地图。
### 提交反馈
```
POST /api/v1/feedback
```
**请求体:**
```json
{
"slug": "can-bus-protocol",
"content": "Great documentation!",
"rating": 5
}
```
**响应:**
```json
{
"success": true,
"data": {
"id": "fb_123456"
}
}
```
---
## 认证接口
### 用户登录
```
POST /api/v1/auth/login
```
**请求体:**
```json
{
"username": "admin",
"password": "your-password"
}
```
**响应:**
```json
{
"success": true,
"data": {
"user": {
"username": "admin",
"role": "admin"
},
"mustChangePassword": false
}
}
```
::: warning
首次登录时,`mustChangePassword` 为 `true`,必须先调用修改密码接口才能访问管理功能。
:::
### 用户登出
```
POST /api/v1/auth/logout
```
### 获取当前用户信息
```
GET /api/v1/auth/me
```
**响应:**
```json
{
"success": true,
"data": {
"username": "admin",
"role": "admin",
"passwordChanged": true
}
}
```
### 修改密码
```
POST /api/v1/auth/change-password
```
**请求体:**
```json
{
"oldPassword": "current-password",
"newPassword": "new-password"
}
```
### 注册新用户
```
POST /api/v1/auth/register
```
::: warning
此接口仅管理员可用。
:::
**请求体:**
```json
{
"username": "newuser",
"password": "user-password",
"role": "editor"
}
```
---
## 管理接口
所有管理接口需要 JWT 认证和管理员/编辑者角色。
### 文档管理
#### 创建文档
```
POST /api/v1/admin/docs
```
**请求体:**
```json
{
"slug": "my-new-doc",
"title": "My New Document",
"category": "support",
"tags": ["guide", "tutorial"],
"author": "admin",
"sort": 5,
"description": "A helpful guide",
"content": "# My New Document\n\nContent here...",
"lang": "en"
}
```
::: tip
如果未提供 slug,系统会自动根据标题生成。创建文档时会检查 slug 是否重复。
:::
#### 更新文档
```
PUT /api/v1/admin/docs/:slug
```
更新文档时会自动同步共享字段(category、tags、author、sort)到其他语言版本。
#### 删除文档
```
DELETE /api/v1/admin/docs/:slug
```
#### 文档排序
```
PUT /api/v1/admin/docs/reorder
```
**请求体:**
```json
{
"slugs": ["doc-1", "doc-2", "doc-3"],
"category": "can-motion",
"lang": "zh"
}
```
::: note
此接口必须在 `PUT /api/v1/admin/docs/:slug` 之前定义,否则 Express 会将 `reorder` 匹配为 slug 参数。
:::
### 分类管理
#### 获取分类列表
```
GET /api/v1/admin/categories
```
#### 创建分类
```
POST /api/v1/admin/categories
```
**请求体:**
```json
{
"slug": "new-category",
"name": "新分类",
"name_en": "New Category",
"description": "Category description"
}
```
#### 更新分类
```
PUT /api/v1/admin/categories/:slug
```
#### 删除分类
```
DELETE /api/v1/admin/categories/:slug
```
### 标签管理
#### 获取标签列表
```
GET /api/v1/admin/tags
```
#### 创建标签
```
POST /api/v1/admin/tags
```
**请求体:**
```json
{
"slug": "new-tag",
"name": "新标签",
"name_en": "New Tag"
}
```
#### 删除标签
```
DELETE /api/v1/admin/tags/:slug
```
### 反馈管理
#### 获取反馈列表
```
GET /api/v1/admin/feedback
```
#### 删除反馈
```
DELETE /api/v1/admin/feedback/:id
```
### 媒体管理
#### 获取媒体列表
```
GET /api/v1/admin/media
```
#### 删除媒体文件
```
DELETE /api/v1/admin/media/:filename
```
### 上传文件
```
POST /api/v1/media/upload
```
**请求:** `multipart/form-data`
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `file` | file | 是 | 上传的文件 |
::: warning
文件上传会通过 magic bytes 检测真实类型。文件名会进行 `encodeURIComponent` 编码。
:::
**示例:**
```bash
curl -X POST "https://geowiki.pro/api/v1/media/upload" \
-H "Cookie: jwt=your-token" \
-F "[email protected]"
```
### 站点配置管理
#### 获取完整配置
```
GET /api/v1/admin/config
```
#### 更新配置
```
PUT /api/v1/admin/config
```
**请求体:**
```json
{
"hero_title": "My Wiki",
"hero_subtitle": "Technical Documentation",
"featured_slugs": ["quick-start", "faq"],
"logo_url": "/media/logo.png",
"favicon_url": "/media/favicon.ico",
"customHeadHtml": "<meta name=\"theme-color\" content=\"#3b82f6\">"
}
```
::: note
`customHeadHtml` 字段会自动过滤 `<script>`、`<iframe>` 和 `on*` 事件属性,防止 XSS 攻击。
:::
### 草稿管理
#### 发布草稿
```
POST /api/v1/admin/drafts/:slug/publish
```
#### 拒绝草稿
```
DELETE /api/v1/admin/drafts/:slug
```
### 用户管理
#### 获取用户列表
```
GET /api/v1/admin/users
```
#### 创建用户
```
POST /api/v1/admin/users
```
#### 删除用户
```
DELETE /api/v1/admin/users/:username
```
### 统计信息
```
GET /api/v1/admin/stats
```
返回文档数量、分类统计、标签使用情况等仪表盘数据。
### 留言管理
#### 获取留言列表
```
GET /api/v1/admin/guestbook
```
#### 创建留言
```
POST /api/v1/admin/guestbook
```
#### 更新留言
```
PUT /api/v1/admin/guestbook/:id
```
#### 删除留言
```
DELETE /api/v1/admin/guestbook/:id
```
### GEO 分析
#### 获取 GEO 概览
```
GET /api/v1/admin/geo/overview
```
#### 重建 GEO 文件
```
POST /api/v1/admin/geo/rebuild
```
触发重新生成 `llms.txt` 和 `sitemap.xml`。
---
## 错误码
| HTTP 状态码 | 说明 |
|------------|------|
| 200 | 成功 |
| 201 | 创建成功 |
| 400 | 请求参数错误 |
| 401 | 未认证或 token 过期 |
| 403 | 无权限 |
| 404 | 资源不存在 |
| 409 | 资源冲突(如 slug 重复) |
| 429 | 请求过于频繁(限流) |
| 500 | 服务器内部错误 |
---
## 安全机制
| 机制 | 说明 |
|------|------|
| JWT 认证 | httpOnly cookie,2 小时过期 |
| CSRF 保护 | Double-submit cookie HMAC 验证 |
| 限流 | 全局 300 次/分钟,认证接口 10 次/分钟 |
| CSP | Helmet nonce-based Content Security Policy |
| 文件上传 | Magic bytes 类型检测 |
| Slug 验证 | 正则匹配 + 长度限制 + 去重检查 |
---
*最后更新: 2026-06-06 | 版本: v3.0.2*