Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v7.4.0-Beta1 (合入主线) #932

Merged
merged 67 commits into from
Jan 25, 2025
Merged

v7.4.0-Beta1 (合入主线) #932

merged 67 commits into from
Jan 25, 2025

Conversation

Ghost-chu
Copy link
Collaborator

@Ghost-chu Ghost-chu commented Jan 25, 2025

新增功能

电子垃圾临终关怀

Warning

根据 JEP-449 所述,Java 已从 21 版本开始废弃 32 位平台支持。本次更新中添加的 32 位兼容性不但完全未经测试,而且也不会提供任何支持。根据提案内容,32-bit 支持将在未来被完全删除,你应该考虑升级到 64 位操作系统/硬件。

新增对不受支持的平台 Linux x86 (32-bit)Linux arm32-vfp-hflt 的 install4j 打包安装程序。
由于这些平台很快将被 Java 废弃且在未来可能不再有兼容的 OpenJDK 构建,因此我们不会提供在这些平台上的任何兼容性相关的技术支持,且现有支持可能随时间推移而逐渐完全移除。

由于上游 OpenJDK 提供商已不再提供 Windows x86 的构建,32 位 Windows 不再本次更新的范围内。

在不受支持的平台上运行时,窗口标题将显示 ⚠不受支持的平台,且在首次运行时会收到一次性的警报信息和通知中心信息。
此决定的初衷是减少报废边缘的电子垃圾,并不代表我们对 32 位硬软件的兼容态度的转变,更不会尝试兼容 Java 8。

开关参数

引入全新开关参数系统,可以通过启动参数、参数文件和环境变量控制 PeerBanHelper 的内部开关。这些开关可能对打包发布者产生重要意义。具体改动请参见 PACKAGING.md 描述文件。

JCEF 支持

JCEF 支持随 install4j 安装程序引入,且可在安装阶段禁用。启用 JCEF 支持后,PeerBanHelper 会根据平台动态下载安装 CEF 框架。一旦 JCEF 可用,PeerBanHelper 会在 GUI 窗口内新增一个 “WebUI 控制台” 选项卡,以供用户在不打开浏览器的情况下访问 WebUI 更改设置。

在开发、快照、测试版本的 PeerBanHelper 上会额外启用 DevTools,可通过在 WebUI 控制台页面内按 F12 打开。

可通过传入参数、开关参数和标志文件禁用。

改进的 GUI 界面

新增主题:

  • macOS 主题:一套更符合 macOS 设计美学的 FlatLaf 主题,在 macOS 系统上会自动启用
  • Insider 主题:在开发、快照、测试版本的 PeerBanHelper 上会自动启用,以便在反馈错误时根据截图快速确认使用的版本类型

新增 “关于->开发人员与社区贡献者...” 菜单,以表彰对 PeerBanHelper 做出重要贡献的人们。

新增 ---DEBUG--- 菜单,仅在开发、快照、测试版本的 PeerBanHelper 上显示以供测试小组的测试用户对部分功能进行调试。部分功能需要管理员权限。

进行下载操作时,现在有一个新的对话框显示下载进度。

用户体验改进

  • 当 PeerBanHelper 检测到下载器上的传入连接来自内部地址时导致封禁无法工作时,发送告警信息提醒用户下载器的网络驱动程序可能被错误的配置为了 bridge 模式。此提示信息已同步到 PBH 文档
  • [WebUI] BTN 配置失败时,显示提示浮窗引导用户查看 BTN 配置文档页面

错误修复

Summary by CodeRabbit

基于提供的变更摘要,以下是更新后的发布说明:

  • 新功能

    • 添加 WebUI 控制台选项卡
    • 引入 JCEF(Java Chromium Embedded Framework)支持
    • 新增任务栏进度控制功能
    • 添加主题切换支持
    • 引入进度对话框
    • 新增关于窗口
    • 添加激活管理功能
    • 引入下载文件进度跟踪机制
    • 新增信用和致谢文档
  • 改进

    • 优化 GUI 界面
    • 改进错误处理和用户提示
    • 增强本地化支持
    • 提升系统托盘功能
    • 改进 IP 地址和端口显示格式
    • 更新用户文档提示信息
  • 修复

    • 解决多个平台兼容性问题
    • 修复配置加载和主题相关的问题
    • 改进 Docker 网络模式下的错误提示
  • 性能

    • 优化 DNS 查询超时处理
    • 改进异步方法处理
    • 提升文件下载的用户反馈
  • 安全性

    • 增强 IP 地址处理
    • 改进错误日志记录

这个版本主要关注用户体验和功能扩展,为用户提供更加灵活和直观的界面。

@Ghost-chu Ghost-chu requested review from a team as code owners January 25, 2025 18:07
Copy link
Contributor

coderabbitai bot commented Jan 25, 2025

Caution

Review failed

The pull request is closed.

概述

工作流程概述

此次拉取请求(PR)主要包含多个方面的更改,涉及 GitHub Actions 工作流程、项目依赖、本地化、GUI 界面、主题、WebUI 和实用工具等多个领域。主要变更包括:

  1. GitHub Actions 工作流程中 pnpm 版本从 9.1.1 更新到 10.0.0
  2. masterdev 分支添加工作流程触发器
  3. 引入新的本地化字符串和错误处理消息
  4. 增加 JCEF(Java Chromium Embedded Framework)支持
  5. 新增主题和 GUI 相关类
  6. 改进任务栏和进度对话框控制
  7. 添加 IP 地址格式化和系统兼容性检查工具

变更

文件 变更摘要
.github/workflows/build_fe.yml pnpm 版本升级
.github/workflows/webui.yml pnpm 版本升级,分支触发器扩展
PACKAGING.md 新增文档文件,提供打包信息
pom.xml 版本更新至 7.4.0-Beta1,新增依赖
src/main/java/ 新增多个类,如 AboutWindowJCEFSwingDevTools、主题相关类
src/main/resources/lang/ 新增本地化消息,改进错误处理文案
webui/src/utils/string.ts 新增 IP 地址格式化工具
webui/src/views/ 更新组件以使用新的 IP 地址格式化工具
.github/workflows/jvm-ci.yml 新增 Create_Torrent 作业
.github/workflows/mktorrent.yml 新增生成 torrent 文件的工作流

序列图

sequenceDiagram
    participant User
    participant MainWindow
    participant WebUITab
    participant JCEFAppFactory
    participant TaskbarControl

    User->>MainWindow: 启动应用
    MainWindow->>WebUITab: 初始化 WebUI
    WebUITab->>JCEFAppFactory: 创建 CEF 应用构建器
    JCEFAppFactory-->>WebUITab: 返回配置的构建器
    MainWindow->>TaskbarControl: 更新任务栏进度
    TaskbarControl-->>MainWindow: 进度更新完成
Loading

可能相关的 PR

建议的审阅者

  • Gaojianli

详细解析

主要变更点

  1. GitHub Actions 工作流程更新

    • pnpm 版本从 9.1.1 升级到 10.0.0
    • masterdev 分支添加工作流程触发
  2. 依赖和版本管理

    • pom.xml 版本更新至 7.4.0-Beta1
    • 新增 flatlaf-intellij-themesjcefmaven 依赖
  3. GUI 和主题增强

    • 引入新的主题类:StandardLafThemeMacOSLafTheme
    • 新增任务栏控制和进度对话框功能
    • 支持深色和浅色主题切换
  4. WebUI 和 JCEF 集成

    • 添加 JCEF 支持,允许在应用内嵌入 Web 控制台
    • 新增 JCEFAppFactory 用于配置 Chromium 嵌入式框架
    • 改进 WebUI 初始化和管理流程
  5. 本地化和错误处理

    • 新增多语言支持的错误消息
    • 改进系统兼容性检查
    • 添加更详细的用户指导信息

技术亮点

  • 类型安全改进(使用 unknown 替代 any
  • 模块化设计(主题、任务栏控制解耦)
  • 跨平台兼容性增强
  • 用户体验优化(进度对话框、错误提示)

潜在影响

  • 需要测试 JCEF 在不同平台的兼容性
  • 检查新版本 pnpm 是否引入任何构建变更
  • 验证主题切换和 WebUI 功能

建议

  1. 全面测试新功能,特别是 JCEF 集成
  2. 验证跨平台兼容性
  3. 检查本地化文案的准确性
  4. 审查新增依赖的许可证兼容性

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1c2e76e and ed60e71.

📒 Files selected for processing (6)
  • .github/workflows/jvm-ci.yml (1 hunks)
  • .github/workflows/mktorrent.yml (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/AboutWindow.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingProgressDialog.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/SnapshotTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/util/MIDIPlayer.java (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 14

🧹 Nitpick comments (47)
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (1)

107-107: DNS 查询添加超时机制,提高系统稳定性

将原来的阻塞式 join() 调用改为带超时的 get(),可以避免 DNS 查询无响应时造成的系统挂起。建议考虑以下几点:

  1. 超时时间是否需要配置化,而不是硬编码为 3 秒
  2. 超时异常的处理机制是否需要更详细的日志记录
  3. 建议添加监控指标,追踪 DNS 查询的性能和超时情况

建议将超时时间改为可配置项:

-                ptr = dnsLookup.ptr(reverseDnsLookupString).get(3, TimeUnit.SECONDS);
+                long timeout = getConfig().getLong("ptr-lookup-timeout", 3);
+                ptr = dnsLookup.ptr(reverseDnsLookupString).get(timeout, TimeUnit.SECONDS);
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/PBHFlatLafTheme.java (1)

3-7: 建议为接口添加文档注释

建议为接口和方法添加 JavaDoc 文档注释,以便更好地说明:

  • 接口的用途和职责
  • 每个方法的具体功能
  • 实现类需要注意的事项

示例改进:

+/**
+ * 定义主题切换的核心功能接口
+ * 实现类负责在深色和浅色主题之间进行切换
+ */
 public interface PBHFlatLafTheme {
+    /**
+     * 应用深色主题
+     */
     void applyDark();
 
+    /**
+     * 应用浅色主题
+     */
     void applyLight();
 }
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/StandardLafTheme.java (1)

7-17: 建议添加错误处理和日志记录

当前实现中直接调用 setup() 方法,建议:

  1. 添加异常处理
  2. 添加日志记录以便追踪主题切换

建议改进如下:

+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

 public class StandardLafTheme implements PBHFlatLafTheme {
+    private static final Logger logger = LoggerFactory.getLogger(StandardLafTheme.class);
+
     @Override
     public void applyDark() {
+        try {
             FlatDarculaLaf.setup();
+            logger.info("已应用深色主题:FlatDarculaLaf");
+        } catch (Exception e) {
+            logger.error("应用深色主题失败", e);
+        }
     }

     @Override
     public void applyLight() {
+        try {
             FlatIntelliJLaf.setup();
+            logger.info("已应用浅色主题:FlatIntelliJLaf");
+        } catch (Exception e) {
+            logger.error("应用浅色主题失败", e);
+        }
     }
 }
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/PBHPlusTheme.java (1)

7-7: 建议添加类文档注释

为了提高代码可维护性,建议添加类级别的文档注释,说明此主题的用途和特点。

+/**
+ * PBH Plus 主题实现类
+ * 使用 FlatLaf Arc Orange 主题,提供亮色和暗色两种模式
+ */
 public class PBHPlusTheme implements PBHFlatLafTheme {
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingGuiImpl.java (3)

Line range hint 75-92: updateGuiStuff方法

此方法更新窗口标题并根据是否暂停来变化任务栏状态。逻辑合理。但请确认在循环执行时是否会产生性能问题,或是否需要增加状态判断减少重复调用。


121-122: onPBHFullyStarted中的计划任务

通过scheduleWithFixedDelay每秒调用updateGuiStuff,可能造成频繁更新。若考虑性能或GUI刷新频率,可以适度调大间隔。


130-181: updateTheme方法

在此方法中,根据开关和系统信息来选择不同主题,并在最后使用FlatAnimatedLafChange进行平滑动画。这段逻辑涵盖多种主题场景,同时处理了外部自定义与Mac、Snapshot等风格。建议进一步拆分逻辑,以便维护和测试。

src/main/java/com/ghostchu/peerbanhelper/gui/ProgressDialog.java (1)

10-22: 建议添加参数的空值注解

接口设计清晰,但建议在以下方法的参数上添加 @Nullable@NotNull 注解以增强类型安全性:

  • setTitle(String title)
  • setDescription(String description)
  • setButtonText(String buttonText)
  • setButtonEvent(Runnable buttonEvent)
  • setComment(String comment)

这样可以:

  1. 提供更好的 IDE 支持
  2. 在编译时捕获潜在的空值问题
  3. 使接口契约更加明确
install4j/lang/zh-CN.utf8 (1)

11-11: 建议优化 JCEF 描述文本的长度

当前描述文本较长,建议拆分为多个独立的配置项以提升可读性:

-components.jcef.description=可选的 JCEF (Java 嵌入式 Chromium 框架),用以支持 PeerBanHelper GUI 模式下的 WebUI 控制台标签页功能,禁用后将隐藏 WebUI 控制台标签页,用户将需要通过系统浏览器访问 WebUI。(勾选后将在 PeerBanHelper 启动时下载)
+components.jcef.description=可选的 JCEF (Java 嵌入式 Chromium 框架)
+components.jcef.feature=支持 PeerBanHelper GUI 模式下的 WebUI 控制台标签页功能
+components.jcef.disable_note=禁用后将隐藏 WebUI 控制台标签页,用户需要通过系统浏览器访问 WebUI
+components.jcef.download_note=勾选后将在 PeerBanHelper 启动时下载
src/main/java/com/ghostchu/peerbanhelper/gui/impl/GuiImpl.java (1)

24-27: 新增的界面方法增强了用户体验

这两个新方法很好地扩展了GUI功能:

  • createProgressDialog 提供了进度对话框支持,可用于显示长时间运行任务的进度
  • taskbarControl 提供了任务栏集成功能

建议:

  • 考虑为这些方法添加 JavaDoc 文档,说明参数的用途和返回值的含义
  • 建议在接口中添加一些常量来定义常用的按钮文本和标题
install4j/lang/custom.utf8 (1)

11-13: 本地化文本清晰完整

新增的JCEF组件描述:

  • 清楚说明了组件的可选性质
  • 详细解释了功能影响和下载时机
  • 描述语言通俗易懂

建议:

  • 考虑添加一个简短的性能影响说明
  • 可以补充一下系统要求信息
src/main/java/com/ghostchu/peerbanhelper/exchange/ExchangeMap.java (1)

13-14: 新增状态标志位设计合理

关于新增的两个volatile布尔标志:

  • PBH_PLUS_ACTIVATED 用于追踪Plus功能的激活状态
  • UNSUPPORTED_PLATFORM 用于标记不支持的平台

建议:

  • 考虑添加 JavaDoc 说明这些标志的具体用途
  • 建议将这些标志封装在getter/setter方法中,以便于后续添加额外的状态检查逻辑
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/JCEFSwingDevTools.java (2)

10-12: 补充类级别的文档注释

当前的文档注释过于简单。建议添加更详细的说明,包括类的用途、使用场景以及重要的注意事项。

 /**
- * 开发者工具弹窗类
+ * 开发者工具弹窗类,用于展示 JCEF 浏览器的开发者工具。
+ * 
+ * 此类提供了一个模态对话框,用于显示特定 CefBrowser 实例的开发者工具。
+ * 当对话框关闭时,会自动释放相关资源。
+ * 
+ * @see CefBrowser#getDevTools(Point)
  */

20-34: 代码实现清晰,建议小幅优化

构造函数的实现逻辑清晰。建议考虑以下优化:

  1. 添加窗口大小的默认设置
  2. 添加窗口位置的默认设置
 public JCEFSwingDevTools(JFrame owner, String title, CefBrowser browser, Point inspectAt) {
     super(owner, title, false);
+    // 设置默认窗口大小
+    setSize(800, 600);
+    // 相对于父窗口居中
+    setLocationRelativeTo(owner);
 
     setLayout(new BorderLayout());
webui/src/views/oobe/locale/zh-CN.ts (1)

15-17: 文案表述建议优化

当前的警告文案略显强硬,建议调整措辞以保持专业性同时不失警示作用。

  'page.oobe.steps.welcome.docTips':
-    '请在开始前阅读{privacy}并打开{doc}放在旁边以作备用,99% 的用户因为不阅读它们导致遇到了问题无法解决。',
+    '请在开始前仔细阅读{privacy}并将{doc}作为参考。根据用户反馈,大多数使用问题都可以通过查阅文档得到解决。',
src/main/java/com/ghostchu/peerbanhelper/gui/impl/console/ConsoleProgressDialog.java (2)

21-23: 简化空值检查逻辑

当前的空值检查可以使用更简洁的方式。

建议修改为:

-        if (comment != null && !comment.isBlank()) {
+        if (comment != null && !comment.isEmpty()) {
             log.info("({})", comment);
         }

28-36: 建议添加空方法实现的说明文档

这些空方法实现需要添加注释说明为什么是空实现,以便其他开发者理解设计意图。

建议在每个空方法上添加类似以下的文档:

    /**
     * 控制台模式下此方法无需实现
     * 因为进度更新通过日志输出方式展示
     */
    @Override
    public void show() {
    }

Also applies to: 48-66

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingTaskbarControl.java (1)

8-14: 建议添加类级别的文档注释

这个类的功能很重要,建议添加详细的类文档。

建议添加如下文档:

/**
 * Swing任务栏控制实现类
 * 用于管理Windows任务栏的进度显示和用户注意力请求
 * 支持全局和窗口级别的任务栏操作
 */
public class SwingTaskbarControl implements TaskbarControl {
webui/src/views/oobe/locale/en-US.ts (1)

15-17: 建议改进文档提示的语气

当前的文档提示语气过于强硬("99% of users encounter problems..."),可能会给用户带来负面体验。建议采用更专业和积极的表述方式。

建议修改为:

-    'Please read our {privacy} and open {doc} put it aside for backup, 99% of users encounter problems that cannot be solved because they do not read them.',
+    'We strongly recommend reviewing our {privacy} and keeping the {doc} handy for reference. The documentation contains essential information to help you get the most out of PeerBanHelper and troubleshoot common issues.',
src/main/java/com/ghostchu/peerbanhelper/util/MIDIPlayer.java (1)

13-15: 建议添加线程安全保护

currentIndex 变量在多线程环境下可能存在竞争条件,建议添加适当的同步机制。

建议添加 volatile 关键字或使用 AtomicInteger:

-    private int currentIndex = -1;
+    private final AtomicInteger currentIndex = new AtomicInteger(-1);

相应地修改 nextSequence() 方法中的使用:

-    currentIndex++;
-    if (currentIndex < sequence.length) {
+    int index = currentIndex.incrementAndGet();
+    if (index < sequence.length) {
src/main/java/com/ghostchu/peerbanhelper/util/jcef/JCEFAppFactory.java (2)

14-19: 建议优化目录创建逻辑

建议将目录创建逻辑封装成一个独立的辅助方法,并添加适当的错误处理。

+    private static void createDirectoryIfNotExists(File dir) throws IOException {
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new IOException("无法创建目录: " + dir.getAbsolutePath());
+        }
+    }

46-50: 建议增加镜像可用性检查机制

当前的镜像配置是静态的,建议:

  1. 添加镜像可用性检测
  2. 实现镜像自动切换机制
  3. 考虑添加更多的国际镜像
webui/src/views/settings/components/info/locale/zh-CN.ts (1)

51-51: 文案表述建议优化

当前文案可以更清晰地指导用户。建议修改为:

-  'page.settings.tab.info.btn.status.fail.tips': '获取配置失败,这可能是配置存在问题,点击查看文档',
+  'page.settings.tab.info.btn.status.fail.tips': '获取配置失败。可能原因:配置文件格式错误或权限不足。点击此处查看故障排除文档',
webui/src/views/settings/components/info/locale/en-US.ts (1)

51-52: 建议保持中英文提示一致性

为保持与中文版本的一致性,建议同步更新英文提示:

-    'Failed to obtain configuration, this may be a configuration problem, click to view the document',
+    'Failed to obtain configuration. Possible causes: invalid configuration format or insufficient permissions. Click here to view troubleshooting documentation',
src/main/java/com/ghostchu/peerbanhelper/util/MiscUtil.java (1)

122-137: 建议优化64位JVM检测逻辑

当前实现有以下几点可以改进:

  1. 建议添加日志记录检测过程
  2. 考虑缓存检测结果
  3. 添加单元测试覆盖不同场景
+    private static Boolean is64BitCache = null;
     public static boolean is64BitJVM() {
+        if (is64BitCache != null) {
+            return is64BitCache;
+        }
         // 优先检查 sun.arch.data.model(直接指明位数)
         String dataModel = System.getProperty("sun.arch.data.model");
         if (dataModel != null) {
-            return "64".equals(dataModel);
+            is64BitCache = "64".equals(dataModel);
+            return is64BitCache;
         }
         // 检查已知的 64 位架构名称
         String arch = System.getProperty("os.arch");
         List<String> arch64 = Arrays.asList("x86_64", "amd64", "aarch64", "ppc64", "ppc64le", "s390x", "sparcv9", "ia64");
         if (arch64.contains(arch)) {
-            return true;
+            is64BitCache = true;
+            return is64BitCache;
         }
         // 后备检查:虚拟机名称是否包含 "64"
         String vmName = System.getProperty("java.vm.name", "").toLowerCase();
-        return vmName.contains("64");
+        is64BitCache = vmName.contains("64");
+        return is64BitCache;
     }
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingProgressDialog.java (2)

22-22: 建议:使用动态窗口尺寸

固定的窗口尺寸(400x200)可能在不同DPI设置下显示不正确,建议使用相对尺寸或根据内容自动调整。

-        frame.setSize(400, 200);
+        frame.setPreferredSize(new Dimension(
+            (int) (400 * frame.getGraphicsConfiguration().getDefaultTransform().getScaleX()),
+            (int) (200 * frame.getGraphicsConfiguration().getDefaultTransform().getScaleY())
+        ));

19-19: 建议:将中文注释改为英文

为了保持代码的国际化,建议将中文注释 "创建主窗口" 改为英文。

-        // 创建主窗口
+        // Create main window
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java (1)

145-145: 建议:优化PTR查询超时处理

PTR查询的超时时间(3秒)应该配置化,并且建议使用自定义线程池来避免可能的线程池耗尽问题。

+    private static final int PTR_LOOKUP_TIMEOUT_SECONDS = 3;
+    private final ExecutorService ptrLookupExecutor = Executors.newFixedThreadPool(10);
+
     // In the code:
-    ptrLookup = CompletableFuture.supplyAsync(() -> ipAddress.toInetAddress().getCanonicalHostName()).get(3, TimeUnit.SECONDS);
+    ptrLookup = CompletableFuture.supplyAsync(
+        () -> ipAddress.toInetAddress().getCanonicalHostName(),
+        ptrLookupExecutor
+    ).get(PTR_LOOKUP_TIMEOUT_SECONDS, TimeUnit.SECONDS);
src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/AboutWindow.java (6)

42-44: 建议使用 try-with-resources 管理 MIDI 资源

MIDI 播放器的资源管理可以更加严格。建议使用 try-with-resources 语句来确保资源的正确释放。

-    private MIDIPlayer midiPlayer = new MIDIPlayer(
-            Main.class.getResourceAsStream("/assets/midi/ABOUT-MiSide-MusicMenu.mid"),
-            Main.class.getResourceAsStream("/assets/midi/ABOUT-MiSide-MusicMenu-Update.mid"));
+    private MIDIPlayer initMidiPlayer() {
+        try (InputStream menuStream = Main.class.getResourceAsStream("/assets/midi/ABOUT-MiSide-MusicMenu.mid");
+             InputStream updateStream = Main.class.getResourceAsStream("/assets/midi/ABOUT-MiSide-MusicMenu-Update.mid")) {
+            return new MIDIPlayer(menuStream, updateStream);
+        } catch (IOException e) {
+            log.error("Failed to initialize MIDI player", e);
+            return null;
+        }
+    }

62-64: 改进异常处理逻辑

当前的异常处理仅打印堆栈跟踪,建议添加更多的错误信息以便调试。

-        } catch (Exception ignored) {
-            ignored.printStackTrace();
+        } catch (Exception e) {
+            log.error("Failed to play MIDI: {}", e.getMessage(), e);

120-122: 完善异常处理

异常处理应该使用日志系统而不是直接打印到标准错误流。

-        } catch (Exception e) {
-            e.printStackTrace();
+        } catch (Exception e) {
+            log.error("Failed to load content: {}", e.getMessage(), e);

159-161: 改进异常处理和日志记录

使用日志系统替代直接的异常打印。

-            } catch (BadLocationException ex) {
-                ex.printStackTrace();
+            } catch (BadLocationException ex) {
+                log.error("Error updating cursor: {}", ex.getMessage(), ex);

219-221: 统一异常处理方式

保持异常处理的一致性,使用日志系统记录错误。

-        } catch (BadLocationException ex) {
-            ex.printStackTrace();
+        } catch (BadLocationException ex) {
+            log.error("Error processing string: {}", ex.getMessage(), ex);

243-245: 改进命令处理中的异常处理

命令处理中的异常处理需要更详细的错误信息。

-        } catch (Exception ex) {
-            ex.printStackTrace();
+        } catch (Exception ex) {
+            log.error("Error processing command {}: {}", item.getClass().getSimpleName(), ex.getMessage(), ex);
src/main/java/com/ghostchu/peerbanhelper/text/TextManager.java (2)

67-67: 建议增加区域设置的验证

直接使用 toLowerCase 可能不足以处理所有的区域设置情况。建议添加更严格的验证。

-        locale = locale.toLowerCase(Locale.ROOT);
+        if (locale == null || locale.isEmpty()) {
+            log.warn("Empty locale provided, falling back to default locale");
+            locale = DEF_LOCALE;
+        }
+        locale = locale.toLowerCase(Locale.ROOT);
+        if (!isValidLocale(locale)) {
+            log.warn("Invalid locale format: {}, falling back to default locale", locale);
+            locale = DEF_LOCALE;
+        }

+    private boolean isValidLocale(String locale) {
+        return locale.matches("^[a-z]{2}(_[a-z]{2})?$");
+    }

235-235: 建议优化区域设置的存储

建议使用规范化的格式存储区域设置,并添加验证。

-                availableLang.put(langName.toLowerCase(Locale.ROOT), configuration);
+                String normalizedLangName = normalizeLangName(langName);
+                if (normalizedLangName != null) {
+                    availableLang.put(normalizedLangName, configuration);
+                } else {
+                    log.warn("Skipping invalid language name: {}", langName);
+                }

+    private String normalizeLangName(String langName) {
+        if (langName == null || langName.isEmpty()) {
+            return null;
+        }
+        String normalized = langName.toLowerCase(Locale.ROOT);
+        return isValidLocale(normalized) ? normalized : null;
+    }
src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (1)

507-509: 建议改进枚举常量的组织方式

当前的枚举常量组织方式不够清晰,建议按功能模块分组并添加注释。

+    // WebUI 相关
     GUI_TABBED_WEBUI,
+
+    // JCEF 浏览器相关
     JCEF_BROWSER_UNSUPPORTED_PLATFORM,
     JCEF_BROWSER_UNSUPPORTED_EXCEPTION,
+    JCEF_DOWNLOAD_TITLE,
+    JCEF_DOWNLOAD_DESCRIPTION,
+    JCEF_DOWNLOAD_UNZIP_DESCRIPTION,
+
+    // 通用 GUI 元素
+    GUI_COMMON_CANCEL,
+
+    // IPDB 相关
+    IPDB_DOWNLOAD_TITLE,
+    IPDB_DOWNLOAD_DESCRIPTION,
src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java (1)

324-341: 下载进度跟踪实现良好!

进度跟踪的实现非常完整,包括了:

  • 合理的更新阈值配置
  • 确定和不确定状态的处理
  • 用户界面反馈

建议考虑添加下载速度显示,以提供更好的用户体验。

 var bodyHandler = tracker.tracking(HttpResponse.BodyHandlers.ofFile(path), item -> {
     if (!(progressDialog instanceof ConsoleProgressDialog)) {
         HTTPUtil.onProgress(item);
     }
     progressDialog.setProgressDisplayIndeterminate(!item.determinate());
     if (item.determinate()) {
         progressDialog.updateProgress((float) item.totalBytesTransferred() / item.contentLength());
+        // 添加下载速度显示
+        double speed = item.transferRateInBytes();
+        progressDialog.setComment(String.format("%s - %.2f MB/s", mirror.getIPDBUrl(), speed / (1024 * 1024)));
     } else {
         progressDialog.updateProgress(0);
     }
 });
webui/src/views/settings/components/info/index.vue (1)

416-442: 按钮状态显示优化得当!

状态显示的改进很好:

  • 使用 a-space 组件优化了布局
  • 配置失败时提供帮助链接
  • 清晰的视觉反馈

建议考虑添加错误代码显示,以便更容易进行故障排除。

 <a-typography-text :type="btnStatus?.data.configSuccess ? 'success' : 'warning'">
   {{
     btnStatus?.data.configSuccess
       ? t('page.settings.tab.info.btn.status.success')
-      : t('page.settings.tab.info.btn.status.fail')
+      : t('page.settings.tab.info.btn.status.fail') + 
+        (btnStatus?.data.errorCode ? ` (${btnStatus.data.errorCode})` : '')
   }}
 </a-typography-text>
src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (2)

204-213: 系统兼容性检查实现完善!

位数检查的实现很好:

  • 正确检测 32 位 JVM
  • 适当的警告消息
  • 支持强制检查失败的测试选项

建议添加系统要求到日志输出。

 private void postCompatibilityCheck() {
     if (!Util.is64BitJVM() || ExternalSwitch.parseBoolean("pbh.forceBitnessCheckFail")) {
+        log.info("系统要求:64位 JVM");
+        log.info("当前系统:{}位 JVM", Util.is64BitJVM() ? "64" : "32");
         ExchangeMap.UNSUPPORTED_PLATFORM = true;
         ExchangeMap.GUI_DISPLAY_FLAGS.add(new ExchangeMap.DisplayFlag("unsupported-platform", 10, tlUI(Lang.TITLE_INCOMPATIBLE_PLATFORM)));
         log.warn(tlUI(Lang.INCOMPATIBLE_BITNESS_LOG));

847-862: NAT 配置检查逻辑完善!

对 peer flags 的检查实现很好:

  • 全面的条件检查
  • 清晰的错误提示
  • 避免重复警告

建议添加更详细的调试日志。

 if (peer.getFlags() == null
         || peer.getFlags().isFromIncoming()
         || !peer.getFlags().isOutgoingConnection()
         || peer.getFlags().isFromTracker()
         || peer.getFlags().isFromDHT()
         || peer.getFlags().isFromPEX()) {
+    log.debug("检测到可能的 NAT 配置问题:peer={}, flags={}", 
+        peer.getPeerAddress(), 
+        peer.getFlags() != null ? peer.getFlags().toString() : "null");
     if (!alertManager.identifierAlertExistsIncludeRead("downloader-nat-setup-error@" + downloader.getName())) {
PACKAGING.md (2)

7-9: 建议:明确说明 Java 版本兼容性问题

关于 Java 运行环境的说明可以更加具体:

  1. 建议添加具体的 Java 21 问题编号或链接
  2. 明确说明 Java 23 存在的具体问题
  3. 提供临时解决方案

153-155: 建议:简化过长的配置项名称

pbh.please-disable-safe-network-environment-check-i-know-this-is-very-dangerous... 这个配置项名称过长:

  1. 可能导致命令行使用困难
  2. 不便于配置文件维护

建议:

  1. 使用更简短的配置项名称
  2. 通过警告消息或文档说明安全风险
src/main/resources/assets/credit.txt (3)

4-4: 使用标准的回环地址

127.127.127.127 不是标准的回环地址。建议使用 127.0.0.1 作为回环地址。

-Host 'peerbanhelper.about.console' resolved to 127.127.127.127.
+Host 'peerbanhelper.about.console' resolved to 127.0.0.1.

337-337: 修正 ChatGPT 版本号

"ChatGPT 4o" 中的 "o" 应该是 "0"。

-    OpenAI ChatGPT 4o - 帮助编写了大量代码
+    OpenAI ChatGPT 40 - 帮助编写了大量代码
🧰 Tools
🪛 LanguageTool

[formatting] ~337-~337: It looks like you are using the letter ‘O’ instead of the number ‘0’. Did you mean “40”?
Context: ...tant: (以下排名不分先后) OpenAI ChatGPT 4o - 帮助编写了大量代码 Github Copilot - 帮助编写了大...

(ZERO_O)


387-389: 优化段落格式

建议在这段重要的致谢文字前后添加分隔符,以提高可读性。

+--------------------------------------------
 感谢在爱发电上捐赠支持我们的朋友们
 以及在世界各个角落用实际行动传承互联网精神的 BTer
+--------------------------------------------
src/main/resources/lang/en-us/messages.yml (1)

588-593: Docker网络模式错误描述详尽,建议优化格式

错误描述非常完整:

  • 清楚解释了问题和影响
  • 指出了原因(Docker bridge网络模式)
  • 提供了解决方案(切换到host网络模式)
  • 包含了重要警告和社区支持信息

建议在描述中添加分段标题,使内容更有层次:

 Critical error detected: The Peer inbound connection IP address configuration of the downloader {} is incorrect ({}).  
 PeerBanHelper requires the real IP address of the Peer to function correctly, otherwise, it will incorrectly ban all inbound connections. Therefore, PeerBanHelper is ignoring these abnormal addresses. Bans will not take effect.  
-This is usually caused by the downloader running in a Docker environment and using the `bridge` network mode. You must switch to the `host` network mode to avoid user-space forwarding rewriting the IP address information.  
+原因:
+This is usually caused by the downloader running in a Docker environment and using the `bridge` network mode. 
+
+解决方案:
+You must switch to the `host` network mode to avoid user-space forwarding rewriting the IP address information.  
 
+重要提示:
 Note: You should correctly fix the IP issue. Simply removing internal network IP addresses from the ignore list will cause PeerBanHelper to incorrectly ban all inbound connections.  
 For assistance, please join the PeerBanHelper community. **This prompt will only appear once per downloader.**
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6313ad4 and 1c2e76e.

⛔ Files ignored due to path filters (2)
  • src/main/resources/assets/icon/common/uac_shield.svg is excluded by !**/*.svg
  • webui/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (59)
  • .github/workflows/build_fe.yml (1 hunks)
  • .github/workflows/webui.yml (2 hunks)
  • PACKAGING.md (1 hunks)
  • install4j/enable-jcef.txt (1 hunks)
  • install4j/lang/custom.utf8 (1 hunks)
  • install4j/lang/en-US.utf8 (1 hunks)
  • install4j/lang/zh-CN.utf8 (1 hunks)
  • install4j/project.install4j (5 hunks)
  • pom.xml (4 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/BuildMeta.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/Main.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (6 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/event/PBHLookAndFeelNeedReloadEvent.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/exchange/ExchangeMap.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/GuiManager.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/PBHGuiManager.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/ProgressDialog.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/TaskbarControl.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/GuiImpl.java (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/console/ConsoleGuiImpl.java (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/console/ConsoleProgressDialog.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/AboutWindow.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/JCEFSwingDevTools.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/MainWindow.form (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/MainWindow.java (6 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingGuiImpl.java (6 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingProgressDialog.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingTaskbarControl.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/PBHFlatLafTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/MacOSLafTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/PBHPlusTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/SnapshotTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/StandardLafTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/UnsupportedPlatformTheme.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java (3 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java (4 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/pbhplus/ActivationManager.java (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/text/TextManager.java (3 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/util/MIDIPlayer.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/util/MiscUtil.java (2 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/util/jcef/JCEFAppFactory.java (1 hunks)
  • src/main/java/com/ghostchu/peerbanhelper/web/JavalinWebContainer.java (1 hunks)
  • src/main/resources/assets/credit.txt (1 hunks)
  • src/main/resources/lang/en-us/messages.yml (2 hunks)
  • src/main/resources/lang/messages_fallback.yml (2 hunks)
  • src/main/resources/lang/zh-cn/messages.yml (2 hunks)
  • webui/src/components/asyncMethod.vue (1 hunks)
  • webui/src/utils/string.ts (2 hunks)
  • webui/src/views/dashboard/components/peerListModal.vue (2 hunks)
  • webui/src/views/data-view/banlog/components/banlogTable.vue (2 hunks)
  • webui/src/views/data-view/torrentList/components/banHistoryModal.vue (2 hunks)
  • webui/src/views/oobe/locale/en-US.ts (1 hunks)
  • webui/src/views/oobe/locale/zh-CN.ts (1 hunks)
  • webui/src/views/settings/components/info/index.vue (1 hunks)
  • webui/src/views/settings/components/info/locale/en-US.ts (1 hunks)
  • webui/src/views/settings/components/info/locale/zh-CN.ts (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • install4j/enable-jcef.txt
  • src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java
  • src/main/java/com/ghostchu/peerbanhelper/event/PBHLookAndFeelNeedReloadEvent.java
🧰 Additional context used
🪛 LanguageTool
src/main/resources/assets/credit.txt

[formatting] ~337-~337: It looks like you are using the letter ‘O’ instead of the number ‘0’. Did you mean “40”?
Context: ...tant: (以下排名不分先后) OpenAI ChatGPT 4o - 帮助编写了大量代码 Github Copilot - 帮助编写了大...

(ZERO_O)


[typographical] ~367-~367: Two consecutive dots
Context: ... .%#X M#####+;#H :M#M. .. .+/;%#########X###- -/%H%+;-,...

(DOUBLE_PUNCTUATION)


[formatting] ~373-~373: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...####X. =%M####################H;. /@###############+;;/%%;, ...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~376-~376: Loose punctuation mark.
Context: ... -%###################$. ;H######################M= ,%#####MH$...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~379-~379: Loose punctuation mark.
Context: ... -####X.,H# -+M##@- . ,###; ; =$##+ .#H...

(UNLIKELY_OPENING_PUNCTUATION)

⏰ Context from checks skipped due to timeout of 300000ms (1)
  • GitHub Check: Build_Installers / install4jc
🔇 Additional comments (99)
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (1)

35-35: 导入 TimeUnit 用于超时控制

新增的导入声明清晰明确,用于支持 DNS 查询的超时功能。

.github/workflows/webui.yml (2)

5-5: 分支配置更新符合最佳实践

将工作流触发器扩展到包含 dev 分支是一个好的改进:

  1. 支持开发分支的持续集成
  2. 保持了只在 master 分支部署的安全限制
  3. 有助于在合并到主分支前发现问题

Also applies to: 9-9


33-33: PNPM 版本保持一致性

build_fe.yml 保持相同的 PNPM 版本 (10.0.0) 是正确的做法,确保了构建环境的一致性。

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/theme/impl/PBHPlusTheme.java (1)

9-12: 暗色主题初始化模式不一致

暗色主题模式调用了 installLafInfo()setup(),而亮色主题模式只调用了 setup()。这种不一致可能会导致主题初始化问题。

建议统一初始化模式:

     @Override
     public void applyDark() {
-        FlatArcDarkOrangeIJTheme.installLafInfo();
         FlatArcDarkOrangeIJTheme.setup();
     }

或者在亮色主题中也添加 installLafInfo()

     @Override
     public void applyLight() {
+        FlatArcOrangeIJTheme.installLafInfo();
         FlatArcOrangeIJTheme.setup();
     }
✅ Verification successful

确认:暗色主题初始化模式确实存在不一致

代码库中的其他主题实现(如 StandardLafTheme、SnapshotTheme、UnsupportedPlatformTheme)都只调用 setup()。建议采用第一个修复方案,移除多余的 installLafInfo() 调用,保持与其他主题实现一致的初始化模式:

     @Override
     public void applyDark() {
-        FlatArcDarkOrangeIJTheme.installLafInfo();
         FlatArcDarkOrangeIJTheme.setup();
     }
🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Search for FlatLaf theme related files and implementations
fd -e java | xargs rg -l "FlatLaf|Theme"

# Search for theme initialization patterns
rg "installLafInfo|setup" -A 2 -B 2

# Look for documentation about theme initialization
fd "README|CONTRIBUTING" | xargs cat

Length of output: 69073

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingGuiImpl.java (19)

3-4: Import 导入库检查

这些导入在本次提交中看上去是合理的,无需进一步调整。


8-8: 事件总线的依赖导入

此代码便于监听外部事件刷新主题,暂无问题。


10-11: 导入ProgressDialog和TaskbarControl

看起来是在GUI中加入进度条对话框和任务栏控制功能的接口引用,符合本次PR目标,无需调整。


14-15: 引入自定义主题引用

这里引入了PBHFlatLafTheme和其他主题实现类。保持一致性即可。


20-20: Guava EventBus的使用

新增订阅事件的功能,符合对统一事件处理的需求。


26-27: Swing字体资源导入说明

这里显示导入了FontUIResource和StyleContext,用于动态调整Swing字体,目测正常。


32-33: Enumeration与Locale的导入

这些导入用于在setUIFont与主题切换中处理UI资源以及国际化区域设置,保持不变即可。


47-50: 新增字段pbhFlatLafTheme与swingTaskbarControl

这些字段用于跟踪主题和任务栏控制对象,符合本次PR的功能增强需求。


58-62: 在Linux平台开启窗口装饰

通过判断os.name包含"Linux",启用JFrame/JDialog的装饰,逻辑简单明了,无需改动。


65-73: setUIFont方法

遍历UIManager的Key,将字体替换为自定义FontUIResource。实现逻辑清晰,暂时无改进意见。


124-126: 主题重载事件

needReloadThemes事件被订阅,以更新UI主题。这是一个常见用法,暂无问题。


184-208: getFont方法

该方法在判断可显示字符后动态生成新的字体对象,对于跨平台字体兼容性非常实用。当前实现没有明显问题。


207-207: 初始化 SwingTaskbarControl

在创建主窗口时,赋值给 swingTaskbarControl,扩展了对任务栏的控制。没有发现问题。


211-214: createProgressDialog

为 GUI 提供进度对话框对象的创建逻辑,符合需求。


216-222: taskbarControl 方法

若 swingTaskbarControl 不为 null,则直接使用,否则返回父类的默认实现,符合本次功能扩展的设计。


316-318: 请求窗口用户注意力

通过 Taskbar.requestWindowUserAttention 提供原生的窗口闪烁或标记功能,用于提示用户,逻辑正常。


319-320: 在createDialog方法中,使用SwingUtilities.invokeLater

确保 UI 函数在 EDT 执行,不会在多线程环境导致冲突。实现方式正确。


Line range hint 325-345: createNotification方法

在检测到 SystemTray 上的TrayIcon后,通过 displayMessage 来显示信息,并在Windows平台上使用调度器定时刷新Tray图标。目前实现看上去合理,无需特别修改。


346-346: refreshTrayIcon方法

使用 remove(icon) 再 add(icon) 的方式刷新图标,修复 issue #515,做法可行。

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/MainWindow.java (34)

5-5: 额外 ExternalSwitch 导入

允许在Swing界面中读取外部开关。看起来与主题或功能切换相关。无问题。


8-8: PBHServerStartedEvent导入

将事件与主窗口联系起来,用于执行JCEF初始化等操作,符合项目需求。


10-10: JCEFAppFactory导入

用于构建JCEF实例,实现内置浏览器功能。新增特性符合PR目标。


12-12: 引入Subscribe注解

通过Guava EventBus来订阅事件。在本类中关键性为启动WebUI时机。


16-19: Cef相关对象导入

包含CefApp、CefClient、Browser等,均与嵌入式浏览器相关。功能逻辑清晰。


47-56: 新增SwingGuiImpl、LogsTab、WindowMenuBar、TrayMenu、WebUITab等字段

在窗口类中添加了对应的Getter字段,用于管理各功能模块。可提高MainWindow的可读性与扩展性。


70-70: 设置窗口标题

初始化时显示“加载中”状态,符合用户友好体验。


76-78: 初始化WindowMenuBar和TrayMenu

在构造函数中创建菜单栏和托盘菜单,提升应用可用性。


83-83: 替换关闭逻辑为minimizeToTray

用户点击关闭窗口时,改为最小化到系统托盘。符合用户需求的交互逻辑。


89-90: 初始化logsTab和webuiTab

为应用日志和Web UI提供独立模块,有助于功能的清晰度。


118-118: openWebUI方法改为127.0.0.1

与localhost等效,一些网络环境下127.0.0.1可能更稳定,变更合理。


129-129: 在dispose方法中关闭webuiTab

确保JCEF资源得到释放,避免内存泄漏。


154-155: 启用loggerScrollPane并设置字体

这样可以确保日志区域可用及外观一致,无明显问题。


160-161: 动态获取TextArea.font并应用

保证日志列表文字与系统UI主题一致,可读性更好。


190-208: getFont方法(在MainWindow中)

与SwingGuiImpl类似,按可显示性与平台判断来选择字体,减少乱码风险,逻辑可用。


215-222: WebUITab内部类的声明

为WebUI提供独立容器,通过实现AutoCloseable简化资源管理。初始字段定义没问题。


223-226: WebUITab构造函数

注册EventBus以监听PBHServerStartedEvent,便于在服务器启动后初始化JCEF。


228-230: onPeerBanHelperStarted事件处理

开启虚拟线程执行JCEF初始化,减少阻塞UI线程。做法明智。


234-238: initJCEFEngine中的开关逻辑

判断pbh.nojcef或enable-jcef.txt是否存在来决定是否加载JCEF。使得JCEF可选性好。


241-263: JCEF构建流程与进度对话框

使用JCEFAppFactory创建并设置下载与解压的进度回调,通过progressDialog显示给用户,用户体验良好。


263-275: 在窗口激活或未激活时,动态决定是否启用或停用Browser

通过添加WindowListener并调用checkIfBrowserShouldActive,减少后台渲染的资源消耗。实现很巧妙。


286-295: checkIfBrowserShouldActive方法

在EDT中判断窗口可见性并调用activeBrowser或deActiveBrowser,可有效节省资源。


297-324: activeBrowser方法

若browser尚未初始化,则createClient并创建浏览器对象。还增加了keyboard handler以便F12打开DevTools。功能完善。


326-336: deActiveBrowser方法

移除浏览器UI组件并释放CefClient与CefBrowser,避免资源占用。逻辑正确。


340-358: devToolsShow方法

单独开窗口显示开发者工具,可在调试时提供便利且不干扰主页面,细节实现完善。


361-365: close方法

在关闭时调用deActiveBrowser并释放app对象,彻底销毁Cef资源,避免内存泄漏。实现到位。


368-374: TrayMenu类与其字段定义

新的托盘功能类,使用SwingTray封装系统托盘图标和菜单,结构清晰。


375-390: 构造函数与setupSystemTray方法

在系统支持的情况下创建TrayIcon并添加到系统托盘。创建swingTrayDialog并更新菜单。符合常规实现。


396-404: minimizeToTray方法

将主窗口隐藏并在首次执行时弹出通知,提示用户窗口已最小化到托盘。贴合用户预期。


407-425: 更新托盘菜单

动态构建JMenuItem列表,包括显示主窗口、打开WebUI、退出等选项,方便用户操作。逻辑清晰。


427-446: menuDownloaderStats与menuBanStats方法

获取下载器数与被Ban的对等节点统计信息并显示到菜单项中,功能有用且实现简洁。


448-451: menuDisplayItem方法

设置特定菜单项不可用,用于在托盘菜单中显示静态信息。实现无问题。


455-606: WindowMenuBar与内部菜单项

新建菜单栏,包括程序、WebUI、调试等选项。通过向导操作简化用户流程,整体实现良好。


607-620: LogsTab内部类

初始化日志列表并设置自定义渲染器,便于分类显示error、warn等日志。功能逻辑正确。

src/main/java/com/ghostchu/peerbanhelper/gui/TaskbarControl.java (1)

1-9: 新增TaskbarControl接口

定义updateProgress与requestUserAttention,用于在不同平台上提供任务栏状态更新与提示功能。接口设计简单明了,建议保留。

webui/src/utils/string.ts (1)

15-16: 实现完善且符合网络地址格式规范!

新增的 formatIPAddressPort 函数能够正确处理 IPv4 和 IPv6 地址的格式化,遵循了 RFC 标准规范。对于 IPv6 地址,使用方括号包裹地址并添加端口号,这是很好的实践。

src/main/java/com/ghostchu/peerbanhelper/gui/GuiManager.java (1)

24-26: 请确认 TaskbarControl 接口的可见性

新增的方法符合接口的职责,但需要验证:

  1. TaskbarControl 接口是否已在项目中定义
  2. 是否需要添加相关的导入语句
✅ Verification successful

已验证 TaskbarControl 接口定义正确

TaskbarControl 接口已在同一包(com.ghostchu.peerbanhelper.gui)中定义,无需添加额外的导入语句。接口可见性符合要求。

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 搜索 TaskbarControl 接口的定义
rg -t java "interface TaskbarControl"

Length of output: 138

webui/src/components/asyncMethod.vue (1)

12-16: 类型安全性得到显著提升

代码改进:

  • any 类型替换为 unknown[] 提高了类型安全性
  • 异步函数的参数和返回值类型定义更加严格
  • 插槽的类型定义更加准确

Also applies to: 21-21, 24-24

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/JCEFSwingDevTools.java (1)

36-40: 资源释放处理得当

dispose() 方法的实现正确,确保了 devTools 资源的proper清理。

install4j/lang/en-US.utf8 (1)

11-13: 本地化文案清晰完整

新增的 JCEF 组件描述文案清晰,充分说明了该组件的可选性质和功能影响。

src/main/java/com/ghostchu/peerbanhelper/BuildMeta.java (1)

25-25: 错误处理改进合理

通过添加默认值 "Unknown",改进了配置缺失时的错误处理,与类中其他字段的处理方式保持一致。

src/main/java/com/ghostchu/peerbanhelper/gui/PBHGuiManager.java (2)

58-60: 委托模式实现得当!

createProgressDialog 方法通过委托模式优雅地实现了进度对话框的创建功能。


63-65: 任务栏控制实现简洁明了!

taskbarControl 方法采用相同的委托模式,保持了代码的一致性。

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/MainWindow.form (1)

25-26: 界面组件配置优化合理!

以下改进提升了用户体验:

  1. 启用了滚动面板,确保日志内容可以正常滚动
  2. 使用系统文本区域字体,提供了更好的跨平台一致性

Also applies to: 35-37

src/main/java/com/ghostchu/peerbanhelper/gui/impl/swing/SwingTaskbarControl.java (2)

16-34: 任务栏进度更新实现完善!

代码具有以下优点:

  1. 正确处理了线程安全(使用EventQueue)
  2. 完善的特性支持检查
  3. 合理的降级策略

36-51: 用户注意力请求功能实现稳健!

实现考虑周到:

  1. 空值处理得当
  2. 支持关键和非关键注意力请求
  3. 提供了合适的降级方案
webui/src/views/data-view/banlog/components/banlogTable.vue (1)

35-35: 代码改进:统一了IP地址格式化方式

使用新的 formatIPAddressPort 工具函数统一了IP地址和端口的显示格式,提高了代码的一致性和可维护性。

Also applies to: 82-82

webui/src/views/dashboard/components/peerListModal.vue (1)

25-25: 代码改进:保持了IP地址显示的一致性

采用与其他组件相同的 formatIPAddressPort 函数来格式化IP地址和端口,确保了整个应用程序中IP地址显示格式的一致性。

Also applies to: 87-87

src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java (1)

82-83: 代码改进:使用了更安全的IP地址处理

使用 IPAddressUtil 处理IP地址是一个很好的改进,它提供了更安全和标准化的IP地址处理方式。

src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java (1)

387-387: 资源清理处理得当!

在 whenComplete 中关闭进度对话框确保了资源的正确释放,防止内存泄漏和界面残留。

src/main/java/com/ghostchu/peerbanhelper/Main.java (2)

115-118: 区域设置处理改进!

从 ExternalSwitch 获取用户区域设置的实现更加灵活,允许通过外部配置覆盖默认值。


122-122: 任务栏进度状态更新得当!

在 GUI 初始化过程中更新任务栏状态为不确定状态,为用户提供了良好的视觉反馈。

install4j/project.install4j (1)

1626-1631: 注意:新增的不受支持平台安装程序可能存在兼容性风险

为 x86 (32位) 和 arm32-vfp-hflt 平台添加安装程序存在以下问题:

  1. 这些平台已被 Java 21+ 弃用
  2. 文件名前缀 _____UNSUPPORTED_ 可能会引起用户混淆

建议:

  1. 考虑添加明确的版本兼容性警告
  2. 在安装过程中显示明确的不受支持提示
webui/src/views/data-view/torrentList/components/banHistoryModal.vue (1)

48-48: 代码改进:使用统一的 IP 地址格式化方法

使用 formatIPAddressPort 函数替代直接字符串拼接是一个很好的改进:

  1. 提高了代码的一致性
  2. 集中处理 IP 地址格式化逻辑
  3. 便于后续维护和修改
pom.xml (4)

9-9: 版本号更新至 7.4.0-Beta1

版本更新符合语义化版本规范,Beta 标识清晰表明这是一个测试版本。


324-328: 新增 FlatLaf IntelliJ 主题依赖

新增的 flatlaf-intellij-themes 依赖:

  1. 版本号与 flatlafVersion 属性定义的版本一致
  2. 扩展了 UI 主题选项

518-522: 新增 JCEF 依赖

新增的 jcefmaven 依赖用于支持 WebUI 控制台功能:

  1. 使用了特定版本 127.3.1
  2. 需要确保跨平台兼容性

建议:

  1. 验证在所有支持的平台上的兼容性
  2. 添加相关的单元测试

442-447: 注释掉 bcpg-jdk18on 依赖

注释掉 bcpg-jdk18on 依赖:

  1. 需要确认是否会影响现有功能
  2. 建议添加注释说明移除原因
✅ Verification successful

可以安全移除 bcpg-jdk18on 依赖

经过验证:

  1. 代码库中没有使用任何 PGP 相关功能
  2. 现有的 BouncyCastle 导入都来自 bcprov-jdk18on 模块
  3. 移除 bcpg-jdk18on 依赖不会影响现有功能

建议在注释中添加移除原因,例如:"移除未使用的 PGP 加密依赖"

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 检查代码中是否还有使用 bcpg-jdk18on 的地方
rg -l "org\.bouncycastle\.bcpg" 

Length of output: 33


Script:

#!/bin/bash
# Search for PGP related terms and common BouncyCastle PGP classes
rg -i "pgp|gnupg|openpgp" 
rg -i "PGPPublicKey|PGPPrivateKey|PGPSignature|PGPEncrypted|BCPGInputStream|BCPGOutputStream"
# Search for any remaining BouncyCastle imports
rg "import.*bouncycastle"

Length of output: 671


Script:

#!/bin/bash
# Check for other BouncyCastle dependencies in pom.xml
rg "bouncycastle" pom.xml

Length of output: 333

src/main/resources/lang/zh-cn/messages.yml (4)

195-196: 简化的标题格式更加清晰!

移除了版本号占位符,使标题更加简洁易读。


570-573: JCEF 相关的本地化字符串翻译准确!

新增的 JCEF 相关提示信息翻译准确,用户体验良好。


Line range hint 586-593: Docker 网络模式错误提示信息清晰明确!

错误提示信息准确描述了问题原因和解决方案,对用户很有帮助。特别是说明了:

  1. 问题的具体原因(Docker bridge 网络模式)
  2. 可能造成的影响(错误封禁)
  3. 解决方案(切换到 host 网络模式)

Line range hint 594-599: 平台兼容性警告信息翻译到位!

新增的平台兼容性警告信息翻译准确,清晰地传达了:

  1. 不受支持平台的风险提示
  2. 32位系统的特殊警告
  3. 未来可能移除兼容性支持的说明
src/main/resources/lang/messages_fallback.yml (7)

194-195: 简化了 GUI 标题显示!

移除了版本号占位符,使界面更加简洁。


572-573: 实验性功能描述清晰!

准确描述了功能的用途和局限性,并明确标注了这是一个实验性算法。


573-576: WebUI 和 JCEF 相关提示信息完整!

为 WebUI 控制台和 JCEF 初始化提供了清晰的反馈信息。


577-579: JCEF 下载提示信息详尽!

清晰说明了下载过程,并提供了使用 nojcef 参数禁用此功能的选项。


580-584: 通用 UI 文本合理!

为取消按钮、JCEF 解压和 IPDB 下载等操作提供了清晰的反馈信息。


585-593: Docker 网络模式错误提示完整!

详细说明了 Docker 网络模式导致的问题、原因和解决方案,并提供了切换到 host 网络模式的具体指导。


594-599: 平台兼容性警告信息清晰!

明确说明了不支持的平台和 32 位系统的限制,并提醒用户不要报告相关兼容性问题。

src/main/resources/lang/en-us/messages.yml (7)

194-195: 简化了GUI标题格式

移除了版本号占位符,使标题更加简洁。


573-575: JCEF错误消息清晰明确

新增的JCEF初始化失败消息能够清楚地说明失败原因(平台不支持或初始化异常)。


576-579: JCEF下载提示信息完整且实用

下载提示信息包含了:

  • 清晰的进度说明
  • 禁用JCEF功能的具体方法

这对用户非常友好。


580-581: GeoIP数据库下载提示信息清晰

提示信息明确说明了下载目的(提供IP地理位置信息)。


582-582: JCEF解压提示信息简洁明了

清楚地提示用户解压过程可能需要一些时间。


583-585: GUI通用消息设计合理

  • 包含了必要的取消按钮文本
  • 使用emoji表情(❤和🔧)增加了界面的友好性

586-587: Docker网络模式错误提示标题准确

标题清晰地表明了:

  • 这是一个严重错误(Critical Error)
  • 可能导致PeerBanHelper无法正常工作

@@ -20,7 +20,7 @@ jobs:
- uses: pnpm/action-setup@v3
name: Install pnpm
with:
version: 9.1.1
version: 10.0.0
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

需要更新 package.json 配置以适配 PNPM 10.0.0

由于项目使用了补丁依赖(vue-request),需要在 package.json 中添加以下配置以确保正常工作:

{
  "pnpm": {
    "onlyBuiltDependencies": ["vue-request"]
  }
}

建议升级步骤:

  1. 添加上述配置
  2. 删除 node_modules 和 .pnpm-store
  3. 重新执行 pnpm install

原因:PNPM 10.0.0 默认禁用了依赖包的生命周期脚本,且存储格式发生了变化。

🔗 Analysis chain

需要验证 PNPM 10.0.0 的兼容性

将 PNPM 从 9.1.1 升级到 10.0.0 是一个主版本升级,可能会带来重大变化。建议:

  1. 确保已经查看了 PNPM 10.0.0 的更新日志
  2. 验证所有依赖包与新版本兼容
  3. 在开发环境中完整测试构建流程
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 检查 PNPM 10.0.0 的兼容性要求和重大变更

# 获取 PNPM 10.0.0 的发布说明
curl -s https://api.github.com/repos/pnpm/pnpm/releases/tags/v10.0.0 | jq -r '.body'

# 检查项目的 package.json 中的依赖版本
cd webui && cat package.json | jq '.dependencies, .devDependencies'

Length of output: 13486


Script:

#!/bin/bash
# Find and analyze package.json files
echo "Looking for package.json files:"
fd package.json

echo -e "\nAnalyzing found package.json files:"
for f in $(fd package.json); do
  echo -e "\n=== $f ==="
  cat "$f" | jq '{
    dependencies,
    devDependencies,
    pnpm,
    scripts: .scripts | select( . != null )
  }'
done

Length of output: 2784

src/main/resources/assets/credit.txt Show resolved Hide resolved
Ghost-chu and others added 6 commits January 26, 2025 02:38
…rogressDialog.java

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…impl/SnapshotTheme.java

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…indow.java

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@Ghost-chu Ghost-chu merged commit ae7e0a2 into master Jan 25, 2025
9 checks passed
@CreeperAWA
Copy link
Contributor

CreeperAWA commented Jan 26, 2025

错别字(

由于上游 OpenJDK 提供商已不再提供 Windows x86 的构建,32 位 Windows 不再本次更新的范围内。

应为

由于上游 OpenJDK 提供商已不再提供 Windows x86 的构建,32 位 Windows 不在本次更新的范围内。

@coderabbitai coderabbitai bot mentioned this pull request Jan 27, 2025
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.

3 participants