## 登录/注册功能 ```mermaid 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[显示注册失败错误消息]; ``` ## 输出单一加密文件功能 #### Mermaid 流程图代码结构 ```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 用户界面[用户界面] 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加密对称密钥 "] ``` --- #### 交互逻辑解释 1. **用户界面模块 (`mainwindow`)**: - 用户通过对话框选择文件和保存路径。 - 创建进度对话框并绑定取消按钮事件。 - 显示加密结果或错误提示。 2. **核心服务模块 (`CoreService`)**: - 验证输入参数是否为空。 - 从密钥管理器获取接收者的RSA公钥。 - 使用随机数生成AES对称密钥和IV。 - 将AES密钥加密为RSA密文,便于后续传输。 - 在加密完成后保存元数据(包括密钥、IV等)。 3. **加密管理器模块 (`EncryptionDecryptionManager`)**: - 将文件分割为多个4MB的块进行异步处理。 - 使用AES-256-CBC算法对每个块进行加密。 - 定期发送进度更新信号到用户界面。 4. **异步任务模块 (`AsyncEncryptTask`)**: - 初始化 OpenSSL 加密上下文。 - 逐块读取文件内容并加密。 - 处理最终的加密块并写入结果文件。 - 在异常或取消操作时清理临时文件和资源。 --- #### 技术细节 - **双向通信机制**: 用户界面通过信号槽与核心服务和加密管理器之间实现双向通信。 - **关键技术点**: - 使用 `QThreadPool` 实现多线程任务调度。 - 使用 OpenSSL 的 `EVP_aes_256_cbc` 算法进行文件加密。 - 使用 RSA 算法对称密钥加密,确保数据传输安全。 通过以上流程图和解释,可以清晰地看到各模块之间的交互逻辑、异常处理路径以及关键的技术实现细节。 ## 输出单一解密文件功能 #### Mermaid 流程图代码结构 ```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 用户界面[用户界面] 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 信号槽机制传输 "] ``` #### 交互逻辑解释 **用户界面模块** 1. 文件选择 (`A`):用户通过文件对话框选择要解密的加密文件。 2. 保存路径选择 (`B`):用户选择解密后文件的保存路径。 3. 进度显示 (`C`):创建一个非模态进度条对话框,并绑定取消按钮事件。 4. 结果/错误显示 (`E`):根据核心服务返回的结果或错误信息,显示成功或警告弹窗。 **核心服务模块** 1. 元数据读取 (`F`):从加密文件的 `.meta` 文件中读取元数据(如 AES 密钥、IV 和原始文件名)。 2. 私钥获取 (`H`):通过密钥管理器获取当前用户的私钥,用于解密对称密钥。 3. AES 解密初始化 (`G`):使用 RSA 私钥解密 AES 对称密钥,并验证解密过程是否成功。 **加密引擎模块** 1. **解密任务启动** (`J`):将文件解密任务提交到线程池进行异步处理。 2. **分块解密** (`K`):按照固定缓冲区大小对加密文件进行分块解密处理。 3. **进度更新** (`L`):向用户界面发送当前的解密进度信息。 4. **结果写入** (`M`):将解密后的数据写入目标文件。 **异步任务模块** 1. 任务初始化 (`N`):为每个解密任务创建独立的上下文和缓冲区。 2. 数据循环处理 (`O`):异步读取加密文件,分块解密并写入结果文件。 3. 进度更新 (`P`):计算当前处理的数据量,并将进度信息发送回主线程。 4. 资源清理 (`Q`):任务完成后清理相关资源(如文件句柄和 OpenSSL 上下文)。 **关键交互路径** 1. 正常解密流程: A --> B --> C --> F --> H --> G --> I --> J --> N --> O --> K --> M --> D 2. 错误处理: - 元数据读取失败:F --> E - 私钥获取失败:H --> E - AES 密钥解密失败:G --> E - 解密任务取消:C --> Q 3. 进度更新: K --> P --> D(通过 Qt 信号槽机制传输) 4. 双向通信: - 核心服务 (`CoreService`) 和加密引擎 (`EncryptionDecryptionManager`) 通过信号槽实现解密状态和错误信息的双向通信。 - 用户界面 (`MainWindow`) 和核心服务通过 Qt 信号槽绑定完成进度条更新和结果反馈。 #### 技术细节 - 异步任务管理:使用 `QThreadPool` 实现多线程异步处理,避免主线程阻塞。 - 加密算法实现:基于 OpenSSL 的 AES-256-CBC 加密算法实现文件解密功能。 - RSA 密钥管理:通过密钥管理器 (`KeyManager`) 提供 RSA 私钥,用于解密对称密钥。 - 进度信号传输:使用 Qt 的 `QMetaObject::invokeMethod` 和信号槽机制实现主线程和子线程之间的进度信息通信。 这个流程图完整地展示了从用户交互到后台解密处理的整个技术链路,同时突出了关键的异常处理路径和双向通信机制。 根据提供的代码,我将为您生成一个多层级联动的Mermaid流程图,以下是符合要求的可视化方案: ## 输出分块加密文件功能 #### Mermaid 流程图代码结构 ```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["流程图例说明: ▻ 矩形框:处理过程 ▻ 菱形框:判断/决策 ▻ 红色箭头:异常路径 ▻ 虚线箭头:数据流 ▻ 模块边框:功能分区"] ``` #### 交互逻辑解释 1. **用户界面模块**: - 通过QFileDialog实现文件选择功能 - 使用QProgressDialog实现非模态进度显示 - 通过信号槽机制与核心服务模块双向通信 2. **核心服务模块**: - 参数验证采用链式异常处理(任何步骤失败立即终止流程) - 密钥管理采用RSA/AES混合加密体系 - 元数据存储使用JSON格式保存加密参数 - 通过Qt的信号跨线程机制连接加密进度更新 3. **加密引擎模块**: - 文件分割策略采用固定2GB分块 - 任务分发基于CPU核心数动态调整线程池 - 进度聚合采用原子计数器实现线程安全 4. **异步处理模块**: - 使用QRunnable实现可取消的加密任务 - 通过QAtomicInteger实现线程安全的取消标志 - 进度信号通过QMetaObject::invokeMethod跨线程传递 #### 技术细节 **异常处理亮点** 1. 用户取消操作通过`m_cancelFlag`原子标志位立即终止所有线程 2. 文件I/O错误会触发`errorOccurred`信号并回滚已写入数据 3. 密钥生成失败时会自动清理OpenSSL上下文资源 4. 跨线程异常通过QMetaObject::invokeMethod保证线程安全 **双向通信机制** 1. 用户界面 ↔ 核心服务:通过`encryptionProgress`信号和`cancelEncryption`槽函数实现 2. 核心服务 ↔ 加密引擎:通过`encryptFileChunked_AES`方法和`encryptionFinished`信号实现 ## 输出分块解密文件功能 #### Mermaid 流程图代码结构 ```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; %% ============= 图例说明 ============= %% 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格式验证 "] ``` #### 交互逻辑解释 1. **用户界面模块**: - 处理文件选择和可视化交互 - 通过信号槽机制与核心服务通信 - 异常时显示标准化错误对话框 2. **核心服务模块**: - 实现关键业务逻辑链: ``` 元数据解析 → 私钥获取 → RSA解密 → 参数验证 ``` - 采用防御式编程验证每个步骤的有效性 - 通过错误信号实现统一异常出口 3. **加密引擎模块**: - 使用工厂模式创建并行解密器 - 维护线程安全的输出缓冲区 - 实现任务分发和负载均衡 4. **异步任务模块**: - 基于生产者-消费者模型处理分块 - 每个任务包含完整解密上下文 - 支持原子化暂停/恢复操作 #### 技术细节 **异常处理特点** 1. **多级回退机制**: - 用户取消立即触发线程池清空 - 文件校验失败自动终止后续流程 - 解密错误保留已处理数据 2. **双向通信实现**: - 进度更新:`progressChanged → QProgressDialog` - 结果通知:`completed → 信息对话框` - 错误传递:`errorOccurred → 错误对话框` **关键技术标注** ```mermaid graph LR QT[Qt框架] -->|信号槽机制| COMM[跨线程通信] OpenSSL[OpenSSL] -->|AES-256-CBC| DEC[分块解密] QTPOOL[QThreadPool] -->|任务调度| PAR[并行处理] Buffer[双缓冲区] -->|无锁队列| MERGE[文件合并] ``` 该设计通过模块化实现以下优势: 1. 界面与逻辑完全解耦 2. 加密任务可扩展支持不同算法 3. 异常处理集中化管理 4. 资源自动回收机制