graph TD;
A[初始化UserLoginModule] --> B[初始化资源];
B --> C[初始化UI];
C --> D[初始化连接];
D --> E[初始化布局];
E --> F[初始化样式表];
F --> G{用户点击登录};
G -- 是 --> H[获取用户名];
G -- 是 --> I[获取密码并转换为SecureString];
I --> J[调用checkInputMainUser验证用户名和密码];
J --> K[验证成功];
K --> L[设置当前用户名];
K --> M[设置当前密码];
K --> N[隐藏登录窗口];
J --> O[验证失败];
O --> P[显示错误消息];
F --> Q{用户点击注册};
Q -- 是 --> R[获取用户名];
Q -- 是 --> S[获取密码并转换为SecureString];
S --> T[获取用户私钥列表];
T --> U[用户名已存在];
U --> V[显示用户名已存在错误消息];
T --> W[用户名不存在];
W --> X[生成用户密钥];
X --> Y[注册成功];
Y --> Z[显示注册成功消息];
Y --> AA[自动登录];
X --> AB[注册失败];
AB --> AC[显示注册失败错误消息];
graph TD
%% ============= 样式定义 ============= %%
classDef process fill:#f0f6ff,stroke:#4a90e2,stroke-width:1.5px,color:#333;
classDef decision fill:#ffe6cc,stroke:#ff9933,stroke-dasharray:5 5;
classDef module fill:#e6f9f0,stroke:#33cc99,stroke-width:2px;
classDef error fill:#ffebee,stroke:#ff5252,stroke-width:1.5px;
classDef async fill:#f5f5f5,stroke:#666;
%% ============= 主界面模块 ============= %%
subgraph 用户界面[用户界面]
A[📁 用户选择文件]:::process
B[📂 选择保存路径]:::process
C[⏳ 显示进度对话框]:::process
D[🔌 连接完成槽函数]:::process
E[⚠️ 显示结果/错误]:::error
end
%% ============= 核心服务模块 ============= %%
subgraph 核心服务[核心服务]
F{✅ 验证输入参数}:::decision
G[🔑 获取用户公钥]:::process
H[🔐 生成AES密钥+IV]:::process
I[🛡️ 加密AES密钥]:::process
J[💾 保存元数据]:::process
end
%% ============= 加密管理模块 ============= %%
subgraph 加密管理[加密引擎]
K[⚡ 加密文件任务]:::process
L[🔢 分块加密处理]:::process
M[📶 发送进度信号]:::process
end
%% ============= 异步任务模块 ============= %%
subgraph 异步任务[异步处理]
N[🔄 初始化加密上下文]:::async
O[🔁 加密数据循环]:::async
P[💽 写入加密结果]:::async
Q[🧹 清理资源]:::async
end
%% ============= 主要流程 ============= %%
A -->|文件路径| B
B -->|触发| C
C -->|绑定信号| M
M -.->|跨线程调用| D
D -->|处理结果| E
A -->|调用服务| F
F -->|参数无效| E
F -->|通过验证| G
G -->|公钥不存在| E
G -->|成功获取| H
H -->|生成失败| E
H -->|生成成功| I
I -->|加密失败| E
I -->|成功| J
J -->|保存失败| E
J -->|保存成功| D
K -->|分块处理| L
L -->|更新进度| M
K -->|启动| N
N -->|初始化| O
O -->|循环处理| P
P -->|完成写入| Q
Q -->|释放资源| N
%% ============= 异常处理 ============= %%
C -->|用户取消| Q
%% ============= 技术注释 ============= %%
note["
关键技术点:
- 使用QThreadPool实现异步加密
- OpenSSL AES-256-CBC加密实现
- RSA加密对称密钥
"]
用户界面模块 (mainwindow):
核心服务模块 (CoreService):
加密管理器模块 (EncryptionDecryptionManager):
异步任务模块 (AsyncEncryptTask):
QThreadPool 实现多线程任务调度。EVP_aes_256_cbc 算法进行文件加密。通过以上流程图和解释,可以清晰地看到各模块之间的交互逻辑、异常处理路径以及关键的技术实现细节。
graph TD
%% ============= 样式定义 ============= %%
classDef process fill:#f0f6ff,stroke:#4a90e2,stroke-width:1.5px,color:#333;
classDef decision fill:#ffe6cc,stroke:#ff9933,stroke-dasharray:5 5;
classDef module fill:#e6f9f0,stroke:#33cc99,stroke-width:2px;
classDef error fill:#ffebee,stroke:#ff5252,stroke-width:1.5px;
classDef async fill:#f5f5f5,stroke:#666;
%% ============= 用户界面模块 ============= %%
subgraph 用户界面[用户界面]
A[📁 选择加密文件]:::process
B[📂 选择保存路径]:::process
C[⏳ 显示进度对话框]:::process
D[🔌 连接完成槽函数]:::process
E[⚠️ 解密结果/错误显示]:::error
end
%% ============= 核心服务模块 ============= %%
subgraph 核心服务[核心服务]
F{🔑 读取元数据}:::decision
G[🔐 解密 AES 密钥]:::process
H[💾 获取私钥]:::process
I[🛡️ 初始化解密上下文]:::process
end
%% ============= 加密管理模块 ============= %%
subgraph 加密引擎[加密引擎]
J{⚡ 解密文件任务}:::decision
K[🧩 分块解密处理]:::process
L[📶 发送进度信号]:::process
M[💾 写入解密结果]:::async
end
%% ============= 异步任务模块 ============= %%
subgraph 异步任务[异步处理]
N[🔄 初始化任务上下文]:::async
O[🔁 解密数据循环]:::async
P[🟥 更新进度信息]:::async
Q[🧹 清理资源]:::async
end
%% ============= 主要流程 ============= %%
A -->|文件路径| B
B -->|触发| C
C -->|绑定信号| L
M -.->|跨线程调用| D
D -->|处理结果| E
A -->|调用服务| F
F -->|元数据无效| E
F -->|读取成功| H
H -->|私钥不存在| E
H -->|成功获取| G
G -->|解密失败| E
G -->|解密成功| I
I -->|初始化完成| J
J -->|启动任务| N
N -->|初始化完成| O
O -->|分块处理| K
K -->|更新进度| P
K -->|写入结果| M
Q -->|释放资源| N
%% ============= 异常处理 ============= %%
C -->|用户取消| Q
F -->|元数据读取失败| E
G -->|AES 密钥解密失败| E
H -->|私钥获取失败| E
K -->|分块解密错误| E
%% ============= 技术注释 ============= %%
note["
关键技术点:
- 使用 QThreadPool 实现异步任务管理
- OpenSSL AES-256-CBC 解密实现
- RSA 私钥解密对称密钥
- 进度信号通过 Qt 信号槽机制传输
"]
用户界面模块
A):用户通过文件对话框选择要解密的加密文件。B):用户选择解密后文件的保存路径。C):创建一个非模态进度条对话框,并绑定取消按钮事件。E):根据核心服务返回的结果或错误信息,显示成功或警告弹窗。核心服务模块
F):从加密文件的 .meta 文件中读取元数据(如 AES 密钥、IV 和原始文件名)。H):通过密钥管理器获取当前用户的私钥,用于解密对称密钥。G):使用 RSA 私钥解密 AES 对称密钥,并验证解密过程是否成功。加密引擎模块
J):将文件解密任务提交到线程池进行异步处理。K):按照固定缓冲区大小对加密文件进行分块解密处理。L):向用户界面发送当前的解密进度信息。M):将解密后的数据写入目标文件。异步任务模块
N):为每个解密任务创建独立的上下文和缓冲区。O):异步读取加密文件,分块解密并写入结果文件。P):计算当前处理的数据量,并将进度信息发送回主线程。Q):任务完成后清理相关资源(如文件句柄和 OpenSSL 上下文)。关键交互路径
CoreService) 和加密引擎 (EncryptionDecryptionManager) 通过信号槽实现解密状态和错误信息的双向通信。MainWindow) 和核心服务通过 Qt 信号槽绑定完成进度条更新和结果反馈。QThreadPool 实现多线程异步处理,避免主线程阻塞。KeyManager) 提供 RSA 私钥,用于解密对称密钥。QMetaObject::invokeMethod 和信号槽机制实现主线程和子线程之间的进度信息通信。这个流程图完整地展示了从用户交互到后台解密处理的整个技术链路,同时突出了关键的异常处理路径和双向通信机制。
根据提供的代码,我将为您生成一个多层级联动的Mermaid流程图,以下是符合要求的可视化方案:
graph TD
%% ============= 样式定义 ============= %%
classDef process fill:#f0f6ff,stroke:#4a90e2,stroke-width:1.5px,color:#333;
classDef decision fill:#ffe6cc,stroke:#ff9933,stroke-dasharray:5 5;
classDef module fill:#e6f9f0,stroke:#33cc99,stroke-width:2px;
classDef error fill:#ffebee,stroke:#ff5252,stroke-width:1.5px;
classDef async fill:#f5f5f5,stroke:#666;
%% ============= 用户界面模块 ============= %%
subgraph UI[🌐 用户界面]
A[📁 选择源文件]:::process
B[📂 选择保存路径]:::process
C[⏳ 显示进度对话框]:::process
D[🔄 绑定信号/槽]:::process
E[⚠️ 显示结果/错误]:::error
end
%% ============= 核心服务模块 ============= %%
subgraph Core[🖥️ 核心服务]
F{✅ 验证参数}:::decision
G{🔍 查找接收者公钥}:::decision
H[🔑 生成AES密钥+IV]:::process
I[🔐 RSA加密AES密钥]:::process
J[💾 保存元数据]:::process
K[📤 启动加密任务]:::process
end
%% ============= 加密引擎模块 ============= %%
subgraph Engine[🔒 加密引擎]
L[⚡ 初始化加密器]:::process
M[📂 分割文件块]:::process
N[🧩 创建加密任务]:::process
O[📊 聚合结果]:::process
end
%% ============= 异步处理模块 ============= %%
subgraph Async[🔄 异步处理]
P[🏗️ 初始化线程池]:::async
Q[⚙️ 执行加密任务]:::async
R[📨 进度信号转发]:::async
S[🧹 清理资源]:::async
end
%% ============= 主要流程 ============= %%
A -->|文件路径| B
B -->|触发| C
C -->|connect| D
D -->|绑定到Core| K
A -->|调用服务| F
F -->|参数无效| E
F -->|验证通过| G
G -->|公钥不存在| E
G -->|找到公钥| H
H -->|生成失败| E
H -->|成功生成| I
I -->|加密失败| E
I -->|成功加密| J
J -->|元数据保存失败| E
J -->|保存成功| K
K -->|启动| L
L -->|分割文件| M
M -->|分块大小2GB| N
N -->|QThreadPool| Q
Q -->|进度更新| R
R -.->|跨线程信号| C
%% ============= 异常处理 ============= %%
C -->|用户取消| S
Q -->|加密失败| E
N -->|任务创建失败| E
%% ============= 技术注释 ============= %%
note["
关键技术点:
- 基于QThreadPool的并行加密
- OpenSSL AES-256-CBC加密实现
- RSA非对称加密传输对称密钥
- 跨线程信号槽通信机制
- 2GB文件分块处理策略
"]
%% ============= 图例说明 ============= %%
legend["流程图例说明:
▻ 矩形框:处理过程
▻ 菱形框:判断/决策
▻ 红色箭头:异常路径
▻ 虚线箭头:数据流
▻ 模块边框:功能分区"]
异常处理亮点
m_cancelFlag原子标志位立即终止所有线程errorOccurred信号并回滚已写入数据双向通信机制
用户界面 ↔ 核心服务:通过encryptionProgress信号和cancelEncryption槽函数实现
核心服务 ↔ 加密引擎:通过encryptFileChunked_AES方法和encryptionFinished信号实现
graph TD
%% ============= 样式定义 ============= %%
classDef process fill:#f0f6ff,stroke:#4a90e2,stroke-width:1.5px,color:#333;
classDef decision fill:#ffe6cc,stroke:#ff9933,stroke-dasharray:5 5;
classDef module fill:#e6f9f0,stroke:#33cc99,stroke-width:2px;
classDef error fill:#ffebee,stroke:#ff5252,stroke-width:1.5px;
classDef async fill:#f5f5f5,stroke:#666;
%% ============= 图例说明 ============= %%
legend["流程图例说明:
🟦 矩形-处理过程
🟨 菱形-条件判断
🟩 模块容器
🟥 错误处理
→ 实线-API调用
⇢ 虚线-数据流
🛑 红色箭头-异常反馈"]:::process
%% ============= 用户界面模块 ============= %%
subgraph UI["🖥️ 用户界面"]
A[📁 选择元数据文件]:::process
B[📂 选择保存路径]:::process
C[⏳ 创建进度对话框]:::process
D{用户取消?}:::decision
E[🛑 显示错误信息]:::error
F[✅ 显示解密结果]:::process
end
%% ============= 核心服务模块 ============= %%
subgraph Core["🔑 核心服务"]
G[📄 读取元数据文件]:::process
H{元数据有效?}:::decision
I[🔐 获取用户私钥]:::process
J[🔓 RSA解密AES密钥]:::process
K{分块文件存在?}:::decision
L[⚙️ 准备解密参数]:::process
end
%% ============= 加密引擎模块 ============= %%
subgraph Engine["⚙️ 加密引擎"]
M[🔀 初始化并行解密器]:::process
N[📦 创建输出缓冲区]:::process
O[🔄 分发解密任务]:::process
end
%% ============= 异步任务模块 ============= %%
subgraph Async["🔄 异步处理"]
P[📂 打开加密分块]:::async
Q[🔢 AES-CBC解密]:::async
R[💾 写入缓冲区]:::async
S[📤 合并最终文件]:::async
end
%% ============= 主要流程 ============= %%
A -->|meta文件路径| B
B -->|触发| C
C -->|调用| G
G --> H
H -->|无效| E
H -->|有效| I
I -->|失败| E
I -->|成功| J
J -->|失败| E
J -->|成功| K
K -->|缺失| E
K -->|存在| L
L -->|参数| M
M -->|初始化| N
N -->|线程池| O
O -->|分块路径| P
P --> Q --> R --> S
%% ============= 信号交互 ============= %%
C -->|canceled信号| D
D -->|取消标志| O
O -.->|progressChanged| C
S -->|completed信号| F
Q -->|errorOccurred| E
%% ============= 数据流动 ============= %%
J -.->|AES密钥| Q
L -.->|IV参数| Q
R -.->|缓冲区数据| S
%% ============= 异常处理 ============= %%
H -->|读取失败| E
I -->|私钥错误| E
J -->|解密失败| E
K -->|分块丢失| E
P -->|文件打开失败| E
Q -->|解密错误| E
S -->|写入失败| E
%% ============= 技术注释 ============= %%
note["
关键技术点:
- 基于QThreadPool的并行任务调度
- OpenSSL AES-256-CBC解密实现
- 双缓冲机制防止IO阻塞
- 原子操作实现取消标志位
- 元数据JSON格式验证
"]
实现关键业务逻辑链:
元数据解析 → 私钥获取 → RSA解密 → 参数验证
采用防御式编程验证每个步骤的有效性
通过错误信号实现统一异常出口
异常处理特点
progressChanged → QProgressDialogcompleted → 信息对话框errorOccurred → 错误对话框关键技术标注
graph LR
QT[Qt框架] -->|信号槽机制| COMM[跨线程通信]
OpenSSL[OpenSSL] -->|AES-256-CBC| DEC[分块解密]
QTPOOL[QThreadPool] -->|任务调度| PAR[并行处理]
Buffer[双缓冲区] -->|无锁队列| MERGE[文件合并]
该设计通过模块化实现以下优势: