初始化项目代码
This commit is contained in:
399
文件/AIChatController_流程图.md
Normal file
399
文件/AIChatController_流程图.md
Normal 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流式问答 |
|
||||
522
文件/FileController_流程图.md
Normal file
522
文件/FileController_流程图.md
Normal 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流式问答 | ✅ | ✅ | ✅ |
|
||||
| 下载文件 | ❌ 已禁用 | ❌ 已禁用 | ❌ 已禁用 |
|
||||
| 获取文件内容 | ❌ 已禁用 | ❌ 已禁用 | ❌ 已禁用 |
|
||||
| 获取文件信息 | ✅ | ✅ | ✅ |
|
||||
| 删除文件 | - | - | - |
|
||||
| 审核通过 | ❌ | ✅ | ✅ |
|
||||
| 审核拒绝 | ❌ | ✅ | ✅ |
|
||||
| 查询待审核列表 | ❌ | ✅ | ✅ |
|
||||
| 更新文件信息 | ✅ | ✅ | ✅ |
|
||||
542
文件/出题做题生成流程示意图.md
Normal file
542
文件/出题做题生成流程示意图.md
Normal 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 | 已撤销 |
|
||||
|
||||
328
文件/系统功能模块划分图.md
Normal file
328
文件/系统功能模块划分图.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user