Skip to content

[216_3] 模版中心页面#3108

Merged
da-liii merged 23 commits intomainfrom
yuki/216_3/template
Apr 9, 2026
Merged

[216_3] 模版中心页面#3108
da-liii merged 23 commits intomainfrom
yuki/216_3/template

Conversation

@Yuki-Nagori
Copy link
Copy Markdown
Contributor

No description provided.

Yuki-Nagori and others added 12 commits April 7, 2026 12:13
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>
@Yuki-Nagori Yuki-Nagori marked this pull request as ready for review April 8, 2026 03:52
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 8, 2026

Greptile Summary

此 PR 实现了模版中心页面(Template Center),包含后端的 TemplateManager / TemplateAPI / TemplateCache 层、前端的 QTTemplatePageQTPdfPreviewWidget 控件,以及 Scheme 侧的分类配置文件。之前评审轮次中指出的多项问题已在本 PR 中修复:activeCategoryBtn_ 悬空指针防护、缩略图 QPointer<QLabel> 改造、bytesTotal == -1 的不确定进度模式、Scheme 字符串路径转义、取消按钮信号连接、以及 call_scheme 调用方式均已得到修正。

Confidence Score: 4/5

PR 基本可合并,但 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_ 未初始化)需要关注。

Vulnerabilities

No security concerns identified. Network requests target a hardcoded first-party API endpoint (liiistem.cn). Downloaded template files are written to the app data directory with a sanitized target path. The Scheme string used to open files escapes backslashes and double quotes before interpolation.

Important Files Changed

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)
Loading

Reviews (9): Last reviewed commit: "wip" | Re-trigger Greptile

Comment on lines +190 to +199
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);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 下载完成后未校验 MD5 完整性

TemplateMetadata 中已有 fileMd5 字段,服务端 API 也返回该值,但 onDownloadFinished() 在写入文件后从未对下载内容进行哈希校验。当网络传输损坏或服务端返回截断数据时,损坏的 .tmu 文件会被静默接受。建议在 file.write(data) 之后、emit downloadCompleted 之前添加 MD5 校验,校验失败时删除文件并 emit downloadFailed

Yuki-Nagori and others added 2 commits April 8, 2026 12:07
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>
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 8, 2026

Tip:

Greploops — Automatically fix all review issues by running /greploops in Claude Code. It iterates: fix, push, re-review, repeat until 5/5 confidence.

Use the Greptile plugin for Claude Code to query reviews, search comments, and manage custom context directly from your terminal.

Copy link
Copy Markdown
Contributor

@da-liii da-liii left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@da-liii da-liii merged commit 08546d9 into main Apr 9, 2026
5 checks passed
@da-liii da-liii deleted the yuki/216_3/template branch April 9, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants