Conversation
1. 内存管理 (qt_template_page.cpp): - 移除硬编码样式,改为使用 CSS 文件 - 删除冗余的 delete dialog (exec() 后自动清理) 2. CSS 样式 (liii.css, liii-night.css): - 添加 #template-use-btn 样式定义 3. 线程安全 (qt_pdf_preview_widget.cpp): - 使用 std::atomic + std::mutex 保护 handlersRegistered - 正确处理初始化失败的场景 4. 并发控制 (qt_template_page.hpp/cpp): - 添加缩略图加载队列,限制最大并发请求数为 6 - 添加标签有效性检查,避免野指针访问 5. 代码清理 (template_manager.cpp): - 移除重复的缓存时间检查逻辑 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
在 templateFilePath() 中添加 templateId 校验: - 使用正则表达式限制只允许字母、数字、下划线、连字符和点号 - 防止恶意 templateId (如包含 ../) 导致目录遍历攻击 - 在校验失败时返回空字符串并记录警告日志 - 在 downloadTemplate() 中检查返回值,无效时返回错误 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Greptile Summary此 PR 实现了模版中心页面(Template Center),包含后端的 Confidence Score: 4/5PR 基本可合并,但 mergeMetadata 会使已下载模板在 UI 中消失,建议在合并前修复。 之前评审轮次中的多项 P0/P1 问题(悬空指针、double-free、fz_page 泄漏、双重 emit、路径转义、取消按钮未连接)已全部修复,整体代码质量有显著提升。当前剩余问题中,mergeMetadata 静默移除用户已下载模板的可见性(P2,但影响用户体验)以及 templatePage_ 未初始化(P2)值得在合并前处理;onDownloadCompleted 取消竞态为极窄概率,可视情况处理。 src/Mogan/TemplateCenter/template_manager.cpp(mergeMetadata 逻辑)和 src/Plugins/Qt/qt_startup_tab_widget.hpp(templatePage_ 未初始化)需要关注。
|
| Filename | Overview |
|---|---|
| src/Mogan/TemplateCenter/template_manager.cpp | 核心管理层,协调 API 与缓存;mergeMetadata 在远程数据不完整时会将已下载模板从内存列表中移除(文件保留,但 UI 不可见),存在 UX 问题。 |
| src/Mogan/TemplateCenter/template_api.cpp | 网络层实现,onNetworkError 已收窄为只处理元数据请求,避免了双重 emit;下载完成后仍未进行 MD5 完整性校验(已在上一轮评审中标记)。 |
| src/Plugins/Qt/qt_template_page.cpp | 模版页面 UI,多处之前发现的问题(QPointer、进度条、取消按钮连接)已修复;onDownloadCompleted 未检查 downloadCancelledByUser_ 存在窄竞态。 |
| src/Plugins/Qt/qt_pdf_preview_widget.cpp | MuPDF PDF 渲染封装,fz_var 保护及清理路径已修正,之前报告的 fz_page 泄漏和 double-free 已解决。 |
| src/Plugins/Qt/qt_startup_tab_widget.cpp | 将 template 页面从占位替换为真实 QTTemplatePage;路径转义逻辑已修正,但 templatePage_ 成员变量声明后从未被赋值。 |
| src/Mogan/TemplateCenter/template_cache.cpp | 磁盘缓存管理,JSON 读写逻辑清晰,removeCachedTemplate 同时删文件和索引。 |
| src/Mogan/TemplateCenter/template_types.hpp | 公共类型定义,结构清晰,无问题。 |
| TeXmacs/templates/categories.scm | Scheme 分类配置,定义了 3 个默认分类及 template-get-categories 函数,逻辑无误。 |
| xmake.lua | 正确添加了 TemplateCenter 源文件目录和 TeXmacs/templates 资源路径。 |
Sequence Diagram
sequenceDiagram
participant UI as QTTemplatePage
participant TM as TemplateManager
participant API as TemplateAPI
participant Cache as TemplateCache
participant Net as Network (liiistem.cn)
UI->>TM: initialize()
TM->>Cache: initialize()
TM->>Cache: loadMetadataCache()
Cache-->>TM: cached metadata
TM->>TM: mergeMetadata(cached)
TM->>API: fetchMetadata()
API->>Net: GET /templates.json
Net-->>API: JSON response
API-->>TM: metadataLoaded(metadata, categories)
TM->>TM: mergeMetadata(remote)
TM->>Cache: saveMetadataCache()
TM-->>UI: templatesLoaded()
UI->>UI: refreshTemplateGrid()
UI->>TM: downloadTemplate(id)
TM->>API: downloadTemplate(id, url, path)
API->>Net: GET fileUrl
Net-->>API: downloadProgress
API-->>TM: downloadProgress
TM-->>UI: downloadProgress
Net-->>API: finished
API-->>TM: downloadCompleted(id, path)
TM->>Cache: registerCachedTemplate(id, path)
TM-->>UI: downloadCompleted(id, path)
UI-->>UI: emit templateOpened(path)
Reviews (9): Last reviewed commit: "wip" | Re-trigger Greptile
| QByteArray data = reply->readAll (); | ||
| qint64 written= file.write (data); | ||
| file.close (); | ||
| if (written != data.size ()) { | ||
| emit downloadFailed (templateId, tr ("Failed to write complete file")); | ||
| reply->deleteLater (); | ||
| return; | ||
| } | ||
|
|
||
| emit downloadCompleted (templateId, targetPath); |
1. P1: 修复 onNetworkStateChanged 条件错误 - 将 !initialized_ 改为 initialized_ - 确保网络重连后已初始化的管理器能正常触发刷新 2. P1: 修复进度对话框 Cancel 按钮未连接取消下载 - 连接 canceled() 信号到 cancelDownload() - 用户取消后立即停止下载并清理对话框 3. P1: 修复 thumbnailQueue_ 悬空指针问题 - 将 ThumbnailRequest 中的 QLabel* 改为 QPointer<QLabel> - QPointer 自动在 QLabel 删除时变为 nullptr,避免访问已删除对象 4. P2: 修复 bytesTotal 为 -1 时进度条异常 - 当 Content-Length 不存在时 (bytesTotal == -1) - 切换到不确定模式 (setRange(0, 0)) 显示循环动画 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
修复编译错误:QPointer 需要显式包含 <QPointer> 头文件 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Tip: Greploops — Automatically fix all review issues by running Use the Greptile plugin for Claude Code to query reviews, search comments, and manage custom context directly from your terminal. |
No description provided.