# 知识库管理系统 - 完整接口文档 ## 文档信息 | 项目 | 内容 | | ---------- | ------------------ | | **文档名称** | 知识库管理系统完整接口文档 | | **版本号** | V2.16.0 | | **发布日期** | 2026-06-05 | | **文档状态** | 正式发布 | | **接口基础路径** | `/api` | | **认证方式** | Bearer Token (JWT) | --- ## 一、认证说明 ### 1.1 认证流程 所有接口(除登录接口外)均需要在请求头中携带有效的JWT Token: ``` Authorization: Bearer ``` **Token获取方式**: - 通过 `/api/auth/login` 接口登录获取 - Token有效期为24小时 ### 1.2 通用请求头 | 请求头 | 类型 | 必填 | 说明 | | ------------- | ------ | -- | -------------------------------------- | | Content-Type | string | 是 | application/json 或 multipart/form-data | | Authorization | string | 是 | Bearer Token认证信息 | ### 1.3 通用响应格式 ```json { "code": 200, "message": "成功", "data": {}, "timestamp": "2026-05-17 10:00:00" } ``` **响应状态码说明**: | 状态码 | 说明 | | --- | ----------- | | 200 | 成功 | | 400 | 请求参数错误 | | 401 | 未授权/Token无效 | | 403 | 权限不足 | | 404 | 资源不存在 | | 500 | 服务器内部错误 | --- ## 二、认证接口 ### 2.1 登录 **接口路径**: `POST /api/auth/login` **请求体**: ```json { "username": "admin", "password": "123456" } ``` **响应示例**: ```json { "code": 200, "message": "登录成功", "data": { "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc3ODQzNDg1MCwiZXhwIjoxNzc4NDQyMDUwfQ.q38XpqBPFMrYTuupyTN-trR4p_e80yyNLw2reuybPov6A-EBvmFtXjh_l61hCrLax6Zx6KrdAVFHC9gtNQVLjg", "user": { "id": 1, "username": "admin", "role": 1 } }, "timestamp": "2026-05-17 10:00:00" } ``` --- ## 三、向量库管理接口 ### 模块说明 向量库(也称知识库)是本系统的核心概念,所有向量库的管理操作都通过本模块完成。 **核心设计**: - 创建/更新/删除向量库时,先调用AI端接口,再同步到 `knowledge_base_path` 表 - `knowledge_base_path` 表存储向量库的元信息(部门、公开/私密、属于公司或个人等) **基础路径**:`/api/collection` --- ### 3.1 获取向量库列表 **接口路径**: `GET /api/collection` **响应示例**: ```json { "code": 200, "message": "成功", "data": [ { "name": "public_kb", "displayName": "公开知识库", "documentCount": 150, "department": "公共部门", "description": "全员可访问", "ownerType": "department", "visibility": "public", "uploader": "1", "fileSize": 5242880, "createTime": "2026-01-01T10:00:00", "updateTime": "2026-01-01T10:00:00" } ], "timestamp": "2026-05-17 10:00:00" } ``` --- ### 3.2 创建向量库 **接口路径**: `POST /api/collection` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------ | -- | ---------------------------- | | name | String | 是 | 向量库名称(唯一) | | displayName | String | 否 | 显示名称,默认使用name | | department | String | 否 | 所属部门,有值时ownerType为department | | description | String | 否 | 描述信息 | **请求示例**: ```http POST /api/collection?name=dept_hr&displayName=人力资源知识库&department=人事部门&description=人力资源部专用知识库 Authorization: Bearer ``` --- ### 3.3 修改向量库 **接口路径**: `PUT /api/collection/{name}` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------ | -- | ---- | | displayName | String | 否 | 显示名称 | | department | String | 否 | 所属部门 | | description | String | 否 | 描述信息 | --- ### 3.4 删除向量库 **接口路径**: `DELETE /api/collection/{name}` --- ### 3.5 文件向量化(单文件) **接口路径**: `POST /api/collection/{name}/vectorize` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | -- | ---- | | fileId | Long | 是 | 文件ID | **响应示例**: ```json { "code": 200, "message": "成功", "data": { "success": true, "message": "文件已成功解析并存储到向量库", "fileId": 1, "fileName": "考勤制度.pdf", "collection": "public_kb", "fileSize": 1024000, "chunkCount": 15, "path": "public_kb/考勤制度.pdf" }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 3.6 批量文件向量化 **接口路径**: `POST /api/collection/{name}/vectorize/batch` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------- | ---------- | -- | ------ | | fileIds | List | 是 | 文件ID列表 | --- ### 3.7 获取文档列表 **接口路径**: `GET /api/collection/{name}/documents` --- ### 3.8 删除文档 **接口路径**: `DELETE /api/collection/{name}/documents/{filename}` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | name | String | 是 | 向量库名称 | | filename | String | 是 | 文档文件名 | | fileId | Long | 否 | 文件ID(优先使用,避免同名文件删除错误) | **说明**: 删除文档时优先根据 `fileId` 查找记录,若未提供 `fileId` 则回退到 `collection+filename` 查找,避免同名文件删除错误。 --- ### 3.9 废止文档 **接口路径**: `POST /api/collection/{name}/documents/{filename}/deprecate` --- ### 3.10 恢复已废止文档 **接口路径**: `POST /api/collection/{name}/documents/{filename}/restore` --- ### 3.11 获取文档版本历史 **接口路径**: `GET /api/collection/{name}/documents/{filename}/versions` --- ### 3.12 获取文档切片列表 **接口路径**: `GET /api/collection/{name}/documents/{filename}/chunks` **请求参数**: | 参数名 | 类型 | 必填 | 默认值 | 说明 | | ------ | ---- | ---- | ------ | ---- | | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页数量 | **响应示例**: ```json { "code": 200, "message": "成功", "data": { "chunks": [ { "id": "chunk_001", "document": "文档内容摘要...", "metadata": { "chunk_id": "chunk_001", "chunk_type": "text", "collection": "public_kb", "page": 1, "source": "文档名.pdf", "status": "active" }, "status": "active", "version": "v1" } ], "collection": "public_kb", "document_id": "public_kb/文档名.pdf", "total": 25 }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 3.13 新增切片 **接口路径**: `POST /api/collection/{name}/chunks` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | ---- | ---- | | content | String | 是 | 切片内容 | | section | String | 否 | 章节信息 | --- ### 3.14 修改切片 **接口路径**: `PUT /api/collection/{name}/chunks/{chunkId}` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | ---- | ---- | | content | String | 否 | 新内容 | | section | String | 否 | 章节信息 | --- ### 3.15 删除切片 **接口路径**: `DELETE /api/collection/{name}/chunks/{chunkId}` --- ## 四、文件管理接口 **基础路径**:`/api/file` ### 4.1 查询文件详情 **接口路径**: `GET /api/file/{id}` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | ---- | ---- | | id | Long | 是 | 文件ID | **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 1, "fileName": "test.pdf", "filePath": "/uploads/test.pdf", "fileSize": 1024000, "fileType": "application/pdf", "extension": "pdf", "description": "测试文件", "isPublic": true, "status": 1, "auditStatus": 1, "processStatus": "INDEXED", "examStatus": "COMPLETED", "createTime": "2026-05-17T10:00:00" }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 4.2 文件上传 **接口路径**: `POST /api/file/upload` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | -- | -------- | | file | MultipartFile | 是 | 文件内容 | | deptId | Long | 否 | 部门ID(管理员上传制度文件时指定) | | description | String | 否 | 文件描述 | | isPublic | Boolean | 否 | 是否公开,默认true | **响应示例**: ```json { "code": 200, "message": "上传成功", "data": { "id": 1, "fileName": "test.pdf", "filePath": "/uploads/test.pdf", "fileSize": 1024000, "fileType": "application/pdf", "status": 1 }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 4.3 文件列表分页查询 **接口路径**: `GET /api/file/page` **请求参数**: | 参数名 | 类型 | 必填 | 默认值 | 说明 | | ------- | ------- | -- | --- | --------- | | pageNum | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 10 | 每页数量 | | fileName | String | 否 | - | 文件名模糊查询 | | status | Integer | 否 | - | 文件状态 | | auditStatus | Integer | 否 | - | 审核状态 | --- ### 4.4 获取文件信息 **接口路径**: `GET /api/file/info/{id}` **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 1, "fileName": "test.pdf", "filePath": "/uploads/test.pdf", "fileSize": 1024000, "fileType": "application/pdf", "extension": "pdf", "description": "测试文件", "isPublic": true, "status": 1, "auditStatus": 1, "processStatus": "INDEXED", "examStatus": "COMPLETED", "createTime": "2026-05-17T10:00:00" }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 4.5 文件下载 **接口路径**: `GET /api/file/download/{id}` **返回类型**: 文件流 --- ### 4.6 文件预览 **接口路径**: `GET /api/file/preview/{id}` **返回类型**: 文件流(支持浏览器预览的格式) --- ### 4.7 获取文件文本内容 **接口路径**: `GET /api/file/text/{id}` **响应示例**: ```json { "code": 200, "message": "成功", "data": { "content": "文档文本内容...", "pageCount": 10 }, "timestamp": "2026-05-17 10:00:00" } ``` --- ### 4.8 获取文件内容(二进制) **接口路径**: `GET /api/file/content/{id}` **功能说明**: 获取文件的二进制内容,供后端服务使用 **返回类型**: `byte[]` --- ### 4.9 文件RAG流式问答 **接口路径**: `POST /api/file/rag/stream` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | ---- | ---- | | message | String | 是 | 用户提问内容 | **请求示例**: ```http POST /api/file/rag/stream?message=请总结这份文档的内容 Authorization: Bearer ``` **返回类型**: Server-Sent Events (SSE) --- ### 4.10 文件审核通过 **接口路径**: `POST /api/file/audit/approve/{id}` --- ### 4.11 文件审核拒绝 **接口路径**: `POST /api/file/audit/reject/{id}` **请求体**: ```json { "rejectReason": "内容不符合要求" } ``` --- ### 4.12 获取待审核文件列表 **接口路径**: `GET /api/file/audit/pending` **请求参数**: | 参数名 | 类型 | 必填 | 默认值 | 说明 | | ------- | ------- | -- | --- | ---- | | pageNum | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 10 | 每页数量 | --- ### 4.13 更新文件信息 **接口路径**: `PUT /api/file/{id}` **请求体**: ```json { "isPublic": true, "description": "更新后的描述" } ``` --- ### 4.14 删除文件 **接口路径**: `DELETE /api/file/{id}` --- ## 五、知识库访问控制接口 **基础路径**:`/api/collection-access` **说明**:此模块负责查询用户可访问的知识库列表,实现基于部门权限的访问控制。 ### 5.1 分页查询知识库列表 **接口路径**: `GET /api/collection-access/page` **请求参数**: | 参数名 | 类型 | 必填 | 默认值 | 说明 | | ---------- | ------- | -- | --- | ------------------------- | | pageNum | Integer | 否 | 1 | 页码,从1开始 | | pageSize | Integer | 否 | 10 | 每页记录数 | | name | String | 否 | - | 知识库名称(模糊查询) | | department | String | 否 | - | 部门 | | ownerType | String | 否 | - | 所有者类型:department/personal | | visibility | String | 否 | - | 可见性:public/private | --- ### 5.2 获取知识库详情 **接口路径**: `GET /api/collection-access/{id}` --- ### 5.3 获取用户可访问的知识库列表 **接口路径**: `GET /api/collection-access/accessible` **功能说明**:根据当前登录用户的部门信息,返回其可访问的所有知识库列表,包括: - 用户所属部门的公开知识库 - 公共部门的知识库(所有用户都可访问) - 用户个人的知识库 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "collections": [ { "name": "public_kb", "displayName": "公开知识库", "department": "公共部门", "description": "全员可访问", "createTime": "2026-01-01T10:00:00" }, { "name": "dept", "displayName": "部门知识库", "department": "人事部门", "description": "人事部门专用", "createTime": "2026-05-16T13:44:10" } ], "total": 2 }, "timestamp": "2026-05-17 10:00:00" } ``` --- ## 六、AI流式问答接口 ### 6.1 基本信息 | 属性 | 说明 | | ---------------- | ---------------------------------- | | **接口名称** | AI流式问答 | | **描述** | 向AI服务发起流式问答请求,实时返回处理过程,完成后自动保存到数据库 | | **请求方法** | POST | | **URL路径** | /api/ai/chat/stream | | **Content-Type** | application/json | | **返回格式** | Server-Sent Events (SSE) | ### 6.2 请求参数 | 参数名 | 类型 | 必填 | 说明 | | ----------- | ------ | -- | ------------------- | | message | String | 是 | 用户提问内容 | | session_id | String | 否 | 会话ID,用于多轮对话,不传则自动生成 | | id | String | 否 | 自定义请求ID,用于跟踪请求 | **请求示例**: ```json { "message": "请介绍一下这个知识库管理系统", "session_id": "sess_1777600000000_abc123", "id": "custom_req_001" } ``` ### 6.3 流式事件类型 | 事件类型 | 说明 | | ------------- | ------------------------------------------------------------ | | start | 对话开始事件 | | connected | RAG服务连接成功 | | thinking | AI思考中 | | searching | 知识库检索中 | | sources | 检索到的来源信息(仅前端展示用,**不写入引用表**) | | chunk | 流式内容片段 | | result/finish | 最终结果(包含 answer / citations / images,将写入数据库) | | error | 错误信息 | **finish 事件核心字段说明**: | 字段 | 类型 | 说明 | | ------------ | -------- | ------------------------------------------------------------ | | answer | String | AI生成的回答文本(含 `[ref:chunk_id]` 引用标记,前端可解析为可点击引用) | | citations | Array | 真正被引用的切片列表,将写入 `context_reference` 表;每个元素包含 `chunk_id`、`chunk_index`、`source`、`collection`、`doc_type`、`section`、`chunk_type`、`page` 等字段 | | images | Array | 回答中包含的图片列表,将写入 `context_image` 表;每个元素包含 `image_id`、`url`、`source`、`page`、`section`、`description`、`score`、`collection` 等字段 | | duration_ms | Integer | 回答耗时(毫秒),写入 `context_message.duration_ms` | **重要数据流程(保存时自动执行)**: 1. **context_reference.preview 自动填充**:对 `citations` 中每个引用,系统自动调用 RAG 预览接口 `GET /documents/{path}/preview?chunk_index=N&context=0`,将目标切片的完整正文写入 `preview` 字段,供前端定位展示。若接口失败,`preview` 写入失败信息。 2. **context_message 无 sources 字段**:旧版 `sources` 已移除,仅在流式事件中返回来源提示信息用于前端展示。 3. **context_image 字段精简**:仅保留 `image_id`、`path`、`source`、`page`、`section`、`chunk_type`、`description`、`score`、`collection`、`create_time`;已移除 `filename`、`size_bytes`、`format`、`page_end`、`type`、`full_description` 等冗余字段。 --- ## 七、AI 会话管理接口 **基础路径**:`/api/ai` ### 7.1 获取用户会话列表 **接口路径**: `GET /api/ai/sessions?page=1&pageSize=10` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 10 | 每页数量 | **返回结构**: ```json { "success": true, "data": [ { "id": 1, "sessionId": "sess_1780410472658_9qg9a9hhp", "userId": 1, "createTime": "2026-06-02T14:27:53" } ], "total": 5, "page": 1, "pageSize": 10, "pages": 1 } ``` --- ### 7.2 获取会话详情 **接口路径**: `GET /api/ai/session/{sessionId}?page=1&pageSize=20` **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | sessionId | String | 是 | 会话ID | **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页消息数 | **返回结构**: ```json { "success": true, "data": [ { "id": 175, "conversationId": 65, "role": "assistant", "content": "用户问: xxx", "messageType": "rag", "isFinished": 1, "answer": "根据参考资料...", "images": "[{\"image_id\":\"xxx\",\"url\":\"/api/image/xxx/data\"}]", "durationMs": 75512, "createTime": "2026-06-02T14:29:09" } ], "total": 3, "page": 1, "pageSize": 20, "pages": 1 } ``` **说明**:`context_message` 无 `sources` 字段;图片信息在 `images` 字段中(JSON数组字符串)。 --- ### 7.3 获取消息文件来源列表 **接口路径**: `GET /api/ai/message/{messageId}/sources` **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | messageId | Long | 是 | 消息ID(来自 context_message.id) | **返回结构**(按文档名称聚合,去重显示): ```json { "success": true, "data": [ { "docName": "1.docx", "docType": "other", "referenceCount": 5, "pages": "1-86" }, { "docName": "2.docx", "docType": "other", "referenceCount": 3, "pages": "1" } ], "total": 2 } ``` **说明**:此接口从 `context_reference` 表按文档聚合查询,不依赖已移除的 `context_message.sources` 字段。 --- ### 7.4 获取消息引用信息 **接口路径**: `GET /api/ai/message/{messageId}/references?docName=xxx` **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | messageId | Long | 是 | 消息ID | **请求参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | docName | String | 否 | 按文档名称过滤 | **返回结构**: ```json { "success": true, "data": [ { "id": 440, "messageId": 178, "chunkId": "1.docx_86", "chunkIndex": 86, "collection": "dept_1_kb", "docName": "1.docx", "docType": "other", "page": 1, "section": "3.1 权重计算公式", "chunkType": "text", "excerpt": "一级指标合计权重不低于70%。", "preview": "完整的目标切片正文内容...", "score": 0.838, "createTime": "2026-06-04T15:52:49" } ], "total": 5 } ``` **关键字段说明**: | 字段 | 说明 | |------|------| | `chunkId` | 切片唯一标识,格式:`{docName}_{chunkIndex}` | | `preview` | 目标切片完整正文(通过 RAG 预览接口自动获取),若接口失败则写入失败信息 | | `score` | 相关性评分 | | `excerpt` | 切片摘要内容 | --- ### 7.5 获取会话所有引用 **接口路径**: `GET /api/ai/session/{sessionId}/references` **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | sessionId | String | 是 | 会话ID | **说明**:返回会话内所有消息关联的全部引用信息,结构同 7.4。 --- ### 7.6 删除会话 **接口路径**: `DELETE /api/ai/session/{sessionId}` **说明**:删除指定会话及其所有消息和引用数据。 --- ### 7.7 批量删除会话 **接口路径**: `DELETE /api/ai/sessions/batch?ids=1,2,3` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ids | String | 是 | 会话ID列表,逗号分隔 | --- ### 7.8 中断AI流式问答 **接口路径**: `POST /api/ai/chat/stop?sessionId=sess_xxx` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | sessionId | String | 是 | 会话ID | **返回**: ```json { "success": true, "message": "已中断AI回答" } ``` --- ## 八、AI数据接口 **基础路径**:`/api/ai/data` ### 8.1 获取会话消息 **接口路径**: `GET /api/ai/data/session/{sessionId}/messages` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | | ------ | ---- | ---- | ---- | | sessionId | String | 是 | 会话ID | --- ### 7.2 获取反馈列表 **接口路径**: `GET /api/ai/data/feedbacks` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页大小 | --- ### 7.3 获取差评案例 **接口路径**: `GET /api/ai/data/feedbacks/bad-cases` --- ## 九、反馈管理接口 **基础路径**:`/api/feedback` ### 9.1 提交反馈 **接口路径**: `POST /api/feedback` **请求体**: ```json { "session_id": "会话ID(可选)", "query": "用户问题", "answer": "AI回答", "rating": 1, "reason": "反馈原因(可选)", "sources": ["来源文档列表(可选)"] } ``` --- ### 8.2 获取反馈列表 **接口路径**: `GET /api/feedback/list` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页大小 | --- ### 8.3 获取反馈统计 **接口路径**: `GET /api/feedback/stats` --- ### 8.4 获取差评案例 **接口路径**: `GET /api/feedback/bad-cases` --- ## 九、FAQ管理接口 **基础路径**:`/api/faq` ### 9.1 创建FAQ **接口路径**: `POST /api/faq` **请求体**: ```json { "question": "常见问题内容", "answer": "问题答案", "source_documents": ["来源文档列表(可选)"] } ``` --- ### 9.2 获取FAQ列表 **接口路径**: `GET /api/faq` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页大小 | --- ### 9.3 获取FAQ详情 **接口路径**: `GET /api/faq/{id}` --- ### 9.4 更新FAQ **接口路径**: `PUT /api/faq/{id}` **请求体**: ```json { "question": "更新后的问题(可选)", "answer": "更新后的答案(可选)", "status": "approved/pending/rejected(可选)" } ``` --- ### 9.5 删除FAQ **接口路径**: `DELETE /api/faq/{id}` --- ### 9.6 批量删除FAQ **接口路径**: `DELETE /api/faq/batch?ids=1,2,3` --- ### 9.7 条件查询FAQ **接口路径**: `GET /api/faq/list` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | status | String | 否 | - | 状态筛选 | | limit | Integer | 否 | 100 | 返回数量限制 | --- ### 9.8 获取FAQ建议列表 **接口路径**: `GET /api/faq/suggestions` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 20 | 每页大小 | --- ### 9.9 批准FAQ建议 **接口路径**: `POST /api/faq/suggestions/{id}/approve` **请求体**: ```json { "answer": "修改后的标准答案(可选)" } ``` --- ### 9.10 拒绝FAQ建议 **接口路径**: `POST /api/faq/suggestions/{id}/reject` --- ## 十、图片管理接口 **基础路径**:`/api/image` ### 10.0 图片完整处理流程 #### 10.0.1 整体流程说明 本系统实现了完整的AI图片处理流程,包括: ``` 用户提问 → RAG服务返回 → 图片提取 → 下载保存 → 数据库存储 → API访问 → 前端展示 ``` #### 10.0.2 详细处理步骤 **步骤1:用户提问** ``` POST /api/ai/chat/stream { "message": "2003—2022 年,三峡电站累计发电量是多少?最好带图片说明" } ``` **步骤2:RAG服务返回完整数据** ```json { "type": "finish", "answer": "根据【参考资料】...", "images": [ { "image_id": "ab77281e7913.jpg", "path": "/api/image/ab77281e7913.jpg/data", "source": "三峡公报_1-15页.pdf", "page": 12, "section": "3.1 数据图表", "chunk_type": "image", "description": "这是一张柱状图...", "score": 0.85, "collection": "public_kb" } ] } ``` **步骤3:系统自动处理** - ✅ 提取图片元数据(image_id, path, source, page, section, chunk_type, description, score, collection) - ✅ 从AI服务下载图片到本地目录 - ✅ 保存图片元数据到 `context_image` 表 - ✅ 保存图片到本地文件系统 **已移除的旧字段**:`filename`、`size_bytes`、`format`、`page_end`、`type`、`full_description` **步骤4:前端获取图片数据** ```bash GET /api/image/ab77281e7913.jpg/data ``` 返回:图片二进制流 #### 10.0.3 前端展示示例 **JavaScript (原生)** ```javascript // 从 finish 事件获取图片数组 const images = finishEvent.images; images.forEach(image => { // 创建图片元素 const img = document.createElement('img'); img.src = image.url; // url = "/api/image/ab77281e7913.jpg/data" img.alt = image.description; img.style.maxWidth = '100%'; // 创建描述容器 const descDiv = document.createElement('div'); descDiv.innerHTML = `

来源:${image.source}

页码:第 ${image.page} 页

类型:${image.type}

描述:${image.description}

`; // 添加到页面 document.getElementById('image-gallery').appendChild(img); document.getElementById('image-gallery').appendChild(descDiv); }); ``` **React 示例** ```jsx {images && images.length > 0 && (
{images.map((image, index) => (
{image.description}

来源:{image.source}

页码:第 {image.page} 页

类型:{image.chunk_type}

描述:{image.description}

相关性评分:{image.score}

))}
)} ``` **Vue 示例** ```vue ``` ### 10.1 创建图片记录 **接口路径**: `POST /api/image` **请求体**: ```json { "image_id": "图片唯一标识", "path": "存储路径/图片URL", "source": "来源文档(可选)", "page": 1, "section": "所在章节(可选)", "chunk_type": "切片类型(可选)如:image/table", "description": "图片描述(可选)", "score": 0.85, "collection": "所属向量库(可选)" } ``` **字段说明**:`filename`、`size_bytes`、`format`、`page_end`、`type`、`full_description` 已移除。 --- ### 10.2 获取图片列表 **接口路径**: `GET /api/image/list` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | limit | Integer | 否 | 50 | 返回数量 | | offset | Integer | 否 | 0 | 偏移量 | --- ### 10.3 获取图片详情 **接口路径**: `GET /api/image/{id}` --- ### 10.4 获取图片数据 **接口路径**: `GET /api/image/{id}/data` **返回类型**: 图片二进制流 --- ### 10.5 更新图片记录 **接口路径**: `PUT /api/image/{id}` **请求体**: ```json { "path": "更新后的路径(可选)", "source": "更新后的来源文档(可选)", "page": 2, "section": "更新后的章节(可选)", "chunk_type": "更新后的切片类型(可选)", "description": "更新后的描述(可选)", "score": 0.9, "collection": "更新后的向量库(可选)" } ``` --- ### 10.6 删除图片 **接口路径**: `DELETE /api/image/{id}` --- ### 10.7 批量删除图片 **接口路径**: `DELETE /api/image/batch?ids=1,2,3` --- ### 10.8 获取图片统计 **接口路径**: `GET /api/image/stats` --- ## 十一、报告管理接口 **基础路径**:`/api/report` ### 11.1 获取周报 **接口路径**: `GET /api/report/weekly` --- ### 11.2 获取月报 **接口路径**: `GET /api/report/monthly` --- ## 十二、知识检索接口 ### 12.1 混合检索 **接口路径**: `POST /api/search` **请求体**: ```json { "query": "检索关键词", "topK": 5, "collections": ["public_kb", "dept"] } ``` --- ## 十三、知识库路由接口 ### 13.1 测试知识库路由 **接口路径**: `POST /api/kb-route` **请求体**: ```json { "query": "财务部的报销流程是什么" } ``` --- ## 十四、模拟考接口 🔵 模拟考 **基础路径**:`/api/exam` **功能说明**:模拟考接口,通过 AI 生成模拟试卷、题目,支持批改答案。前端可传 `type` 参数指定本次试卷类型(日常练习/模拟考/正式考均可)。 **type 参数可选值**: | 值 | 说明 | |----|------| | `practice` | 日常练习 | | `mock_exam` | 模拟考 | | `formal_exam` | 正式考试 | ### 14.1 生成试卷 **接口路径**: `POST /api/exam/paper/generate` **功能说明**: 根据权限范围或指定文件从题库中动态生成试卷 **请求体**: ```json { "single_choice_count": 5, "multiple_choice_count": 3, "true_false_count": 2, "fill_blank_count": 2, "subjective_count": 1, "difficulty": 3, "include_personal": false, "file_ids": [1, 2, 3] } ``` **请求参数说明**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | single_choice_count | Integer | 否 | - | 单选题数量 | | multiple_choice_count | Integer | 否 | - | 多选题数量 | | true_false_count | Integer | 否 | - | 判断题数量 | | fill_blank_count | Integer | 否 | - | 填空题数量 | | subjective_count | Integer | 否 | - | 简答题数量 | | difficulty | Integer | 否 | - | 难度等级(1-5) | | include_personal | Boolean | 否 | false | 是否包含个人专属题目 | | file_ids | List | 否 | - | 指定文件ID列表,仅从这些文件生成题目 | **响应示例**: ```json { "code": 200, "message": "试卷生成成功", "data": { "paper_id": "paper_xxx", "paper_title": "考试试卷 - 2026-05-17T15:41:56", "total_score": 100.00, "question_count": 13, "generated_at": "2026-05-17T15:41:56", "permission_scope": "本部门", "questions": [ { "question_id": "q_xxx", "question_type": "single_choice", "question_type_name": "单选题", "difficulty": 3, "score": 5.00, "content": {...} } ] }, "timestamp": "2026-05-17 15:41:56" } ``` --- ### 14.2 开始考试(获取题目) **接口路径**: `POST /api/exam/paper/{paperId}/start` **功能说明**: 通过试卷ID开始模拟考试,系统自动查找或创建考试记录,返回试卷题目内容 **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | paperId | String | 是 | 试卷ID | **响应示例**: 同14.1 生成试卷的响应格式 --- ### 14.3 获取考试结果 **接口路径**: `GET /api/exam/record/{recordId}/result` **功能说明**: 获取模拟考试的完整结果,包括题目、答案、分数等信息 **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | recordId | String | 是 | 考试记录ID | **响应示例**: ```json { "code": 200, "message": "操作成功", "data": { "record_id": "59759c40-ee4e-4ff5-ab03-4819a0499beb", "paper_id": "0ef70443-67d3-48cd-9309-f5088c092fe1", "answer_type": "practice", "paper_title": "考试试卷 - 2026-05-17T15:41:56", "user_id": 1, "status": "submitted", "total_score": 85.0, "answers": [ { "question_id": "q_001", "score": 5.0, "is_correct": true, "feedback": "回答正确" } ] }, "timestamp": "2026-05-17 16:05:00" } ``` --- ### 14.4 生成题目 **接口路径**: `POST /api/exam/generate` **功能说明**: 根据指定文件生成考试题目,支持两种生成模式: 1. **智能生成模式**(推荐):不提供 `question_types` 参数,系统会调用 AI 智能出题接口 `/exam/generate-smart`,AI 会根据文档内容自动判断题型和数量 2. **指定题型模式**:提供 `question_types` 参数,系统会调用传统出题接口 `/exam/generate`,按照指定的题型和数量生成题目 **重要说明**:此接口为异步接口,请求后立即返回任务提交状态,实际生成在后台执行。需通过 `GET /api/file/{fileId}` 接口轮询查询生成进度和结果。 支持两种方式指定文件: 1. **通过 file_id 指定**(推荐):系统自动从 `collection_file` 表查询向量库信息 2. **通过 file_path 指定**:需要同时指定 collection 参数 **请求体(智能生成模式)**: ```json { "file_id": 1, "difficulty": 3, "request_id": "gen_req_smart_001" } ``` **请求体(指定题型模式)**: ```json { "file_id": 1, "question_types": { "single_choice": 3, "multiple_choice": 2, "true_false": 2, "fill_blank": 2, "subjective": 1 }, "question_scores": { "single_choice": 5.00, "multiple_choice": 8.00 }, "difficulty": 3, "request_id": "gen_req_001" } ``` **请求参数说明**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file_id | Long | 二选一 | 文件ID,系统自动查询向量库 | | file_path | String | 二选一 | 文件路径 | | collection | String | 当使用 file_path 时必填 | 向量库名称 | | question_types | Object | 否 | 题型及数量配置(不提供则使用智能生成模式) | | question_scores | Object | 否 | 自定义题型分数配置(仅在指定题型模式下有效) | | difficulty | Integer | 否 | 难度等级(1-5),默认3 | | request_id | String | 否 | 请求ID,用于幂等性 | **响应示例(通过 file_id)**: ```json { "code": 200, "message": "收到请求", "data": { "requestId": "gen_req_001", "fileId": 1, "fileMatchStatus": "success", "matchedCollection": "public_kb", "matchedFilePath": "薪酬制度.docx", "documentName": "薪酬制度.docx", "collectionFilled": true, "collectionFillSource": "collection_file 表查询", "asyncTaskStarted": true, "nextStep": "请通过文件状态接口查询生成进度", "status": "success" }, "timestamp": "2026-05-28 10:00:00" } ``` **响应示例(通过 file_path)**: ```json { "code": 200, "message": "收到请求", "data": { "requestId": "gen_req_001", "fileMatchStatus": "skipped", "reason": "使用 file_path 直接指定文件", "collectionFilled": false, "asyncTaskStarted": true, "nextStep": "请通过文件状态接口查询生成进度", "status": "success" }, "timestamp": "2026-05-28 10:00:00" } ``` **响应字段说明**: | 字段 | 类型 | 说明 | |------|------|------| | requestId | String | 请求ID,用于追踪 | | fileId | Long | 文件ID | | fileMatchStatus | String | 文件匹配状态:success/skipped/failed | | matchedCollection | String | 匹配到的向量库名称 | | matchedFilePath | String | 匹配到的文件路径 | | documentName | String | 文档名称 | | collectionFilled | Boolean | 向量库是否已填充 | | collectionFillSource | String | 向量库填充来源 | | asyncTaskStarted | Boolean | 异步任务是否已启动 | | nextStep | String | 下一步操作提示 | | status | String | 状态:success/error | **生成状态查询**: 请求成功后,需通过 `GET /api/file/{fileId}` 接口轮询查询生成进度: **AI生成题目状态**: | 状态值 | 说明 | 前端处理建议 | |--------|------|--------------| | `UNGENERATED` | 未生成 | 显示"未生成"状态 | | `GENERATING` | 正在生成 | 显示加载动画,轮询状态 | | `GENERATED` | 已生成 | 显示成功状态,可查看题目 | | `FAILED` | 生成失败 | 显示错误信息,支持重试 | **文件状态查询响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 1, "fileName": "薪酬制度.docx", "filePath": "public_kb/薪酬制度.docx", "processStatus": "INDEXED", "examStatus": "GENERATED", "processMessage": "生成成功,共5道题\n\n【AI分析结果】\n{\"summary\":\"文档摘要...\",\"questionDistribution\":{\"single_choice\":3,\"multiple_choice\":2}}", "createTime": "2026-05-28T10:00:00", "updateTime": "2026-05-28T10:00:03" } } ``` **processMessage 字段说明**: - 生成成功时:包含题目数量,智能模式还会包含 AI 分析结果(JSON格式) - 生成失败时:包含错误原因 - AI 分析结果通过 `【AI分析结果】` 标记标识 **默认分值配置**: | 题型 | question_type | 默认分值 | |------|---------------|---------| | 单选题 | single_choice | 2分 | | 多选题 | multiple_choice | 4分 | | 判断题 | true_false | 1分 | | 填空题 | fill_blank | 2分 | | 简答题 | subjective | 6分 | **分数优先级**: 1. 题目级配置(AI返回的 score 字段) 2. 题型级配置(question_scores 参数) 3. 默认值(上表) **轮询策略建议**: - 初始轮询间隔:2-3秒 - 超时时间:建议设置为 5-10 分钟 - 停止条件:`examStatus` 变为 `GENERATED` 或 `FAILED` --- ### 14.5 提交考试并批改(正式考试专用) **接口路径**: `POST /api/exam/record/{recordId}/grade` **功能说明**: 通过考试记录ID提交正式考试答案并批改,自动将类型设置为 `formal_exam`。 **路径参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | recordId | String | 是 | 考试记录ID | **请求体**: ```json { "answers": [ {"questionId": "q_001", "questionType": "single_choice", "answer": "B"}, {"questionId": "q_002", "questionType": "multiple_choice", "answer": ["A", "C", "D"]}, {"questionId": "q_003", "questionType": "true_false", "answer": true}, {"questionId": "q_004", "questionType": "fill_blank", "answer": ["答案1", "答案2", "答案3"]}, {"questionId": "q_005", "questionType": "subjective", "answer": "主观题答案内容"} ] } ``` **响应示例**: ```json { "code": 200, "message": "提交成功", "data": { "recordId": "record_xxx", "paperId": "paper_xxx", "paperTitle": "月度考核试卷", "status": "submitted", "totalScore": 85.0, "totalMaxScore": 100.0, "scoreRate": 85.0, "submitTime": "2026-05-17T14:30:00", "answers": [ { "questionId": "q_001", "score": 5.0, "maxScore": 5.0, "isCorrect": true, "feedback": "回答正确" } ] }, "timestamp": "2026-05-17T14:30:00" } ``` --- ### 14.6 批改答案(日常练习/模拟考/正式考试通用) **接口路径**: `POST /api/exam/grade` **功能说明**: 对学生提交的答案进行批改,支持两种模式: 1. **日常练习/模拟考模式**(无 record_id):直接批改答案,可重复提交更新记录 2. **正式考试模式**(有 record_id):通过考试记录ID提交正式考试答案并批改 `type` 字段由前端传入,后端原样使用(不限值)。 **请求体**: ```json { "request_id": "grade_req_001", "type": "practice", "record_id": "59759c40-ee4e-4ff5-ab03-4819a0499beb", "answers": [ { "question_id": "q_001", "question_type": "single_choice", "question_content": { "stem": "题目内容", "data": {"options": [...]}, "answer": "B" }, "student_answer": "A", "max_score": 5.0 } ] } ``` **响应示例**: ```json { "code": 200, "message": "批阅成功", "data": { "success": true, "total_score": 5.0, "total_max_score": 5.0, "score_rate": 100.0, "results": [ { "question_id": "q_001", "question_type": "single_choice", "score": 5.0, "max_score": 5.0, "is_correct": true, "correct": true, "student_answer": "B", "correct_answer": "B", "feedback": "回答正确" } ] }, "timestamp": "2026-05-17 10:00:00" } ``` **响应字段说明**: | 字段 | 类型 | 说明 | |------|------|------| | code | Integer | 状态码,200表示成功 | | message | String | 响应消息 | | data.success | Boolean | 批改是否成功 | | data.total_score | Double | 总得分 | | data.total_max_score | Double | 总满分 | | data.score_rate | Double | 得分率(0-100) | | data.results | Array | 每题批改结果 | | data.results[].question_id | String | 题目ID | | data.results[].question_type | String | 题型 | | data.results[].score | Double | 本题得分 | | data.results[].max_score | Double | 本题满分 | | data.results[].is_correct | Boolean | 是否正确(推荐使用) | | data.results[].correct | Boolean | 是否正确(兼容字段) | | data.results[].student_answer | String | 学生答案 | | data.results[].correct_answer | String | 正确答案 | | data.results[].feedback | String | 反馈信息 | **字段兼容性说明**: | 字段名 | 说明 | 兼容性 | |--------|------|--------| | `is_correct` | 布尔值,表示是否正确 | ✅ 主字段,推荐使用 | | `correct` | 布尔值,表示是否正确 | ✅ 兼容字段,与is_correct值相同 | | `feedback` | 反馈信息 | ✅ 后端自动生成,确保不为空 | | `student_answer` | 学生答案 | ✅ 返回前端提交的答案 | | `correct_answer` | 正确答案 | ✅ 从题目信息中获取 | **各题型反馈生成规则**: - **单选题、多选题、判断题**:优先使用AI返回的`feedback`字段,内容简单直接 - **填空题**:优先使用AI返回的`feedback`,否则从`details.blank_scores`和`details.correct_answers`自动生成 - **主观题**:优先使用`details.overall_feedback`,否则使用`feedback`,最后从`details.scoring_breakdown`生成 --- ### 14.7 查询用户答题记录 **接口路径**: `POST /api/exam/answers/query` **功能说明**: 根据试卷ID或会话ID查询用户答题记录,支持按试卷/练习维度分组展示 **请求体**: ```json { "paper_id": "paper_xxx" } ``` 或 ```json { "session_id": "sess_xxx" } ``` **请求参数说明**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | paper_id | String | 二选一 | 试卷ID | | session_id | String | 二选一 | 会话ID(日常练习) | --- ### 14.8 获取考试记录列表(统一接口) **接口路径**: `GET /api/exam/records?type={type}` **功能说明**: 根据类型获取用户的考试/练习记录,统一查询接口 **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | type | String | 否 | practice | 记录类型:practice(日常练习), mock_exam(模拟考), formal_exam(正式考) | **响应示例**(日常练习): ```json { "code": 200, "message": "成功", "data": { "success": true, "totalCount": 10, "groups": [ { "groupType": "practice", "groupId": "sess_xxx", "groupName": "2026-05-17", "createdAt": "2026-05-17T10:30:00" } ] } } ``` **响应示例**(模拟考/正式考): ```json { "code": 200, "message": "成功", "data": [ { "recordId": "rec_xxx", "paperId": "paper_xxx", "paperTitle": "月度考核试卷", "answerType": "formal_exam", "status": "completed", "totalScore": 85.0, "submitTime": "2026-05-17T11:30:00" } ] } ``` --- ## 十五、正式考试接口 🟢 正式考 **基础路径**:`/api/formal-exam` **功能说明**:正式考试接口,仅供被分配了正式试卷的用户使用。提交答案时 `type` 自动设置为 `formal_exam`,同一用户对同一题目只能答题一次(唯一索引防重复)。 ### 15.1 开始考试(获取题目) **接口路径**: `POST /formal-exam/paper/{paperId}/start` **功能说明**: 直接通过试卷ID开始考试,系统自动查找或创建考试记录,返回试卷题目内容 **响应示例**: ```json { "code": 200, "message": "开始考试成功", "data": { "recordId": "record_xxx", "paperId": "paper_xxx", "paperTitle": "月度考核试卷", "status": "in_progress", "startTime": "2026-05-17T14:00:00", "questions": [ { "questionId": "q_001", "questionType": "single_choice", "questionTypeName": "单选题", "score": 5.0, "content": { "stem": "题目内容...", "data": {"options": [...]} } } ] }, "timestamp": "2026-05-17 14:00:00" } ``` --- **重要说明**:正式考试提交接口已统一到 `/api/exam/grade(推荐使用)或 `/api/exam/record/{recordId}/grade`。 ### 15.2 获取考试结果 **接口路径**: `GET /formal-exam/record/{recordId}/result` **功能说明**: 获取考试结果详情,包含每题得分和反馈 --- ## 十六、正式考管理接口 🟢 正式考管理 **基础路径**:`/admin/exam` **功能说明**:正式考管理接口,供管理员预览、保存、发布正式考试试卷。管理员生成试卷后发布给指定部门/人员,员工在正式考试接口中答题。`type` 自动设置为 `formal_exam`。 ### 16.1 预览试卷 **接口路径**: `POST /admin/exam/paper/preview` **请求体**: ```json { "single_choice_count": 5, "multiple_choice_count": 3, "true_false_count": 2, "fill_blank_count": 2, "subjective_count": 1, "difficulty": 3 } ``` --- ### 16.2 保存试卷 **接口路径**: `POST /admin/exam/paper/save` **请求体**: ```json { "title": "月度考核试卷", "questionIds": ["q_001", "q_002", "q_003"] } ``` --- ### 16.3 发布试卷 **接口路径**: `POST /admin/exam/paper/{paperId}/publish` **请求体**: ```json { "deptId": 1, "userIds": [10, 20, 30], "excludeUserIds": [5], "publishTime": "2026-05-17T00:00:00", "deadline": "2026-05-20T23:59:59" } ``` **请求参数说明**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | deptId | Long | 否 | 部门ID,发布给该部门的所有用户 | | userIds | List\ | 否 | 指定用户ID列表 | | excludeUserIds | List\ | 否 | 排除用户ID列表 | | publishTime | DateTime | 否 | 发布时间,默认立即发布 | | deadline | DateTime | 否 | 截止时间 | **说明**: - 最终考试人员 = (部门用户 + 指定用户) - 排除用户 - 三种组合方式: 1. 只设置 `deptId`:发布给整个部门 2. 只设置 `userIds`:只发布给指定用户 3. 同时设置:覆盖更广泛范围,可排除特定人员 **响应示例**: ```json { "code": 200, "message": "发布成功", "data": null, "timestamp": "2026-05-17 00:00:00" } ``` --- ### 16.4 撤销试卷 **接口路径**: `POST /admin/exam/paper/{paperId}/revoke` --- ### 16.5 删除试卷 **接口路径**: `DELETE /admin/exam/paper/{paperId}` --- ### 16.6 获取试卷详情(管理) **接口路径**: `GET /admin/exam/paper/{paperId}` --- ### 16.7 获取试卷列表(管理) **接口路径**: `GET /admin/exam/paper/list` --- ### 16.8 获取考试记录列表 **接口路径**: `GET /admin/exam/records/{paperId}` --- ### 16.9 获取考试记录详情 **接口路径**: `GET /admin/exam/record/{recordId}` --- ## 十七、题目管理接口 **基础路径**:`/api/question` ### 17.1 创建题目 **接口路径**: `POST /api/question` **请求体**: ```json { "question_type": "single_choice", "difficulty": 3, "content": {"stem": "题目内容", "data": {...}, "answer": "答案"}, "score": 5.0, "document_name": "来源文档" } ``` --- ### 17.2 分页查询题目 **接口路径**: `GET /api/question/page` **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | pageNum | Integer | 否 | 1 | 页码 | | pageSize | Integer | 否 | 10 | 每页大小 | | questionType | String | 否 | - | 题型筛选 | | difficulty | Integer | 否 | - | 难度筛选 | | status | String | 否 | - | 状态筛选 | --- ### 17.3 获取题目详情 **接口路径**: `GET /api/question/{id}` --- ### 17.4 更新题目 **接口路径**: `PUT /api/question/{id}` **请求体**: ```json { "question_type": "更新后的题型(可选)", "difficulty": 4, "content": {"stem": "更新后的题目内容"}, "status": "approved" } ``` --- ### 17.5 删除题目 **接口路径**: `DELETE /api/question/{id}` --- ### 17.6 批量删除题目 **接口路径**: `DELETE /api/question/batch?ids=1,2,3` --- ### 17.7 条件查询题目(按权限过滤) **接口路径**: `GET /api/question/list` **功能说明**: 根据用户权限过滤,返回用户可见的题目(本人库、本部门库、公共库的题目) **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | questionType | String | 否 | - | 题型筛选 | | difficulty | Integer | 否 | - | 难度筛选 | | status | String | 否 | - | 状态筛选 | | documentName | String | 否 | - | 文档名称筛选 | | limit | Integer | 否 | 100 | 返回数量限制 | --- ### 17.8 获取待审核题目 **接口路径**: `GET /api/question/pending` --- ### 17.9 审核题目 **接口路径**: `PUT /api/question/review/{questionId}` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | status | String | 是 | 审核状态:approved/rejected | | reviewerComment | String | 否 | 审核评论 | --- ### 17.10 获取题目统计 **接口路径**: `POST /api/question/stats` **请求体**: ```json { "group_by": "question_type" } ``` --- ## 十八、错题管理接口 **基础路径**:`/api/wrong-questions` ### 18.1 获取错题列表 **接口路径**: `POST /api/wrong-questions/list` **请求体**: ```json { "page": 1, "pageSize": 10, "collection": true } ``` --- ### 18.2 收藏/取消收藏错题 **接口路径**: `POST /api/wrong-questions/collection/toggle` **请求体**: ```json { "question_id": "q_001" } ``` --- ### 18.3 重新做题 **接口路径**: `POST /api/wrong-questions/redo` **请求体**: ```json { "question_ids": ["q_001", "q_002"] } ``` --- ### 18.4 导出错题 **接口路径**: `POST /api/wrong-questions/export` **请求体**: ```json { "question_ids": ["q_001", "q_002"] } ``` --- ## 十九、数据同步接口 **基础路径**:`/api/data-sync` ### 19.1 验证用户数据同步 **接口路径**: `GET /api/data-sync/validate/user/{userId}` --- ### 19.2 验证当前用户数据同步 **接口路径**: `GET /api/data-sync/validate/me` --- ### 19.3 验证所有用户数据同步 **接口路径**: `GET /api/data-sync/validate/all` --- ### 19.4 验证最近用户数据同步 **接口路径**: `GET /api/data-sync/validate/recent` --- ## 二十、接口权限说明 ### 21.1 权限层级 | 用户类型 | 类型值 | 权限说明 | | ----- | --- | ------------------- | | 超级管理员 | 1 | 完全访问权限,可管理所有向量库和文档 | | 部门管理员 | 2 | 可管理本部门的所有向量库和文档 | | 普通用户 | 3 | 可管理个人上传的文档和本部门的公开文档 | ### 20.2 权限矩阵 | 接口 | 超级管理员 | 部门管理员 | 普通用户 | |------|-----------|-----------|----------| | 获取向量库列表 | ✅ | ✅ | ✅ | | 创建向量库 | ✅ | ✅ | ❌ | | 修改向量库 | ✅ | ✅ | ❌ | | 删除向量库 | ✅ | ✅ | ❌ | | 文件向量化 | ✅ | ✅ | ✅ | | 获取文档列表 | ✅ | ✅ | ✅ | | 删除文档 | ✅ | ✅ | ❌ | | 生成题目 | ✅ | ✅ | ✅ | | 批改答案 | ✅ | ✅ | ✅ | | 提交反馈 | ✅ | ✅ | ✅ | | 获取反馈列表 | ✅ | ✅ | ✅ | | 题目CRUD | ✅ | ✅ | ❌ | | FAQ CRUD | ✅ | ✅ | ❌ | | 图片CRUD | ✅ | ✅ | ❌ | | 试卷管理 | ✅ | ✅ | ❌ | | 用户考试 | ✅ | ✅ | ✅ | --- ## 二十一、错误码详解 ### 22.1 认证相关错误 | 错误码 | 错误信息 | 解决方案 | | --- | -------- | -------------- | | 401 | 用户未登录 | 请先登录获取Token | | 401 | Token无效 | 请重新登录获取有效Token | | 401 | Token已过期 | 请重新登录 | | 403 | 权限不足 | 联系管理员提升权限 | ### 22.2 业务逻辑错误 | 错误码 | 错误信息 | 解决方案 | | --- | -------------------- | -------------- | | 400 | 参数错误 | 检查请求参数格式和必填项 | | 404 | 向量库不存在 | 检查向量库名称是否正确 | | 404 | 文档不存在 | 检查文档路径是否正确 | | 500 | 创建向量库失败 | 检查数据库连接或重试 | --- ## 二十二、使用限制 ### 23.1 通用限制 | 限制项 | 限制值 | 说明 | | -------- | ---- | ----------- | | 文件上传大小 | 50MB | 单个文件最大50MB | | 批量上传文件数 | 20 | 一次最多上传20个文件 | | 分页最大页码 | 1000 | 超过后性能下降 | | 每页最大记录数 | 100 | 超过后建议优化查询 | | Token有效期 | 24小时 | 登录Token有效期 | ### 23.2 频率限制 | 接口类型 | 限制 | 时间窗口 | | ------- | ---- | ---- | | 文件上传 | 10次 | 60秒 | | 其他增删改接口 | 30次 | 60秒 | | 查询接口 | 100次 | 60秒 | --- ## 二十三、变更记录 | 版本 | 日期 | 修改内容 | |------|------|----------| | V2.15.0 | 2026-05-29 | 1. 新增用户管理接口(用户CRUD);2. 新增部门管理接口;3. 新增AI会话管理接口(获取会话列表、会话详情、删除会话、批量删除会话);4. 新增向量库切片管理接口(新增切片、修改切片、删除切片、获取向量库切片列表);5. 优化文档结构,添加通用请求头说明;6. 完善向量库管理接口,新增获取文档切片列表等接口。 | | V2.14.0 | 2026-05-28 | 1. 生成题目接口新增智能生成模式,不提供 `question_types` 参数时自动调用 AI 智能出题接口 `/exam/generate-smart`,AI 根据文档内容自动判断题型和数量;2. `question_types` 参数改为可选,仅在指定题型模式下需要提供;3. `process_message` 字段会追加 AI 分析结果(aiAnalysis),包含文档摘要和题型分布等信息;4. 更新文件详情查询接口响应示例,添加 `processMessage` 字段说明;5. 更新 `process_message` 字段类型从 varchar 改为 text,支持存储更长内容。 | | V2.13.0 | 2026-05-19 | 1. 生成题目接口新增 `file_id` 参数支持,系统自动从 `collection_file` 表查询向量库信息;2. 新增 `question_scores` 参数支持自定义题型分数;3. 更新默认分值配置(单选2分、多选4分、判断1分、填空2分、简答6分);4. 添加完整的反馈信息机制,包含文件匹配状态、向量库填充进度等。 | | V2.12.0 | 2026-05-19 | 1. 新增图片完整处理流程说明(10.0节);2. 新增前端图片展示示例(JavaScript/React/Vue);3. 完善图片元数据字段说明(新增 score、type、description、full_description);4. 新增图片自动下载和本地保存功能说明。 | | V2.11.0 | 2026-05-17 | 1. 控制器重命名:KnowledgeBasePathController → CollectionAccessController,路径从 /api/kb-path 改为 /api/collection-access;2. 部门字段重命名:HR_DEPT → 人事部门,PUBLIC_DEPT → 公共部门;3. 图片接口路径更新:/api/images → /api/image。 | | V2.10.0 | 2026-05-14 | 新增文件来源展示优化功能:1. AI流式问答 finish 事件新增 `sources`(文件来源列表)和 `images`(图片列表)字段;2. 新增 `GET /api/ai/message/{messageId}/sources` 接口获取文件来源列表(去重);3. `GET /api/ai/message/{messageId}/references` 新增 `docName` 参数支持按文档过滤;4. 消息实体新增 `sources` 字段存储文件来源摘要;5. 图片接口新增兼容路径 `/api/images/list`;6. 修复异步题目生成问题:添加 `@EnableAsync` 配置和自定义线程池。 | | V2.9.3 | 2026-05-11 | 统一考试接口架构:新增 `/api/exam/record/{recordId}/grade` 接口;`/api/exam/grade` 新增 `record_id` 参数支持正式考试提交;删除冗余接口 `/formal-exam/record/{recordId}/submit` 和 `/admin/exam/record/{recordId}/submit`。 | | V2.9.2 | 2026-05-11 | 删除重复字段 `status_detail`,只保留 `status` 字段。`exam_record` 表新增 `answer_type` 字段,所有考试记录增加类型标识。 | | V2.9.1 | 2026-05-11 | 参数重命名:answer_type → type,值改为英文(practice/mock_exam/formal_exam)。删除 recordId 方式开始考试接口,统一使用 paperId。删除旧 UserExamController。数据库 answer_type 字段默认值改为 practice。 | | V2.8.0 | 2026-05-10 | 简化用户考试流程:删除获取试卷详情和保存答案接口,开始考试接口同时返回题目,提交试卷接口改为接收答案参数一次性提交 | | V2.7.0 | 2026-05-10 | 完善生成试卷权限控制:根据用户类型(超级管理员/部门管理员/普通用户)进行题目权限过滤,删除重复接口 GET /api/exam/list | | V2.6.0 | 2026-05-10 | 修改 GET /api/question/list 添加用户权限过滤(本人库、本部门库、公共库);生成试卷添加公共部门向量库支持 | | V2.5.0 | 2026-05-10 | 补充文件管理接口:新增查询文件详情、获取文件内容接口;更新RAG流式问答接口参数格式 | | V2.4.0 | 2026-05-10 | 添加文件管理接口、用户考试接口、管理员考试接口、错题管理接口、AI数据接口、数据同步接口 | | V2.3.0 | 2026-05-09 | 添加生成试卷接口、用户答题记录查询接口,完善考试管理模块 | | V2.2.0 | 2026-05-07 | 更新向量库列表和文档列表接口说明,改为从本地数据库读取 | | V2.1.0 | 2026-05-06 | 添加题目、FAQ、图片完整CRUD接口文档 | | V2.0.0 | 2026-05-05 | 整合考试管理、知识库管理、AI交互、AI流式等接口文档 | | V1.0.2 | 2026-05-02 | 重构向量库管理接口 | | V1.0.1 | 2026-05-02 | 整合向量库/知识库接口 | | V1.0.0 | 2026-04-30 | 初始版本 | --- **文档结束**