| 项目 | 值 |
|---|---|
| 基路径 | /api |
| 协议 | HTTP/HTTPS + WebSocket |
| 认证 | JWT Cookie (xdocs_token) |
| Content-Type | application/json(大部分接口) |
| 文件上传 | multipart/form-data |
成功:
{
"code": 200,
"message": "success",
"data": { ... }
}
失败:
{
"code": 401,
"message": "未登录",
"data": null
}
| HTTP Code | 含义 |
|---|---|
| 200 | 成功 |
| 400 | 参数错误 / 业务异常 |
| 401 | 未登录 |
| 403 | 无权限 / 已封禁 / CSRF 失败 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
xdocs_token Cookie。标记 @Public 的接口无需登录。GET /api/auth/ws-token 获取短期 token,连接时放入 query param ?token=<jwt>。/api/auth/api/auth/register注册新用户。
公开接口,无需登录。
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| username | string | 是 | 用户名(唯一) |
| password | string | 是 | 密码 |
| string | 是 | 邮箱(唯一) | |
| code | string | 是 | 邮箱验证码 |
| nickname | string | 否 | 昵称 |
响应 data: User 对象(不含 password)。
/api/auth/login登录。
公开接口。
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| username | string | 是 | 用户名 |
| password | string | 是 | 密码 |
| turnstileToken | string | 是 | Cloudflare Turnstile 人机验证 token |
响应 data: User 对象(不含 password)。同时设置 xdocs_token Cookie。
/api/auth/logout登出。清除 Cookie。
公开接口。
/api/auth/current获取当前登录用户。
公开接口。
响应 data: User 对象或 null。
/api/auth/send-code发送邮箱验证码。
公开接口。
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| string | 是 | 目标邮箱 | |
| turnstileToken | string | 是 | Turnstile token |
| type | string | 否 | register(默认)或 reset |
限制:
type + email 60 秒内只能发送一次;重复请求返回 429。type=register 时目标邮箱必须未注册;type=reset 时目标邮箱必须已注册。常见错误:
| HTTP 状态 | 说明 |
|---|---|
| 400 | Turnstile 校验失败 / 邮箱状态不符合当前类型 |
| 429 | 验证码发送过于频繁,请稍后再试 |
/api/auth/reset-password重置密码。
公开接口。
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| string | 是 | 邮箱 | |
| code | string | 是 | 验证码 |
| newPassword | string | 是 | 新密码 |
/api/auth/ws-token获取 WebSocket 连接用的短期 token。
需登录。
响应 data:
{ "token": "eyJhbGciOi..." }
/api/user/api/user/profile获取用户资料(含社交统计)。
需登录。
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | 否 | 目标用户 ID,不传则查当前用户 |
响应 data: UserProfile
{
"id": 1,
"username": "admin",
"email": "admin@example.com",
"nickname": "管理员",
"avatarUrl": "/uploads/avatar/xxx.png",
"role": 0,
"status": 0,
"followingCount": 10,
"followerCount": 5,
"isFollowed": false
}
/api/user/update-nickname修改昵称。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| nickname | string | 是 |
/api/user/update-avatar修改头像 URL。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| avatarUrl | string | 是 |
/api/user/change-password修改密码。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| oldPassword | string | 是 |
| newPassword | string | 是 |
/api/user/follow关注用户。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| userId | int | 是 |
响应 data: { "followed": true }
/api/user/unfollow取消关注。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| userId | int | 是 |
响应 data: { "followed": false }
/api/user/following获取关注列表。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| userId | int | 否 |
响应 data: FollowUser[]
/api/user/followers获取粉丝列表。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| userId | int | 否 |
响应 data: FollowUser[]
/api/user/favorites获取收藏文章列表。
需登录。
响应 data: FavoriteArticle[]
/api/user/history获取浏览记录。
需登录。
响应 data: HistoryArticle[](最多 50 条)
/api/user/history-delete删除浏览记录。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| articleId | int | 否 | 指定文章 ID,不传则清空全部 |
/api/article/api/article/create创建文章。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| kbId | int | 是 | 知识库 ID |
| title | string | 是 | 标题 |
| content | string | 否 | 初始内容 |
响应 data: Article 对象。
/api/article/update更新文章。
需登录。需要编辑权限。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | 是 | 文章 ID |
| title | string | 否 | 标题 |
| content | string | 否 | 内容 |
| summary | string | 否 | 摘要 |
| status | int | 否 | 0=草稿, 1=公开 |
响应 data: Article 对象。
/api/article/delete删除文章。
需登录。需要编辑权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
/api/article/detail获取文章详情。
公开接口。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
响应 data: ArticleVO
{
"id": 1,
"knowledgeBaseId": 1,
"title": "入门指南",
"summary": "快速上手 CloudDoc",
"content": "# Hello\n\n世界",
"authorId": 1,
"authorName": "admin",
"authorAvatar": "/uploads/avatar/xxx.png",
"kbName": "默认知识库",
"status": 1,
"likeCount": 5,
"liked": false,
"canEdit": true,
"createTime": "2025-01-01T00:00:00",
"updateTime": "2025-01-01T00:00:00"
}
/api/article/list获取知识库内文章列表。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
响应 data: ArticleVO[]
/api/article/public-list获取公开文章列表。
公开接口。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| offset | int | 否 | 偏移量,默认 0 |
| limit | int | 否 | 每页数量,默认 20 |
| sort | string | 否 | time(默认)或 likes |
| keyword | string | 否 | 搜索关键词 |
响应 data: ArticleVO[]
/api/article/save保存文章内容(协同编辑后的显式保存)。
需登录。需要编辑权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
| content | string | 否 |
响应 data: Article 对象。
/api/article/like点赞文章。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
响应 data: { "liked": true, "likeCount": 6 }
/api/article/unlike取消点赞。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
响应 data: { "liked": false, "likeCount": 5 }
/api/article/comment发表评论。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| articleId | int | 是 | |
| content | string | 是 | |
| parentId | int | 否 | 父评论 ID(回复时传) |
| replyToId | int | 否 | 回复目标评论 ID |
响应 data: { "id": 42 }
/api/article/comments获取文章评论列表。
公开接口。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
响应 data: CommentItem[]
/api/article/comment-delete删除评论。
需登录。仅评论作者可删除。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
/api/article/favorite收藏文章。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
响应 data: { "favorited": true }
/api/article/unfavorite取消收藏。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
响应 data: { "favorited": false }
/api/article/visit记录浏览。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | int | 是 |
/api/team/api/team/create创建团队。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| name | string | 是 |
| description | string | 否 |
响应 data: TeamVO
/api/team/list获取当前用户所属团队列表。
需登录。
响应 data: TeamVO[]
/api/team/pending-invites获取待处理的团队邀请。
需登录。
响应 data: PendingInvite[]
/api/team/detail获取团队详情。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
响应 data: TeamVO
/api/team/invite邀请用户加入团队。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| teamId | int | 是 | |
| userId | int | 否 | 用户 ID(与 username 二选一) |
| username | string | 否 | 用户名(与 userId 二选一) |
/api/team/accept接受团队邀请。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| teamId | int | 是 |
/api/team/reject拒绝团队邀请。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| teamId | int | 是 |
/api/team/quit退出团队。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| teamId | int | 是 |
/api/team/update-role修改成员角色。
需登录。需要 OWNER 权限。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| teamId | int | 是 | |
| userId | int | 是 | 目标用户 |
| role | int | 否 | 0=OWNER, 1=ADMIN, 2=MEMBER |
/api/team/members获取团队成员列表。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
响应 data: TeamMemberVO[]
/api/team/kick踢出成员。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| teamId | int | 是 |
| userId | int | 是 |
/api/team/cancel-invite取消邀请。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| teamId | int | 是 |
| userId | int | 是 |
/api/kb/api/kb/create创建知识库。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | |
| description | string | 否 | |
| visibility | int | 否 | 0=私有(默认), 1=公开 |
| ownerType | int | 否 | 0=个人(默认), 1=团队 |
| ownerId | int | 条件必填 | ownerType=1 时必填(团队 ID) |
响应 data: KnowledgeBase 对象。
/api/kb/update更新知识库。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
| name | string | 否 |
| description | string | 否 |
响应 data: KnowledgeBase 对象。
/api/kb/delete删除知识库。
需登录。需要 OWNER 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
/api/kb/detail获取知识库详情。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
响应 data: KnowledgeBase 对象。
/api/kb/list按归属获取知识库列表。
需登录。
| 参数 | 类型 | 必填 | |
|---|---|---|---|
| ownerType | int | 否 | 0=个人, 1=团队 |
| ownerId | int | 是 |
响应 data: KnowledgeBase[]
/api/kb/list-mine获取当前用户的个人知识库列表。
需登录。
响应 data: KnowledgeBase[]
/api/kb/members获取知识库成员列表。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
响应 data: KbMemberVO[]
/api/kb/authorize授权用户加入知识库。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| kbId | int | 是 | |
| userId | int | 否 | 用户 ID(与 username 二选一) |
| username | string | 否 | 用户名 |
| role | int | 否 | 0=OWNER, 1=ADMIN, 2=EDITOR, 3=VIEWER |
/api/kb/accept接受知识库邀请。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
/api/kb/reject拒绝知识库邀请。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
/api/kb/cancel-invite取消知识库邀请。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
| userId | int | 是 |
/api/kb/update-role修改知识库成员角色。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
| userId | int | 是 |
| role | int | 否 |
/api/kb/pending-invites获取待处理的知识库邀请。
需登录。
响应 data: KbPendingInvite[]
/api/kb/remove-member移除知识库成员。
需登录。需要 OWNER/ADMIN 权限。
| 参数 | 类型 | 必填 |
|---|---|---|
| kbId | int | 是 |
| userId | int | 是 |
/api/chat/api/chat/history获取文章聊天历史。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| articleId | int | 是 | |
| limit | int | 否 | 默认 50 |
响应 data: ChatMessageVO[]
/api/chat/send发送聊天消息(HTTP 方式,WebSocket 也可发)。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| articleId | int | 是 | |
| content | string | 是 | |
| teamId | int | 否 | 团队上下文 |
| messageType | int | 否 | 0=文本(默认), 1=系统 |
/api/chat/online-members获取文章聊天在线用户。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| articleId | string | 是 |
响应 data:
[
{ "userId": 1, "nickname": "admin", "avatarUrl": "/uploads/avatar/xxx.png" }
]
/api/search/api/search/articles搜索公开文章。
公开接口。
| 参数 | 类型 | 必填 |
|---|---|---|
| keyword | string | 是 |
| offset | int | 否 |
| limit | int | 否 |
响应 data: ArticleVO[]
/api/search/kbs搜索公开知识库。
公开接口。
| 参数 | 类型 | 必填 |
|---|---|---|
| keyword | string | 是 |
响应 data: KnowledgeBase[]
/api/search/users搜索用户。
公开接口。
| 参数 | 类型 | 必填 |
|---|---|---|
| keyword | string | 是 |
响应 data: SearchUser[](脱敏,不含密码和邮箱)
/api/notification/api/notification/list获取通知列表。
需登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| offset | int | 否 | 默认 0 |
| limit | int | 否 | 默认 20 |
响应 data: NotificationItem[]
/api/notification/unread-count获取未读通知数。
需登录。
响应 data: number
/api/notification/read标记通知已读。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
/api/notification/read-all标记全部通知已读。
需登录。
/api/notification/delete删除通知。
需登录。
| 参数 | 类型 | 必填 |
|---|---|---|
| id | int | 是 |
/api/upload/api/upload/image上传文章图片。
需登录。
请求: multipart/form-data,字段名 file。
响应 data:
{
"url": "/uploads/image/abc123.png",
"fileName": "screenshot.png"
}
/api/upload/avatar上传头像(同时更新用户头像 URL)。
需登录。
请求: multipart/form-data,字段名 file。
响应 data:
{
"url": "/uploads/avatar/def456.jpg"
}
端点: ws(s)://host/api/chat/ws/{articleId}?token=<jwt>
消息格式(服务端 → 客户端):
// 聊天消息
{ "type": "chat", "id": 42, "articleId": 1, "senderId": 1, "senderName": "admin", "senderAvatar": "/uploads/avatar/xxx.png", "content": "你好", "createTime": "2025-01-01T12:00:00" }
// 系统消息
{ "type": "system", "content": "admin 加入了聊天" }
// 在线用户列表
{ "type": "online", "users": [{ "userId": 1, "nickname": "admin", "avatarUrl": "/uploads/avatar/xxx.png" }] }
消息格式(客户端 → 服务端):
{ "type": "chat", "content": "你好" }
端点: ws(s)://host/api/collaboration/{docId}?token=<jwt>
协议: y-websocket 二进制协议。
| 消息类型值 | 类型 | 说明 |
|---|---|---|
| 0 | Sync | SyncStep1=0, SyncStep2=1, Update=2 |
| 1 | Awareness | 在线状态/光标 |
| 3 | QueryAwareness | 请求 awareness |
端点: ws(s)://host/api/notification/ws?token=<jwt>
消息格式(服务端 → 客户端):
// 新通知
{ "type": "notification", "data": { "id": 1, "type": 6, "title": "新关注", "content": "user1 关注了你", "isRead": 0, "createTime": "2025-01-01T12:00:00" } }
// 未读数更新
{ "type": "unread_count", "count": 5 }
以下接口无需登录即可访问:
| 接口 | 方法 |
|---|---|
/api/auth/register |
POST |
/api/auth/login |
POST |
/api/auth/logout |
POST |
/api/auth/current |
GET |
/api/auth/send-code |
POST |
/api/auth/reset-password |
POST |
/api/article/detail |
GET |
/api/article/public-list |
GET |
/api/article/comments |
GET |
/api/search/articles |
GET |
/api/search/kbs |
GET |
/api/search/users |
GET |