Files
my-springboot-project/docs/完整curl测试手册.md

46 KiB
Raw Blame History

知识库管理系统 - 完整CURL测试手册

文档信息

项目 内容
文档名称 完整CURL测试文档
版本号 V2.15.0
生成日期 2026-05-29
基础URL http://localhost:8080
RAG服务地址 http://localhost:5001

一、使用说明

1.1 认证Token获取

首先需要通过登录接口获取JWT Token

curl -X POST "http://localhost:8080/api/auth/login" \
     -H "Content-Type: application/json" \
     -d '{"username":"admin","password":"123456"}'

1.2 Token说明

本文档中所有curl命令均已预置Token可直接复制使用。

1.3 通用请求头

所有需要认证的接口都需要添加以下请求头:

-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json"

二、认证接口

2.1 登录

curl -X POST "http://localhost:8080/api/auth/login" \
     -H "Content-Type: application/json" \
     -d '{"username":"admin","password":"123456"}'

2.2 获取当前用户信息

curl -X GET "http://localhost:8080/api/auth/me" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

三、用户管理接口

3.1 获取用户列表

curl -X GET "http://localhost:8080/api/user/list" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

3.2 获取用户详情

curl -X GET "http://localhost:8080/api/user/1" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

3.3 创建用户

curl -X POST "http://localhost:8080/api/user" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -d '{
       "username": "testuser",
       "password": "123456",
       "email": "test@example.com",
       "deptId": 1,
       "userType": 3
     }'

3.4 更新用户

curl -X PUT "http://localhost:8080/api/user/1" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -d '{"email": "newemail@example.com"}'

3.5 删除用户

curl -X DELETE "http://localhost:8080/api/user/1" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

3.6 获取部门列表

curl -X GET "http://localhost:8080/api/department/list" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

四、向量库管理接口

4.1 获取向量库列表

curl -X GET "http://localhost:8080/api/collection" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.2 创建向量库

curl -X POST "http://localhost:8080/api/collection?name=dept_hr&displayName=人力资源知识库&departmentId=1&description=人力资源部专用知识库" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.3 修改向量库

curl -X PUT "http://localhost:8080/api/collection/dept_hr?displayName=人力资源知识库V2&description=更新后的描述" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.4 删除向量库

curl -X DELETE "http://localhost:8080/api/collection/dept_hr" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.5 文件向量化(单文件)

curl -X POST "http://localhost:8080/api/collection/public_kb/vectorize?fileId=36" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.6 批量文件向量化

curl -X POST "http://localhost:8080/api/collection/public_kb/vectorize/batch?fileIds=1&fileIds=2&fileIds=3" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.7 获取文档列表

curl -X GET "http://localhost:8080/api/collection/public_kb/documents" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.8 删除文档

# 推荐:使用 fileId 精确删除(避免同名文件删除错误)
curl -X DELETE "http://localhost:8080/api/collection/public_kb/documents/test_document.pdf?fileId=56" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

# 兼容旧版本:仅使用文件名(存在同名文件风险)
curl -X DELETE "http://localhost:8080/api/collection/public_kb/documents/test_document.pdf" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.9 废止文档

curl -X POST "http://localhost:8080/api/collection/public_kb/documents/test_document.pdf/deprecate?reason=new_version" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.10 恢复已废止文档

curl -X POST "http://localhost:8080/api/collection/public_kb/documents/test_document_v2.pdf/restore" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.11 获取文档版本历史

curl -X GET "http://localhost:8080/api/collection/public_kb/documents/test_document.pdf/versions?limit=10" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.12 获取向量库切片列表

curl -X GET "http://localhost:8080/api/collection/public_kb/chunks?limit=100&offset=0" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.13 获取文档切片列表

curl -X GET "http://localhost:8080/api/collection/public_kb/documents/test_document.pdf/chunks?page=1&pageSize=20" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.14 新增切片

curl -X POST "http://localhost:8080/api/collection/public_kb/chunks?content=新的切片内容&section=第一章" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.15 修改切片

curl -X PUT "http://localhost:8080/api/collection/public_kb/chunks/chunk_001?content=更新后的内容&section=第一章" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

4.16 删除切片

curl -X DELETE "http://localhost:8080/api/collection/public_kb/chunks/chunk_001" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

四、知识库访问控制接口

4.1 分页查询知识库列表

curl -X GET "http://localhost:8080/api/collection-access/page?pageNum=1&pageSize=10" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -H "Content-Type: application/json"

4.2 获取知识库详情

curl -X GET "http://localhost:8080/api/collection-access/1" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -H "Content-Type: application/json"

4.3 获取用户可访问的知识库列表

curl -X GET "http://localhost:8080/api/collection-access/accessible" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -H "Content-Type: application/json"

五、AI流式问答接口

5.1 流式问答

curl -X POST "http://localhost:8080/api/ai/chat/stream" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -H "Content-Type: application/json" \
     -d '{
       "message": "市场权重计算公式",
       "session_id": ""
     }' \
     --no-buffer

5.2 中断AI流式问答

curl -X POST "http://localhost:8080/api/ai/chat/stop?sessionId=sess_1777600000000_abc123" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.3 获取用户会话列表

curl -X GET "http://localhost:8080/api/ai/sessions?page=1&pageSize=10" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.4 获取会话详情

curl -X GET "http://localhost:8080/api/ai/session/sess_123456789" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.5 获取消息文件来源列表

curl -X GET "http://localhost:8080/api/ai/message/1/sources" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.6 获取消息引用信息

curl -X GET "http://localhost:8080/api/ai/message/1/references" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.7 获取会话引用信息

curl -X GET "http://localhost:8080/api/ai/session/sess_123456789/references" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.8 删除单个会话

curl -X DELETE "http://localhost:8080/api/ai/session/sess_123456789" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

5.9 批量删除会话

curl -X DELETE "http://localhost:8080/api/ai/sessions" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
     -d '["sess_001", "sess_002", "sess_003"]'

六、反馈管理接口

6.1 提交反馈

curl -X POST "http://localhost:8080/api/feedback" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "sessionId": "sess_test_001",
    "query": "出差补助标准是什么?",
    "answer": "根据公司规定国内出差补助标准为每天200元。",
    "rating": 1,
    "reason": "回答准确详细",
    "sources": ["出差报销制度.pdf"]
  }'

6.2 获取反馈列表

curl -X GET "http://localhost:8080/api/feedback/list?page=1&page_size=10" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

6.3 获取反馈统计

curl -X GET "http://localhost:8080/api/feedback/stats" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

6.4 获取差评案例

curl -X GET "http://localhost:8080/api/feedback/bad-cases" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

七、FAQ管理接口

7.1 获取FAQ列表

curl -X GET "http://localhost:8080/api/faq?page=1&page_size=10" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

7.2 获取FAQ建议列表

curl -X GET "http://localhost:8080/api/faq/suggestions?page=1&page_size=10" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

7.3 批准FAQ建议

curl -X POST "http://localhost:8080/api/faq/suggestions/1/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{"answer": "修改后的标准答案内容"}'

7.4 拒绝FAQ建议

curl -X POST "http://localhost:8080/api/faq/suggestions/1/reject" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

八、图片管理接口

8.0 图片完整处理流程测试

8.0.1 整体流程说明

本系统实现了完整的AI图片处理流程

用户提问 → RAG服务返回 → 图片提取 → 下载保存 → 数据库存储 → API访问 → 前端展示

8.0.2 步骤1AI流式问答包含图片

curl -X POST "http://localhost:8080/api/ai/chat/stream" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "message": "2003—2022 年,三峡电站累计发电量是多少?最好带图片说明",
    "session_id": ""
  }' \
  --no-buffer

预期返回的 finish 事件包含 images 数组:

{
  "type": "finish",
  "images": [
    {
      "id": "ab77281e7913.jpg",
      "score": 7.8,
      "type": "chart",
      "source": "三峡公报_1-15页.pdf",
      "page": 12,
      "description": "这是一张柱状图...",
      "full_description": "这是一张柱状图,展示了...",
      "url": "/images/ab77281e7913.jpg"
    }
  ]
}

8.0.3 步骤2获取图片数据二进制

curl -X GET "http://localhost:8080/api/image/ab77281e7913.jpg/data" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -o downloaded_image.jpg

验证下载的文件:

# 查看文件信息
ls -lh downloaded_image.jpg

# 查看文件类型
file downloaded_image.jpg

# 查看文件大小
wc -c downloaded_image.jpg

预期输出:

-rw-r--r-- 1 root root 79827 May 19 15:37 downloaded_image.jpg
downloaded_image.jpg: JPEG image data, ...
79827 downloaded_image.jpg

8.0.4 步骤3获取图片详情JSON

curl -X GET "http://localhost:8080/api/image/1" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

预期返回:

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 1,
    "imageId": "ab77281e7913.jpg",
    "filename": "ab77281e7913.jpg",
    "path": "/img/ab77281e7913.jpg",
    "sizeBytes": 79827,
    "format": "JPEG",
    "source": "三峡公报_1-15页.pdf",
    "page": 12,
    "type": "chart",
    "description": "这是一张柱状图展示了2003年至2022年发电量的变化趋势...",
    "fullDescription": "这是一张柱状图展示了2003年至2022年发电量单位亿千瓦时的变化趋势...",
    "score": 7.8
  }
}

8.0.5 步骤4查看数据库中的图片记录

mysql -h localhost -u root -p knowledge_management_system -e "SELECT id, image_id, path, format, size_bytes, source, page, type, score FROM context_image LIMIT 5;"

预期输出:

+----+-------------------------+--------------------------+--------+-------------+-------------------------------+------+-------+-------+
| id | image_id                | path                     | format | size_bytes  | source                        | page | type  | score |
+----+-------------------------+--------------------------+--------+-------------+-------------------------------+------+-------+-------+
|  1 | ab77281e7913.jpg       | /img/ab77281e7913.jpg    | JPEG   |       79827 | 三峡公报_1-15页.pdf          |   12 | chart |  7.80 |
+----+-------------------------+--------------------------+--------+-------------+-------------------------------+------+-------+-------+

8.1 获取图片列表

curl -X GET "http://localhost:8080/api/image/list?limit=10&offset=0" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

8.2 获取单张图片

curl -X GET "http://localhost:8080/api/image/img_001" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -o downloaded_image.jpg

8.3 获取图片统计

curl -X GET "http://localhost:8080/api/image/stats" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

九、报告管理接口

9.1 获取周报

curl -X GET "http://localhost:8080/api/report/weekly" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

9.2 获取月报

curl -X GET "http://localhost:8080/api/report/monthly" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

十、知识检索接口

10.1 混合检索

curl -X POST "http://localhost:8080/api/search" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "query": "出差补助标准",
    "topK": 5,
    "collections": ["public_kb", "dept"]
  }'

十一、知识库路由接口

11.1 测试知识库路由

curl -X POST "http://localhost:8080/api/kb-route" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "query": "财务部的报销流程是什么"
  }'

十二、模拟考接口 🔵 模拟考

12.1 生成试卷(按权限范围)

curl -X POST "http://localhost:8080/api/exam/paper/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "single_choice_count": 5,
    "multiple_choice_count": 3,
    "true_false_count": 2,
    "fill_blank_count": 2,
    "subjective_count": 1,
    "difficulty": 3,
    "include_personal": false
  }'

12.2 生成试卷(指定文件)

curl -X POST "http://localhost:8080/api/exam/paper/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "single_choice_count": 5,
    "multiple_choice_count": 3,
    "true_false_count": 2,
    "fill_blank_count": 2,
    "subjective_count": 1,
    "difficulty": 3,
    "file_ids": [1, 2, 3]
  }'

12.3 生成题目

重要说明:此接口为异步接口,请求后立即返回任务提交状态,实际生成在后台执行。需通过 GET /api/file/{fileId} 接口轮询查询生成进度和结果。

测试用例1智能生成模式推荐

不提供 question_types 参数AI 会根据文档内容自动判断题型和数量:

curl -X POST "http://localhost:8080/api/exam/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "file_id": 74,
    "difficulty": 3,
    "request_id": "gen_req_smart_001"
  }'

测试用例2指定题型模式 - 通过 file_id 指定文件

注意:系统会自动查询该文件已有的题目题干(exclude_stems在调用AI时传入进行去重避免生成重复题目。

curl -X POST "http://localhost:8080/api/exam/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "file_id": 69,
    "question_types": {
      "single_choice": 3,
      "multiple_choice": 2,
      "true_false": 2,
      "fill_blank": 2,
      "subjective": 1
    },
    "difficulty": 3,
    "request_id": "gen_req_001"
  }'

默认分数配置:

题型 默认分数
single_choice 2分
multiple_choice 4分
true_false 1分
fill_blank 2分
subjective 10分

预期响应:

{
  "code": 200,
  "message": "收到请求",
  "data": {
    "requestId": "gen_req_001",
    "fileId": 21,
    "fileMatchStatus": "success",
    "matchedCollection": "test1",
    "matchedFilePath": "test1/1.docx",
    "documentName": "1.docx",
    "collectionFilled": true,
    "collectionFillSource": "直接使用",
    "asyncTaskStarted": true,
    "nextStep": "请通过文件状态接口查询生成进度",
    "status": "success"
  }
}

生成完成后,通过 GET /api/file/{fileId} 接口可查询到生成结果,processMessage 字段会包含题型统计信息:

生成成功共15道题

【题型统计】
请求题型: {单选题: 10道, 填空题: 5道}
实际生成: {单选题: 10道, 填空题: 3道}

【短缺警告】
- fill_blank: 请求5道实际生成3道

测试用例3通过 file_path 指定文件

curl -X POST "http://localhost:8080/api/exam/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "file_path": "test1/1.docx",
    "collection": "test1",
    "question_types": {
      "single_choice": 3,
      "multiple_choice": 2,
      "true_false": 2,
      "fill_blank": 2,
      "subjective": 1
    },
    "difficulty": 3,
    "request_id": "gen_req_002"
  }'

测试用例4自定义题型分数

curl -X POST "http://localhost:8080/api/exam/generate" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "file_id": 21,
    "question_types": {
      "single_choice": 5,
      "multiple_choice": 3
    },
    "question_scores": {
      "single_choice": 4.00,
      "multiple_choice": 8.00
    },
    "difficulty": 3,
    "request_id": "gen_req_003"
  }'

测试用例5查询生成进度

提交请求后,通过文件状态查询接口轮询生成进度:

curl -X GET "http://localhost:8080/api/file/21" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

预期响应(生成中):

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 21,
    "fileName": "1.docx",
    "filePath": "test1/1.docx",
    "processStatus": "INDEXED",
    "examStatus": "GENERATING",
    "processMessage": "正在生成题目,请稍后...",
    "createTime": "2026-05-28T10:00:00",
    "updateTime": "2026-05-28T10:00:01"
  }
}

预期响应(生成成功):

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 21,
    "fileName": "1.docx",
    "filePath": "test1/1.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"
  }
}

AI生成题目状态说明

状态值 说明
UNGENERATED 未生成
GENERATING 正在生成
GENERATED 已生成
FAILED 生成失败

轮询策略建议:

  • 初始轮询间隔2-3秒
  • 超时时间:建议设置为 5-10 分钟
  • 停止条件:examStatus 变为 GENERATEDFAILED

默认分值说明:

题型 默认分值
单选题 (single_choice) 2分
多选题 (multiple_choice) 4分
判断题 (true_false) 1分
填空题 (fill_blank) 2分
简答题 (subjective) 6分

12.4 批改答案(日常练习)

测试用例1单选题

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_single_001",
    "answers": [
      {
        "question_id": "q_single_001",
        "question_type": "single_choice",
        "question_content": {
          "stem": "请假制度中,事假的最长申请天数为?",
          "data": {
            "options": [
              {"key": "A", "content": "3天"},
              {"key": "B", "content": "7天"},
              {"key": "C", "content": "15天"},
              {"key": "D", "content": "30天"}
            ]
          },
          "answer": "B"
        },
        "student_answer": "B",
        "max_score": 2.0
      }
    ]
  }'

测试用例2多选题

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_multi_001",
    "answers": [
      {
        "question_id": "q_multi_001",
        "question_type": "multiple_choice",
        "question_content": {
          "stem": "以下哪些属于公司福利?",
          "data": {
            "options": [
              {"key": "A", "content": "五险一金"},
              {"key": "B", "content": "年终奖金"},
              {"key": "C", "content": "带薪年假"},
              {"key": "D", "content": "加班工资"}
            ]
          },
          "answer": "ABC"
        },
        "student_answer": "AB",
        "max_score": 4.0
      }
    ]
  }'

测试用例3判断题

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_tf_001",
    "answers": [
      {
        "question_id": "q_tf_001",
        "question_type": "true_false",
        "question_content": {
          "stem": "公式\"样本零售客户期末库存/月销量\"可以用来衡量客户对货源的依赖程度。",
          "data": {"options": [{"key": "T", "content": "正确"}, {"key": "F", "content": "错误"}]},
          "answer": "F"
        },
        "student_answer": "F",
        "max_score": 1.0
      }
    ]
  }'

测试用例4填空题

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_fill_001",
    "answers": [
      {
        "question_id": "q_fill_001",
        "question_type": "fill_blank",
        "question_content": {
          "stem": "三峡电站2020年发电量达到____亿千瓦时为历年最高。",
          "data": {"blank_count": 1},
          "answer": ["1118.02"]
        },
        "student_answer": ["1118"],
        "max_score": 2.0
      }
    ]
  }'

测试用例5主观题

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_subjective_001",
    "answers": [
      {
        "question_id": "q_subjective_001",
        "question_type": "subjective",
        "question_content": {
          "stem": "请简述库存周转率的定义及其计算公式。",
          "data": {},
          "answer": "库存周转率是衡量库存管理效率的指标。公式:库存周转率 = 销售成本 / 平均库存"
        },
        "student_answer": "库存周转率是衡量库存管理效率的指标,反映了库存的周转速度。计算公式为:库存周转率 = 销售成本 / 平均库存",
        "max_score": 6.0
      }
    ]
  }'

测试用例6混合题型完整试卷

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "practice",
    "request_id": "grade_req_mixed_001",
    "answers": [
      {
        "question_id": "q_001",
        "question_type": "single_choice",
        "question_content": {
          "stem": "以下哪个不是公司的核心价值观?",
          "data": {
            "options": [
              {"key": "A", "content": "诚信"},
              {"key": "B", "content": "创新"},
              {"key": "C", "content": "利润"},
              {"key": "D", "content": "责任"}
            ]
          },
          "answer": "C"
        },
        "student_answer": "C",
        "max_score": 2.0
      },
      {
        "question_id": "q_002",
        "question_type": "multiple_choice",
        "question_content": {
          "stem": "以下哪些属于人力资源部的职责?",
          "data": {
            "options": [
              {"key": "A", "content": "招聘"},
              {"key": "B", "content": "培训"},
              {"key": "C", "content": "财务"},
              {"key": "D", "content": "绩效"}
            ]
          },
          "answer": "ABD"
        },
        "student_answer": "AB",
        "max_score": 4.0
      },
      {
        "question_id": "q_003",
        "question_type": "true_false",
        "question_content": {
          "stem": "员工请假需要提前一天申请。",
          "data": {"options": [{"key": "T", "content": "正确"}, {"key": "F", "content": "错误"}]},
          "answer": "T"
        },
        "student_answer": "T",
        "max_score": 1.0
      },
      {
        "question_id": "q_004",
        "question_type": "fill_blank",
        "question_content": {
          "stem": "公司成立于____年总部位于____。",
          "data": {"blank_count": 2},
          "answer": ["2010", "北京"]
        },
        "student_answer": ["2010", "上海"],
        "max_score": 4.0
      },
      {
        "question_id": "q_005",
        "question_type": "subjective",
        "question_content": {
          "stem": "请简述绩效考核的目的和意义。",
          "data": {},
          "answer": "绩效考核的目的是评估员工工作表现,激励员工提升绩效,为薪酬调整和晋升提供依据。"
        },
        "student_answer": "绩效考核可以评估员工的工作表现,帮助发现问题并改进,同时作为薪酬和晋升的参考依据。",
        "max_score": 6.0
      }
    ]
  }'

12.5 获取考试记录

curl -X GET "http://localhost:8080/api/exam/my/papers" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

12.6 开始考试(获取题目)

curl -X POST "http://localhost:8080/api/exam/paper/paper_12345678-1234-1234-1234-123456789abc-start" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

12.7 获取考试结果

curl -X GET "http://localhost:8080/api/exam/record/record_12345678-1234-1234-1234-123456789abc/result" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

12.8 查询用户答题记录(按试卷)

curl -X POST "http://localhost:8080/api/exam/answers/query" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "paper_id": "paper_12345678-1234-1234-1234-123456789abc"
  }'

12.9 查询用户答题记录(按会话)

curl -X POST "http://localhost:8080/api/exam/answers/query" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "session_id": "sess_practice_001"
  }'

十三、题目管理接口

13.1 获取题目列表(按权限过滤)

curl -X GET "http://localhost:8080/api/question/list?questionType=&difficulty=&status=&documentName=&limit=10" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

13.2 创建题目

curl -X POST "http://localhost:8080/api/question" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "question_type": "single_choice",
    "difficulty": 3,
    "content": {
      "stem": "测试题目",
      "data": {
        "options": [
          {"key": "A", "content": "选项A"},
          {"key": "B", "content": "选项B"},
          {"key": "C", "content": "选项C"},
          {"key": "D", "content": "选项D"}
        ]
      },
      "answer": "B",
      "explanation": "测试解析"
    },
    "score": 5.0,
    "document_name": "public_kb/test.docx"
  }'

13.3 题目统计

curl -X POST "http://localhost:8080/api/question/stats" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "status": "approved",
    "question_types": ["single_choice", "multiple_choice"]
  }'

十四、正式考试接口 🟢 正式考

14.1 开始考试(获取题目)

curl -X POST "http://localhost:8080/api/formal-exam/paper/paper_12345678-1234-1234-1234-123456789abc/start" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

14.2 提交考试(通过 recordId 方式,推荐)

curl -X POST "http://localhost:8080/api/exam/record/record_12345678-1234-1234-1234-123456789abc/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "answers": [
      {"questionId": "q_001", "questionType": "true_false", "answer": true},
      {"questionId": "q_002", "questionType": "subjective", "answer": "该指标用于衡量库存与销售的匹配程度。"},
      {"questionId": "q_003", "questionType": "fill_blank", "answer": ["散点图","销量"]},
      {"questionId": "q_004", "questionType": "single_choice", "answer": "B"},
      {"questionId": "q_005", "questionType": "multiple_choice", "answer": ["A","C","D"]}
    ]
  }'

14.3 提交考试(通过 /api/exam/grade 方式,支持完整题目信息)

curl -X POST "http://localhost:8080/api/exam/grade" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "type": "formal_exam",
    "record_id": "record_12345678-1234-1234-1234-123456789abc",
    "answers": [
      {
        "question_id": "q_001",
        "question_type": "true_false",
        "question_content": {
          "stem": "公式\"样本零售客户期末库存/月销量\"可以用来衡量客户对货源的依赖程度。",
          "data": {"options": [{"key": "T", "content": "正确"}, {"key": "F", "content": "错误"}]},
          "answer": "F"
        },
        "student_answer": true,
        "max_score": 3.0
      }
    ]
  }'

14.4 获取考试结果

curl -X GET "http://localhost:8080/api/formal-exam/record/record_12345678-1234-1234-1234-123456789abc/result" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A"

十五、正式考管理接口 🟢 正式考管理

15.1 预览试卷

curl -X POST "http://localhost:8080/api/admin/exam/paper/preview" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "single_choice_count": 1,
    "multiple_choice_count": 1,
    "true_false_count": 1,
    "fill_blank_count": 2,
    "subjective_count": 1,
    "difficulty": 3
  }'

15.2 保存试卷

curl -X POST "http://localhost:8080/api/admin/exam/paper/save" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "title": "月度考核试卷",
    "questionIds": [
      "q_001",
      "q_002",
      "q_003",
      "q_004",
      "q_005",
      "q_006"
    ]
  }'

15.3 发布试卷

curl -X POST "http://localhost:8080/api/admin/exam/paper/paper_12345678-1234-1234-1234-123456789abc/publish" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTc4MDY0Njg2MSwiZXhwIjoxNzgwNjU0MDYxfQ.lNjvlKtxVRwjX9Ce2IO0M0NxB_Dm2vxkGlynBMUt6sjdUKr-R57nXhLcxHSM92gtaJYZHczYSU4l6eDWQ0a56A" \
  -d '{
    "exam_name": "月度考核",
    "start_time": "2026-06-01 09:00:00",
    "end_time": "2026-06-01 11:00:00",
    "duration_minutes": 120,
    "department_ids": ["dept_001", "dept_002"],
    "allow_retake": false
  }'