初始化项目代码

This commit is contained in:
2026-06-03 12:43:48 +08:00
commit 5b12356567
303 changed files with 40729 additions and 0 deletions

View File

@@ -0,0 +1,399 @@
# AIChatController 交互流程图
## 1. AI流式问答流程 (/ai/chat/stream)
### 1.1 流程图
```mermaid
flowchart TD
A[开始: 用户发起AI问答] --> B{用户已登录?}
B -->|否| C[返回错误: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回错误: 用户信息获取失败]
D -->|是| F[获取部门信息]
F --> G[获取用户可访问知识库]
G --> H{知识库列表为空?}
H -->|是| I[返回错误: 没有可用的知识库]
H -->|否| J[获取或生成session_id]
J --> K[从数据库获取历史记录]
K --> L[调用AI服务进行流式问答]
L --> M[返回SseEmitter流式响应]
C --> N[结束]
E --> N
I --> N
M --> N
```
### 1.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Dept as DepartmentService
participant KB as KnowledgeBasePathService
participant Chat as ChatService
participant AIChat as AiChatService
Client->>+AI: POST /ai/chat/stream
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Dept: getDepartmentById(deptId)
Dept-->>-AI: Department
AI->>+KB: getUserAccessibleKnowledgeBaseNames(userId, deptId, deptCode)
KB-->>-AI: List<String> collections
alt 知识库为空
AI-->>Client: 错误: 没有可用的知识库
end
AI->>+Chat: getSessionMessagesAsHistory(sessionId)
Chat-->>-AI: List<HistoryItem>
AI->>+AIChat: streamFromRagService(request, userId, deptId)
loop 流式响应
AIChat-->>Client: SSE事件流
end
AIChat-->>-AI: SseEmitter
AI-->>-Client: SseEmitter流式响应
```
### 1.3 流程说明
| 步骤 | 说明 | 代码位置 |
|------|------|----------|
| 1. 用户发起请求 | POST /ai/chat/stream | AIChatController:56 |
| 2. 验证登录状态 | 检查Authorization header | AIChatController:61-73 |
| 3. 验证用户信息 | validateToken获取用户 | AIChatController:75-87 |
| 4. 获取部门信息 | 根据deptId获取Department | AIChatController:94-104 |
| 5. 获取知识库列表 | getUserAccessibleKnowledgeBaseNames | AIChatController:106 |
| 6. 生成session_id | 无session_id时生成新的 | AIChatController:123-127 |
| 7. 获取历史记录 | getSessionMessagesAsHistory | AIChatController:134-140 |
| 8. 调用AI服务 | streamFromRagService | AIChatController:145 |
---
## 2. 获取用户会话列表 (/ai/sessions)
### 2.1 流程图
```mermaid
flowchart TD
A[开始: 获取会话列表] --> B{用户已登录?}
B -->|否| C[返回: success=false, 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E[实现简单分页]
E --> F[返回会话列表及分页信息]
C --> G[结束]
F --> G
```
### 2.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: GET /ai/sessions
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 实现简单分页<br/>计算start/end
AI-->>-Client: 返回会话列表及分页信息
```
### 2.3 流程说明
| 步骤 | 说明 | 代码位置 |
|------|------|----------|
| 1. 用户发起请求 | GET /ai/sessions | AIChatController:163 |
| 2. 验证登录状态 | getCurrentUserId | AIChatController:170-175 |
| 3. 获取会话列表 | chatService.getUserSessions | AIChatController:177 |
| 4. 分页处理 | 计算start/end | AIChatController:179-185 |
| 5. 返回结果 | 返回data/total/page等信息 | AIChatController:187-192 |
---
## 3. 获取会话详情 (/ai/session/{sessionId})
### 3.1 流程图
```mermaid
flowchart TD
A[开始: 获取会话详情] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E{会话属于当前用户?}
E -->|否| F[返回: 无权访问该会话]
E -->|是| G[获取会话消息列表]
G --> H[实现简单分页]
H --> I[返回会话详情及分页信息]
C --> J[结束]
F --> J
I --> J
```
### 3.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: GET /ai/session/{sessionId}
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 验证会话所属权
alt 会话不属于用户
AI-->>Client: 错误: 无权访问该会话
else 会话属于用户
AI->>+Chat: getSessionMessages(sessionId)
Chat-->>-AI: List<ChatMessage>
Note over AI: 实现简单分页
AI-->>-Client: 返回会话详情及分页信息
end
```
---
## 4. 删除单个会话 (/ai/session/{sessionId})
### 4.1 流程图
```mermaid
flowchart TD
A[开始: 删除单个会话] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E{会话属于当前用户?}
E -->|否| F[返回: 无权删除该会话]
E -->|是| G[执行删除操作]
G --> H{删除成功?}
H -->|是| I[返回: 删除成功]
H -->|否| J[返回: 删除失败]
C --> K[结束]
F --> K
I --> K
J --> K
```
### 4.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: DELETE /ai/session/{sessionId}
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 验证会话所属权
alt 会话不属于用户
AI-->>Client: 错误: 无权删除该会话
else 会话属于用户
AI->>+Chat: deleteSession(sessionId, userId)
Chat-->>-AI: boolean success
alt 删除成功
AI-->>Client: {success: true, message: "删除成功"}
else 删除失败
AI-->>Client: {success: false, message: "删除失败"}
end
end
```
---
## 5. 批量删除会话 (/ai/sessions)
### 5.1 流程图
```mermaid
flowchart TD
A[开始: 批量删除会话] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{sessionIds列表有效?}
D -->|否| E[返回: 会话ID列表不能为空]
D -->|是| F[获取用户所有会话]
F --> G[提取用户会话ID集合]
G --> H{所有会话属于用户?}
H -->|否| I[返回: 无权删除部分会话]
H -->|是| J[执行批量删除]
J --> K{删除成功?}
K -->|是| L[返回: 批量删除成功]
K -->|否| M[返回: 批量删除失败]
C --> N[结束]
E --> N
I --> N
L --> N
M --> N
```
### 5.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: DELETE /ai/sessions
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
alt sessionIds为空
AI-->>Client: 错误: 会话ID列表不能为空
end
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 提取用户会话ID集合<br/>验证所有会话属于用户
alt 部分会话不属于用户
AI-->>Client: 错误: 无权删除部分会话
else 所有会话属于用户
AI->>+Chat: deleteSessions(sessionIds, userId)
Chat-->>-AI: boolean success
alt 删除成功
AI-->>Client: {success: true, deletedCount: N}
else 删除失败
AI-->>Client: {success: false, message: "批量删除失败"}
end
end
```
---
## 6. 中断AI流式问答 (/ai/chat/stop)
### 6.1 流程图
```mermaid
flowchart TD
A[开始: 中断AI问答] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[调用sseEmitterManager.stop]
D --> E{中断成功?}
E -->|是| F[返回: 已中断AI回答]
E -->|否| G[返回: 未找到活跃AI进程]
C --> H[结束]
F --> H
G --> H
```
### 6.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant SSE as SseEmitterManager
Client->>+AI: POST /ai/chat/stop
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+SSE: stop(sessionId)
SSE-->>-AI: boolean success
alt 中断成功
AI-->>Client: {success: true, message: "已中断AI回答"}
else 中断失败
AI-->>Client: {success: false, message: "未找到活跃的AI进程或已结束"}
end
```
---
## 核心服务调用关系
```mermaid
flowchart LR
subgraph Controller
AI[AIChatController]
end
subgraph Service
AS[AuthService]
CS[ChatService]
ACS[AiChatService]
SS[SseEmitterManager]
KBS[KnowledgeBasePathService]
DS[DepartmentService]
end
subgraph Entity
U[User]
D[Department]
CS1[ChatSession]
CM[ChatMessage]
CR[ChatReference]
end
subgraph Database
DB[(MySQL)]
end
AI --> AS
AI --> CS
AI --> ACS
AI --> SS
AI --> KBS
AI --> DS
AS --> U
CS --> CS1
CS --> CM
CS --> CR
KBS --> DB
DS --> U
DS --> D
```
---
## 接口汇总
| 接口 | 方法 | 路径 | 功能 |
|------|------|------|------|
| chatStream | POST | /ai/chat/stream | AI流式问答 |
| getUserSessions | GET | /ai/sessions | 获取用户会话列表 |
| getSessionDetail | GET | /ai/session/{sessionId} | 获取会话详情 |
| getMessageReferences | GET | /ai/message/{messageId}/references | 获取消息引用 |
| getSessionReferences | GET | /ai/session/{sessionId}/references | 获取会话引用 |
| deleteSession | DELETE | /ai/session/{sessionId} | 删除单个会话 |
| deleteSessions | DELETE | /ai/sessions | 批量删除会话 |
| stopChatStream | POST | /ai/chat/stop | 中断AI流式问答 |

View File

@@ -0,0 +1,522 @@
# FileController 交互流程图
## 接口总览
| 接口 | 方法 | 路径 | 功能 |
|------|------|------|------|
| pageFiles | GET | /file/page | 分页查询文件 |
| getFileById | GET | /file/{id} | 查询文件详情 |
| uploadFile | POST | /file/upload | 上传文件 |
| ragStream | POST | /file/rag/stream | RAG流式问答 |
| downloadFile | GET | /file/download/{id} | 下载文件(已禁用) |
| getFileContent | GET | /file/content/{id} | 获取文件内容(已禁用) |
| getFileInfo | GET | /file/info/{id} | 获取文件详细信息 |
| deleteFile | DELETE | /file/{id} | 删除文件 |
| approveFile | POST | /file/audit/approve/{id} | 审核通过 |
| rejectFile | POST | /file/audit/reject/{id} | 审核拒绝 |
| getPendingFiles | GET | /file/audit/pending | 查询待审核文件列表 |
| updateFileInfo | PUT | /file/{id} | 更新文件信息 |
---
## 1. 分页查询文件 (/file/page)
### 1.1 流程图
```mermaid
flowchart TD
A[开始: 分页查询文件] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F[调用fileService.pageFiles]
F --> G[返回分页结果]
C --> H[结束]
E --> H
G --> H
```
### 1.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
Client->>+FC: GET /file/page
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
FC->>+FS: pageFiles(pageNum, pageSize, fileName, user)
FS-->>-FC: PageResult<FileVO>
FC-->>-Client: 返回分页结果
```
---
## 2. 查询文件详情 (/file/{id})
### 2.1 流程图
```mermaid
flowchart TD
A[开始: 查询文件详情] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F[调用fileService.getFileById]
F --> G[返回文件详情]
C --> H[结束]
E --> H
G --> H
```
### 2.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
Client->>+FC: GET /file/{id}
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
FC->>+FS: getFileById(id, user)
FS-->>-FC: FileVO
FC-->>-Client: 返回文件详情
```
---
## 3. 上传文件 (/file/upload)
### 3.1 流程图
```mermaid
flowchart TD
A[开始: 上传文件] --> B[校验文件]
B --> C{文件校验通过?}
C -->|否| D[返回错误信息]
C -->|是| E{用户已登录?}
E -->|否| F[返回: 用户未登录]
E -->|是| G{用户信息获取成功?}
G -->|否| H[返回: 用户信息获取失败]
G -->|是| I[调用fileService.uploadFile]
I --> J{有文件描述?}
J -->|是| K[更新文件描述]
K --> L[返回FileVO]
J -->|否| L[返回FileVO]
D --> M[结束]
F --> M
H --> M
L --> M
```
### 3.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant FU as FileUtil
participant Auth as AuthService
participant FS as FileService
Client->>+FC: POST /file/upload
FC->>+FU: validateFile(file)
alt 文件校验失败
FU-->>-FC: 抛出异常
FC-->>Client: 返回错误信息
end
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
FC->>+FS: uploadFile(file, userId, deptId, userType, targetDeptId, isPublic)
FS-->>-FC: FileVO
alt 有描述信息
FC->>+FS: updateFileDescription(fileId, description)
FS-->>-FC: void
end
FC-->>-Client: 返回FileVO
```
---
## 4. RAG流式问答 (/file/rag/stream)
### 4.1 流程图
```mermaid
flowchart TD
A[开始: RAG流式问答] --> B{用户已登录?}
B -->|否| C[返回错误: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回错误: 用户信息获取失败]
D -->|是| F[设置collections为public_kb]
F --> G[生成session_id]
G --> H[调用aiChatService.streamFromRagService]
H --> I[返回SseEmitter流式响应]
C --> J[结束]
E --> J
I --> J
```
### 4.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant Auth as AuthService
participant AI as AiChatService
Client->>+FC: POST /file/rag/stream
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
Note over FC: 设置collections<br/>collections.add("public_kb")<br/>生成session_id
FC->>+AI: streamFromRagService(request, userId, deptId)
loop 流式响应
AI-->>Client: SSE事件流
end
AI-->>-FC: SseEmitter
FC-->>-Client: SseEmitter流式响应
```
---
## 5. 删除文件 (/file/{id})
### 5.1 流程图
```mermaid
flowchart TD
A[开始: 删除文件] --> B[调用fileService.deleteFile]
B --> C[返回成功]
```
### 5.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant FS as FileService
Client->>+FC: DELETE /file/{id}
FC->>+FS: deleteFile(id)
FS-->>-FC: void
FC-->>-Client: 返回成功
```
---
## 6. 审核通过文件 (/file/audit/approve/{id})
### 6.1 流程图
```mermaid
flowchart TD
A[开始: 审核通过] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F{有管理员权限?}
F -->|否| G[返回: 无权限]
F -->|是| H[调用fileService.approveFile]
H --> I[返回成功]
C --> J[结束]
E --> J
G --> J
I --> J
```
### 6.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 管理员
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
Client->>+FC: POST /file/audit/approve/{id}
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
Note over FC: 检查userType==1或userType==2
alt 无管理员权限
FC-->>Client: 返回: 无权限执行此操作
else 有管理员权限
FC->>+FS: approveFile(id, userId)
FS-->>-FC: void
FC-->>Client: 返回成功
end
```
---
## 7. 审核拒绝文件 (/file/audit/reject/{id})
### 7.1 流程图
```mermaid
flowchart TD
A[开始: 审核拒绝] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F{有管理员权限?}
F -->|否| G[返回: 无权限]
F -->|是| H[调用fileService.rejectFile]
H --> I[返回成功]
C --> J[结束]
E --> J
G --> J
I --> J
```
### 7.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 管理员
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
Client->>+FC: POST /file/audit/reject/{id}
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
Note over FC: 检查userType==1或userType==2
alt 无管理员权限
FC-->>Client: 返回: 无权限执行此操作
else 有管理员权限
FC->>+FS: rejectFile(id, userId)
FS-->>-FC: void
FC-->>Client: 返回成功
end
```
---
## 8. 查询待审核文件列表 (/file/audit/pending)
### 8.1 流程图
```mermaid
flowchart TD
A[开始: 查询待审核列表] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F{有管理员权限?}
F -->|否| G[返回: 无权限]
F -->|是| H[调用fileService.getPendingFiles]
H --> I[返回分页结果]
C --> J[结束]
E --> J
G --> J
I --> J
```
### 8.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 管理员
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
Client->>+FC: GET /file/audit/pending
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
Note over FC: 检查userType==1或userType==2
alt 无管理员权限
FC-->>Client: 返回: 无权限执行此操作
else 有管理员权限
FC->>+FS: getPendingFiles(pageNum, pageSize)
FS-->>-FC: PageResult<FileVO>
FC-->>Client: 返回分页结果
end
```
---
## 9. 更新文件信息 (/file/{id})
### 9.1 流程图
```mermaid
flowchart TD
A[开始: 更新文件信息] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回: 用户信息获取失败]
D -->|是| F[获取原文件信息]
F --> G{文件存在?}
G -->|否| H[返回: 文件不存在]
G -->|是| I{isPublic变更?}
I -->|是| J[重建文件路径]
J --> K[移动文件到新路径]
K --> L[更新文件信息]
I -->|否| L[直接更新文件信息]
L --> M[返回更新后的文件]
C --> N[结束]
E --> N
H --> N
M --> N
```
### 9.2 时序图
```mermaid
sequenceDiagram
autonumber
participant Client as 用户
participant FC as FileController
participant Auth as AuthService
participant FS as FileService
participant Dept as DepartmentService
participant UM as UserMapper
Client->>+FC: PUT /file/{id}
FC->>+Auth: validateToken(token)
Auth-->>-FC: User对象
FC->>+FS: getFileEntityById(id)
FS-->>-FC: File对象
alt 文件不存在
FC-->>Client: 返回: 文件不存在
end
alt isPublic变更
FC->>+Dept: getDepartmentFullPath(deptId)
Dept-->>-FC: fullPath
Note over FC: rebuildFilePath<br/>创建新路径
FC->>FC: Files.move移动文件
FC->>+FS: updateFileEntity(file)
FS-->>-FC: void
else 仅更新描述
FC->>+FS: updateFileEntity(file)
FS-->>-FC: void
end
FC->>UM: selectById(uploadUserId)
UM-->>FC: User
FC->>FC: convertToVO(file)
FC-->>-Client: 返回FileVO
```
---
## 10. 已禁用的接口
### 10.1 下载文件 (/file/download/{id})
```mermaid
flowchart TD
A[开始: 下载文件] --> B[直接返回403 Forbidden]
```
### 10.2 获取文件内容 (/file/content/{id})
```mermaid
flowchart TD
A[开始: 获取文件内容] --> B[直接返回错误: 文件内容获取功能已禁用]
```
---
## 核心服务调用关系
```mermaid
flowchart LR
subgraph Controller
FC[FileController]
end
subgraph Service
FS[FileService]
AI[AiChatService]
DS[DepartmentService]
end
subgraph Util
FU[FileUtil]
end
subgraph Mapper
UM[UserMapper]
end
subgraph Entity
F[File]
U[User]
D[Department]
FV[FileVO]
end
FC --> FS
FC --> AI
FC --> DS
FC --> FU
FC --> UM
FS --> F
FS --> FV
DS --> D
UM --> U
```
---
## 权限说明
| 接口 | 普通用户 | 部门管理员 | 系统管理员 |
|------|---------|-----------|-----------|
| 分页查询文件 | ✅ | ✅ | ✅ |
| 查询文件详情 | ✅ | ✅ | ✅ |
| 上传文件 | ✅ | ✅ | ✅ |
| RAG流式问答 | ✅ | ✅ | ✅ |
| 下载文件 | ❌ 已禁用 | ❌ 已禁用 | ❌ 已禁用 |
| 获取文件内容 | ❌ 已禁用 | ❌ 已禁用 | ❌ 已禁用 |
| 获取文件信息 | ✅ | ✅ | ✅ |
| 删除文件 | - | - | - |
| 审核通过 | ❌ | ✅ | ✅ |
| 审核拒绝 | ❌ | ✅ | ✅ |
| 查询待审核列表 | ❌ | ✅ | ✅ |
| 更新文件信息 | ✅ | ✅ | ✅ |

View File

@@ -0,0 +1,542 @@
# 知识库管理系统 - 出题做题生成流程
## 文档信息
| 项目 | 内容 |
| -------- | ----------- |
| **文档名称** | 出题做题生成流程示意图 |
| **版本号** | V1.0.0 |
| **发布日期** | 2026-05-10 |
***
## 一、整体流程概述
本系统的出题做题流程主要包含两大核心环节:
1. **题目生成流程**:从文档中自动/手动生成题目,经过审核后进入题库
2. **答题考试流程**:用户获取试卷、答题、提交、获得成绩
***
## 二、题目生成流程
### 2.1 流程图
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 题目生成流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 上传文档 │───▶│ 文件向量化 │───▶│ 题目生成 │ │
│ │ (FileUpload) │ │ (Vectorize) │ │ (Generate) │ │
│ └──────────────┘ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 题目审核 │ │
│ │ (Review) │ │
│ └───────┬──────┘ │
│ ┌─┴─┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 审核通过 │ │ 审核拒绝 │ │
│ │ Approved │ │ Rejected │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 进入题库 │ │ 返回修改 │ │
│ │ (Question │ │ (Modify) │ │
│ │ Bank) │ └──────────────┘ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 试卷生成 │ │
│ │ (Paper │ │
│ │ Generate) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 2.2 详细流程说明
| 步骤 | 阶段 | 接口 | 说明 |
| -- | ----- | ---------------------------------------- | ------------- |
| 1 | 文档上传 | `POST /api/file/upload` | 用户上传文档,保存到服务器 |
| 2 | 文件向量化 | `POST /api/collections/{name}/vectorize` | 将文档内容转换为向量存储 |
| 3 | 题目生成 | `POST /api/exam/generate` | 根据文档内容自动生成题目 |
| 4 | 题目审核 | `PUT /api/question/review/{questionId}` | 人工审核生成的题目 |
| 5 | 进入题库 | 自动 | 审核通过的题目进入题库 |
| 6 | 试卷生成 | `POST /api/exam/paper/generate` | 根据配置从题库生成试卷 |
### 2.3 题目类型
| 类型 | 英文标识 | 说明 |
| --- | ---------------- | ------------ |
| 单选题 | single\_choice | 从选项中选择一个正确答案 |
| 多选题 | multiple\_choice | 从选项中选择多个正确答案 |
| 判断题 | true\_false | 判断陈述是否正确 |
| 填空题 | fill\_blank | 填写正确答案 |
| 简答题 | subjective | 主观题,需要文字回答 |
***
## 三、答题考试流程
### 3.1 流程图
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 答题考试流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 获取试卷列表 │───▶│ 选择试卷 │───▶│ 开始答题 │ │
│ │ (My Papers) │ │ (Select) │ │ (Start) │ │
│ └──────────────┘ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ 答题界面 │ │
│ │ (Answer) │ │
│ └──────────┬─────────┘ │
│ │ │
│ ┌──────────┴─────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 保存答案 │ │ 提交试卷 │ │
│ │ (Save) │ │ (Submit) │ │
│ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ AI批改答案 │ │
│ │ (Grade) │ │
│ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 显示成绩 │ │
│ │ (Result) │ │
│ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 错题收集 │ │
│ │ (Wrong Q) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 3.2 详细流程说明
| 步骤 | 阶段 | 接口 | 说明 |
| -- | ------ | ----------------------------------------- | ---------- |
| 1 | 获取试卷列表 | `GET /api/exam/my/papers` | 获取用户有权限的试卷 |
| 2 | 获取试卷详情 | `GET /api/exam/paper/{paperId}` | 获取试卷内容 |
| 3 | 开始答题 | `POST /api/exam/record/{recordId}/start` | 标记开始考试 |
| 4 | 保存答案 | `PUT /api/exam/record/{recordId}/save` | 保存单题答案 |
| 5 | 提交试卷 | `POST /api/exam/record/{recordId}/submit` | 提交全部答案 |
| 6 | AI批改 | 后台自动 | AI自动批改答案 |
| 7 | 获取结果 | `GET /api/exam/record/{recordId}/result` | 获取考试成绩 |
| 8 | 错题收集 | 自动 | 自动将错题加入错题本 |
***
## 四、数据流向图
### 4.1 题目生成数据流向
```
用户上传 ──▶ File表 ──▶ 向量库 ──▶ 题目生成 ──▶ Question表(待审核)
┌─────────────────┐
│ 审核流程 │
└────────┬────────┘
┌──────────────┴──────────────┐
▼ ▼
Question表(已通过) Question表(已拒绝)
ExamPaper表(试卷)
```
### 4.2 答题数据流向
```
ExamPaper表 ──▶ 用户答题 ──▶ UserAnswer表 ──▶ AI批改 ──▶ ExamRecord表
WrongQuestion表
```
***
## 五、状态流转
### 5.1 题目状态
```
pending(待审核)
├─▶ approved(已通过) ──▶ 进入题库
└─▶ rejected(已拒绝) ──▶ 可重新编辑
```
### 5.2 考试记录状态
```
created(已创建)
started(进行中)
├─▶ submitted(已提交)
│ │
│ ▼
│ graded(已批改)
└─▶ expired(已过期)
```
***
## 六、核心数据库表关系
```
┌──────────┐ ┌───────────┐ ┌────────────┐
│ File │ │ Question │ │ ExamPaper │
├──────────┤ ├───────────┤ ├────────────┤
│ id │ │ id │ │ id │
│ fileName │◀──────│ fileId │◀───────│ questions │
│ filePath │ │ content │ │ title │
│ status │ │ status │ │ status │
│ examStatus│ │ difficulty│ └────────────┘
└──────────┘ └─────┬─────┘
┌──────────────┐ ┌────────────────┐
│ UserAnswer │ │ ExamRecord │
├──────────────┤ ├────────────────┤
│ questionId │◀───────│ id │
│ answer │ │ paperId │
│ isCorrect │ │ userId │
│ score │ │ totalScore │
└──────────────┘ └────────────────┘
```
***
## 七、流程时序图
### 7.1 题目生成时序
```
用户 FileController FileServiceImpl CollectionController
│ │ │ │
│ 上传文件 │ │ │
├─────────────▶│ │ │
│ │ 保存文件 │ │
│ ├─────────────────▶│ │
│ │ │ │
│ 向量化 │ │ │
├─────────────▶│ │ 调用向量化接口 │
│ │ ├───────────────────▶│
│ │ │ │
│ 生成题目 │ │ │
├─────────────▶│ │ 调用AI生成题目 │
│ │ ├───────────────────▶│
│ │ │ │
│ 审核题目 │ │ │
├─────────────▶│ │ │
│ │ 更新题目状态 │ │
│ ├─────────────────▶│ │
│ │ │ │
│ ▼ ▼ ▼
```
### 7.2 答题考试时序
```
用户 UserExamController ExamServiceImpl QuestionMapper
│ │ │ │
│ 获取试卷列表 │ │ │
├─────────────────▶│ │ │
│ │ 查询数据库 │ │
│ │ ├─────────────────▶│
│ │ │ │
│ │ 返回试卷列表 │ │
│◀─────────────────┤ │ │
│ │ │ │
│ 开始答题 │ │ │
├─────────────────▶│ │ 创建考试记录 │
│ │ ├─────────────────▶│
│ │ │ │
│ 保存答案 │ │ │
├─────────────────▶│ │ 保存答题记录 │
│ │ ├─────────────────▶│
│ │ │ │
│ 提交试卷 │ │ │
├─────────────────▶│ │ AI批改答案 │
│ │ ├─────────────────▶│
│ │ │ │
│ │ 返回考试结果 │ │
│◀─────────────────┤ │ │
│ │ │ │
│ ▼ ▼ ▼
```
***
## 八、关键业务规则
### 8.1 题目生成规则
| 规则 | 说明 |
| ------ | ------------------------------ |
| 文件状态检查 | 只有审核通过(auditStatus=1)的文件才能生成题目 |
| 难度等级 | 支持1-5级难度1最简单5最难 |
| 题目数量限制 | 每次生成最多100道题目 |
| 去重机制 | 相同内容的题目会被自动去重 |
### 8.2 试卷生成规则
| 规则 | 说明 |
| ---- | ------------------- |
| 权限范围 | 只能选择用户有权限访问的知识库中的题目 |
| 题型配比 | 根据配置的题型数量分配题目 |
| 难度均衡 | 尽量均衡分布不同难度的题目 |
| 随机抽取 | 从题库中随机抽取题目组成试卷 |
### 8.3 答题规则
| 规则 | 说明 |
| ---- | ------------ |
| 答题时间 | 每道题默认答题时间不限制 |
| 答案保存 | 支持自动保存和手动保存 |
| 提交限制 | 提交后不可修改答案 |
| 错题收集 | 自动收集错题到错题本 |
***
**文档结束**
<br />
让我先查看考试相关的实体类和数据库表结构:
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamPaper.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamRecord.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamAssignment.java
让我查看考试相关的Controller来了解完整流程
toolName: search\_by\_regex
status: success
query: AdminExamController
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\controller\AdminExamController.java
让我查看ExamPaperService的实现来了解完整流程
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\service\impl\ExamPaperServiceImpl.java
让我查看用户考试相关的Controller和Service
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\controller\UserExamController.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\service\impl\ExamRecordServiceImpl.java
## 三张考试表的完整流程说明
### 一、表结构关系
| 表名 | 中文名称 | 核心作用 |
| :---------------- | :---- | :--------------------- |
| `exam_paper` | 试卷表 | 存储试卷的基本信息(标题、描述、题目列表等) |
| `exam_assignment` | 试卷分配表 | 记录试卷发布的范围(部门、用户) |
| `exam_record` | 考试记录表 | 记录每个用户的考试状态和答题情况 |
### 二、完整业务流程
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 管理员端流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ 1. 预览试卷 → 2. 保存试卷 → 3. 发布试卷 │
│ ↓ ↓ ↓ │
│ 生成试卷内容 创建ExamPaper 更新状态为published │
│ (不保存) status=draft 创建ExamAssignment │
│ 创建ExamRecord每个用户一条
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户端流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ 4. 查看试卷列表 → 5. 查看试卷内容 → 6. 开始考试 → 7. 保存答案 │
│ ↓ ↓ ↓ ↓ │
│ 查询ExamRecord 查询ExamPaper 更新status= 更新answers字段 │
│ (属于自己的) 获取题目内容 in_progress 记录答题进度 │
│ ↓ │
│ 8. 提交试卷 → 9. 查看成绩 │
│ ↓ ↓ │
│ 调用AI批阅 查询ExamRecord │
│ 保存到UserAnswer 和UserAnswer │
│ 更新status= │
│ submitted │
└─────────────────────────────────────────────────────────────────────────────┘
```
### 三、各步骤详解
#### 阶段一:管理员预览试卷
- **接口**`POST /admin/exam/paper/preview`
- **操作**:根据条件动态生成试卷内容,**不保存到数据库**
- **目的**:让管理员在保存前预览试卷效果
#### 阶段二:管理员保存试卷
- **接口**`POST /admin/exam/paper/save`
- **数据流向**
```
ExamPaper (status=draft)
exam_paper表
```
- **关键字段**
- `paper_id`UUID唯一标识
- `question_ids`题目ID列表JSON格式
- `status``draft`
#### 阶段三:管理员发布试卷
- **接口**`POST /admin/exam/paper/{paperId}/publish`
- **数据流向**
```
1. 更新ExamPaper
status → published
publish_time → 当前时间
deadline → 截止时间
2. 创建ExamAssignment
paper_id → 试卷ID
dept_id / user_ids → 发布范围
status → active
3. 创建ExamRecord每个目标用户一条
paper_id → 试卷ID
user_id → 用户ID
status → not_started
```
#### 阶段四:用户查看试卷列表
- **接口**`GET /exam/my/papers`
- **查询条件**`user_id = 当前用户 AND status != revoked`
#### 阶段五:用户查看试卷内容
- **接口**`GET /exam/paper/{paperId}`
- **验证**确保用户有该试卷的答题权限检查ExamRecord存在
#### 阶段六:用户开始考试
- **接口**`POST /exam/record/{recordId}/start`
- **状态变更**`not_started` → `in_progress`
- **记录**`start_time`、`last_active_time`
#### 阶段七:用户保存答案
- **接口**`PUT /exam/record/{recordId}/save`
- **操作**将答案JSON序列化后存入`answers`字段
#### 阶段八:用户提交试卷
- **接口**`POST /exam/record/{recordId}/submit`
- **数据流向**
```
1. 解析用户答案 → 调用AI批阅接口
2. 保存到UserAnswer表每题一条记录
user_id, paper_id, question_id, score, is_correct, feedback
3. 更新ExamRecord
status → submitted
total_score → AI返回的总分
submit_time / graded_time → 当前时间
time_spent → 答题耗时(秒)
```
#### 阶段九:用户查看成绩
- **接口**`GET /exam/record/{recordId}/result`
- **数据来源**ExamRecord总分、状态+ UserAnswer每题详情
### 四、表关系图
```
exam_paper (试卷表)
├── 1 : 1 → exam_assignment (分配表)
│ │
│ └── 1 : N → exam_record (记录表)
│ │
│ └── 1 : N → user_answer (答题记录表)
└── 1 : N → question (题目表) via question_ids
```
### 五、状态流转
| 表 | 状态字段 | 状态值 | 说明 |
| :--------------- | :----- | :----------- | :--- |
| exam\_paper | status | draft | 草稿状态 |
| <br /> | <br /> | published | 已发布 |
| exam\_assignment | status | active | 有效分配 |
| <br /> | <br /> | revoked | 已撤销 |
| exam\_record | status | not\_started | 未开始 |
| <br /> | <br /> | in\_progress | 进行中 |
| <br /> | <br /> | submitted | 已提交 |
| <br /> | <br /> | revoked | 已撤销 |

View File

@@ -0,0 +1,328 @@
# 知识管理系统功能模块划分图
## 系统级功能结构图
```mermaid
flowchart TB
subgraph TOP["知识管理系统"]
subgraph Front["前台用户端"]
F1["用户认证"]
F2["文件管理"]
F3["题库管理"]
F4["AI对话"]
F5["个人中心"]
end
subgraph Back["后台管理端"]
B1["用户管理"]
B2["部门管理"]
B3["权限管理"]
B4["文件审核"]
B5["日志管理"]
B6["系统配置"]
end
end
```
---
## 详细功能模块划分
### 第一层:系统层
| 模块名称 | 说明 |
|---------|------|
| 知识管理系统 | 整体系统名称 |
---
### 第二层:前端/后端层
| 分类 | 说明 |
|------|------|
| 前台用户端 | 普通用户操作界面 |
| 后台管理端 | 管理员操作界面 |
---
### 第三层:功能模块层
#### 前台用户端
| 模块 | 功能列表 | 控制器 |
|------|---------|--------|
| 用户认证 | 登录、注册、Token验证 | AuthController |
| 文件管理 | 文件上传、文件查询、文件下载、RAG问答 | FileController |
| 题库管理 | 题目查询、答题练习 | QuestionController |
| AI对话 | 流式问答、会话管理、引用查看 | AIChatController |
| 个人中心 | 个人信息管理 | UserController |
#### 后台管理端
| 模块 | 功能列表 | 控制器 |
|------|---------|--------|
| 用户管理 | 用户CRUD、用户列表、用户详情 | UserController |
| 部门管理 | 部门CRUD、部门列表、部门详情 | DepartmentController |
| 权限管理 | 角色CRUD、权限分配、权限列表 | RoleController |
| 文件审核 | 待审核列表、审核通过、审核拒绝 | FileController |
| 日志管理 | 操作日志查询、日志详情 | LogController |
| 系统配置 | 知识库配置、系统参数 | - |
---
## 模块调用关系图
```mermaid
flowchart LR
subgraph User["用户层"]
U1["普通用户"]
U2["部门管理员"]
U3["系统管理员"]
end
subgraph Front["前台功能"]
F_AUTH["用户认证"]
F_FILE["文件管理"]
F_QUESTION["题库管理"]
F_AI["AI对话"]
end
subgraph Back["后台功能"]
B_USER["用户管理"]
B_DEPT["部门管理"]
B_ROLE["权限管理"]
B_FILE["文件审核"]
B_LOG["日志管理"]
end
subgraph Service["服务层"]
S_AUTH["AuthService"]
S_FILE["FileService"]
S_USER["UserService"]
S_DEPT["DepartmentService"]
S_ROLE["RoleService"]
S_CHAT["ChatService"]
S_AI["AiChatService"]
end
subgraph Data["数据层"]
DB[("MySQL")]
KB[("知识库")]
end
U1 --> F_AUTH
U1 --> F_FILE
U1 --> F_QUESTION
U1 --> F_AI
U2 --> F_AUTH
U2 --> F_FILE
U2 --> B_DEPT
U2 --> B_FILE
U3 --> F_AUTH
U3 --> B_USER
U3 --> B_DEPT
U3 --> B_ROLE
U3 --> B_FILE
U3 --> B_LOG
F_AUTH --> S_AUTH
F_FILE --> S_FILE
F_AI --> S_AI
F_AI --> S_CHAT
B_USER --> S_USER
B_DEPT --> S_DEPT
B_ROLE --> S_ROLE
B_FILE --> S_FILE
B_LOG --> S_FILE
S_AUTH --> DB
S_FILE --> DB
S_USER --> DB
S_DEPT --> DB
S_ROLE --> DB
S_AI --> KB
S_CHAT --> DB
```
---
## 功能菜单树
```
知识管理系统
├── 前台用户端
│ ├── 用户认证
│ │ ├── 用户登录
│ │ ├── Token验证
│ │ └── 退出登录
│ │
│ ├── 文件管理
│ │ ├── 文件上传
│ │ ├── 文件查询
│ │ ├── 文件详情
│ │ ├── 文件更新
│ │ ├── 文件删除
│ │ └── RAG问答
│ │
│ ├── 题库管理
│ │ ├── 题目查询
│ │ ├── 题目详情
│ │ └── 答题练习
│ │
│ ├── AI对话
│ │ ├── 流式问答
│ │ ├── 会话列表
│ │ ├── 会话详情
│ │ ├── 引用查看
│ │ ├── 会话删除
│ │ └── 问答中断
│ │
│ └── 个人中心
│ ├── 个人信息
│ └── 修改密码
└── 后台管理端
├── 用户管理
│ ├── 用户列表
│ ├── 用户详情
│ ├── 添加用户
│ ├── 编辑用户
│ └── 删除用户
├── 部门管理
│ ├── 部门列表
│ ├── 部门详情
│ ├── 添加部门
│ ├── 编辑部门
│ └── 删除部门
├── 权限管理
│ ├── 角色列表
│ ├── 角色详情
│ ├── 添加角色
│ ├── 编辑角色
│ ├── 删除角色
│ ├── 权限列表
│ └── 权限分配
├── 文件审核
│ ├── 待审核列表
│ ├── 审核通过
│ └── 审核拒绝
├── 日志管理
│ ├── 日志列表
│ └── 日志详情
└── 系统配置
├── 知识库配置
└── 参数设置
```
---
## 接口权限矩阵
| 功能模块 | 普通用户 | 部门管理员 | 系统管理员 |
|---------|:-------:|:----------:|:----------:|
| **用户认证** | | | |
| 登录 | ✅ | ✅ | ✅ |
| 注册 | ✅ | ✅ | ✅ |
| **文件管理** | | | |
| 上传文件 | ✅ | ✅ | ✅ |
| 查询文件 | ✅ | ✅ | ✅ |
| 删除文件 | ✅ | ✅ | ✅ |
| RAG问答 | ✅ | ✅ | ✅ |
| **题库管理** | | | |
| 查询题目 | ✅ | ✅ | ✅ |
| 答题练习 | ✅ | ✅ | ✅ |
| **AI对话** | | | |
| 流式问答 | ✅ | ✅ | ✅ |
| 会话管理 | ✅ | ✅ | ✅ |
| **用户管理** | | | |
| 用户列表 | ❌ | ❌ | ✅ |
| 用户详情 | ❌ | ❌ | ✅ |
| 添加用户 | ❌ | ❌ | ✅ |
| 编辑用户 | ❌ | ❌ | ✅ |
| 删除用户 | ❌ | ❌ | ✅ |
| **部门管理** | | | |
| 部门列表 | ❌ | ✅ | ✅ |
| 部门详情 | ❌ | ✅ | ✅ |
| 添加部门 | ❌ | ❌ | ✅ |
| 编辑部门 | ❌ | ❌ | ✅ |
| 删除部门 | ❌ | ❌ | ✅ |
| **权限管理** | | | |
| 角色列表 | ❌ | ❌ | ✅ |
| 权限分配 | ❌ | ❌ | ✅ |
| **文件审核** | | | |
| 待审核列表 | ❌ | ✅ | ✅ |
| 审核通过 | ❌ | ✅ | ✅ |
| 审核拒绝 | ❌ | ✅ | ✅ |
| **日志管理** | | | |
| 日志列表 | ❌ | ❌ | ✅ |
| 日志详情 | ❌ | ❌ | ✅ |
---
## 技术架构图
```mermaid
flowchart TB
subgraph Client["客户端层"]
WEB["Web浏览器"]
APP["移动App"]
API["第三方系统"]
end
subgraph Gateway["网关层"]
GATEWAY["Spring Cloud Gateway"]
AUTH["认证中心"]
end
subgraph Service["业务服务层"]
USER_SVC["用户服务"]
FILE_SVC["文件服务"]
AI_SVC["AI服务"]
CHAT_SVC["对话服务"]
QUESTION_SVC["题库服务"]
end
subgraph Data["数据层"]
MYSQL["MySQL数据库"]
REDIS["Redis缓存"]
MINIO["MinIO对象存储"]
ES["Elasticsearch"]
end
subgraph External["外部服务"]
LLM["大模型服务"]
RAG["RAG服务"]
end
WEB --> GATEWAY
APP --> GATEWAY
API --> GATEWAY
GATEWAY --> AUTH
AUTH --> USER_SVC
GATEWAY --> USER_SVC
GATEWAY --> FILE_SVC
GATEWAY --> AI_SVC
GATEWAY --> CHAT_SVC
GATEWAY --> QUESTION_SVC
USER_SVC --> MYSQL
USER_SVC --> REDIS
FILE_SVC --> MYSQL
FILE_SVC --> MINIO
AI_SVC --> LLM
AI_SVC --> RAG
CHAT_SVC --> MYSQL
CHAT_SVC --> ES
QUESTION_SVC --> MYSQL
```