Skip to content

Introduce StickerService; add duplicate detection and cleanup#48

Merged
Dax233 merged 19 commits intodevfrom
Domain-Models
Aug 11, 2025
Merged

Introduce StickerService; add duplicate detection and cleanup#48
Dax233 merged 19 commits intodevfrom
Domain-Models

Conversation

@Dax233
Copy link
Member

@Dax233 Dax233 commented Aug 11, 2025

Summary by Sourcery

引入一个专用的 StickerService,以集中所有贴纸管理逻辑,包括基于感知哈希的重复检测和孤立文件垃圾回收,并重构现有组件 (ActionHandler, MessageBuilder, PromptBuilder),将贴纸操作委托给这个新服务。

New Features:

  • 添加 StickerService,提供用于贴纸列表、检索、管理以及启动时自动孤立文件垃圾回收的公共 API。
  • 实现感知哈希计算和相似性检查,以在插入前检测并防止重复贴纸。

Enhancements:

  • 重构 ActionHandler、MessageBuilder 和 PromptBuilder,以使用 StickerService 而不是内联的贴纸逻辑。
  • 扩展贴纸存储服务和数据库模式,以存储 perceptual_hash 并提供相似性搜索 API。
  • 更新 DI 容器和布线,以实例化和注入 StickerService,并从 ActionHandler 中移除旧的贴纸目录字段。
Original summary in English

Summary by Sourcery

Introduce a dedicated StickerService to centralize all sticker management logic, including perceptual-hash-based duplicate detection and orphaned-file garbage collection, and refactor existing components (ActionHandler, MessageBuilder, PromptBuilder) to delegate sticker operations to this new service.

New Features:

  • Add StickerService with public APIs for sticker listing, retrieval, management, and automatic orphan-file garbage collection on startup.
  • Implement perceptual-hash calculation and similarity checking to detect and prevent duplicate stickers before insertion.

Enhancements:

  • Refactor ActionHandler, MessageBuilder, and PromptBuilder to use StickerService instead of in-line sticker logic.
  • Extend sticker storage service and database schema to store perceptual_hash and provide similarity search API.
  • Update DI container and wiring to instantiate and inject StickerService and remove legacy sticker directory fields from ActionHandler.

@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Aug 11, 2025

审阅者指南

此拉取请求将所有贴纸管理重构为一个独立的 StickerService,该服务具有基于感知哈希的去重、垃圾回收和缩略图网格重新生成功能;更新了 ActionHandler、MessageBuilder、PromptBuilder 和引导连接,以使用新服务;并扩展了数据库层,增加了对 perceptual_hash 的支持和相似性查找功能。

带有感知哈希去重功能的贴纸添加时序图

sequenceDiagram
    participant User
    participant ActionHandler
    participant StickerService
    participant StickerStorageService
    participant EventStorageService
    User->>ActionHandler: Request add sticker (image_hash, impression)
    ActionHandler->>StickerService: manage_stickers(add)
    StickerService->>EventStorageService: find_event_by_image_hash(image_hash)
    EventStorageService-->>StickerService: event_doc
    StickerService->>StickerService: calculate_perceptual_hash(image_bytes)
    StickerService->>StickerStorageService: find_similar_sticker_by_phash(perceptual_hash)
    StickerStorageService-->>StickerService: similar_sticker or None
    alt Similar sticker found
        StickerService-->>ActionHandler: Return deduplication message
    else No similar sticker
        StickerService->>StickerStorageService: add_sticker(..., perceptual_hash)
        StickerStorageService-->>StickerService: sticker_doc
        StickerService-->>ActionHandler: Return success message
    end
Loading

启动时贴纸垃圾回收时序图

sequenceDiagram
    participant System
    participant StickerService
    participant StickerStorageService
    System->>StickerService: run_garbage_collection()
    StickerService->>StickerStorageService: get_all_stickers(platform)
    StickerStorageService-->>StickerService: all_db_stickers
    StickerService->>StickerService: Scan sticker files, compare with DB
    StickerService->>StickerService: Delete orphan files
    StickerService-->>System: Return summary
Loading

重构后的贴纸管理类图

classDiagram
    class ActionHandler {
        - sticker_service: StickerService | None
        + set_dependencies(..., sticker_service: StickerService)
        + process_action_flow(...)
    }
    class StickerService {
        + get_all_stickers(platform_id)
        + get_sticker_file_path(platform_id, sticker_id)
        + manage_stickers(platform_id, params)
        + add_sticker(platform_id, params)
        + remove_sticker(platform_id, params)
        + edit_impression(platform_id, params)
        + regenerate_sticker_grid(platform_id)
        + run_garbage_collection()
    }
    class StickerStorageService {
        + add_sticker(platform, filename, impression, source_image_hash, perceptual_hash)
        + find_similar_sticker_by_phash(platform, phash_to_check, tolerance)
        + get_sticker_by_id(platform, sticker_id)
        + get_all_stickers(platform)
        + remove_sticker(platform, sticker_id)
        + edit_impression(platform, sticker_id, new_impression)
    }
    class EventStorageService {
        + find_event_by_image_hash(image_hash)
    }
    class MessageBuilder {
        + _add_sticker(sticker_id)
    }
    class PromptBuilder {
        + _build_system_prompt_blocks(...)
    }
    ActionHandler --> StickerService
    StickerService --> StickerStorageService
    StickerService --> EventStorageService
    MessageBuilder --> ActionHandler
    PromptBuilder --> ActionHandler
Loading

文件级更改

更改 详情 文件
将贴纸管理提取到专用的 StickerService 中
  • 创建了 StickerService,其中包含用于管理、添加、删除、编辑、重新生成网格和垃圾回收的公共方法
  • 将所有贴纸逻辑从 ActionHandler 迁移到新服务中
src/action/services/sticker_service.py
重构 ActionHandler 和引导程序以使用 StickerService
  • 从 ActionHandler 中删除了旧的 sticker_storage_service 字段/方法
  • 将 process_action_flow 中的 manage_stickers 委托给 sticker_service
  • 更新了 builder、container、wiring 和 main 中的依赖项连接,以注入 sticker_service 并运行启动时的垃圾回收
src/action/action_handler.py
src/bootstrap/builder.py
src/bootstrap/container.py
src/bootstrap/wiring.py
src/main.py
更新消息和提示组件以使用 StickerService
  • MessageBuilder 现在使用 sticker_service.get_sticker_file_path 而不是直接的文件/路径处理
  • PromptBuilder 通过 sticker_service 加载所有贴纸并更新预览文件名
src/action/components/message_builder.py
src/core_logic/prompt_builder.py
增强 StickerStorageService 以支持 perceptual_hash
  • 扩展了 add_sticker 签名以存储 perceptual_hash
  • 添加了 find_similar_sticker_by_phash 用于视觉去重
  • 更新了 StickerDocument 模型和索引以包含 perceptual_hash
src/database/services/sticker_storage_service.py
src/database/models.py
添加 image_utils 用于感知哈希计算
  • 引入了 calculate_perceptual_hash 和 compare_phashes 工具,用于哈希和相似性计算
src/common/image_utils.py

提示和命令

与 Sourcery 交互

  • 触发新的审阅: 在拉取请求上评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审阅评论。
  • 从审阅评论生成 GitHub 问题: 回复审阅评论,要求 Sourcery 从中创建问题。您也可以回复审阅评论并带上 @sourcery-ai issue 来创建问题。
  • 生成拉取请求标题: 在拉取请求标题的任意位置写入 @sourcery-ai,即可随时生成标题。您也可以在拉取请求上评论 @sourcery-ai title 来随时(重新)生成标题。
  • 生成拉取请求摘要: 在拉取请求正文的任意位置写入 @sourcery-ai summary,即可随时在您想要的位置生成 PR 摘要。您也可以在拉取请求上评论 @sourcery-ai summary 来随时(重新)生成摘要。
  • 生成审阅者指南: 在拉取请求上评论 @sourcery-ai guide 来随时(重新)生成审阅者指南。
  • 解决所有 Sourcery 评论: 在拉取请求上评论 @sourcery-ai resolve 来解决所有 Sourcery 评论。如果您已经处理了所有评论并且不想再看到它们,这会很有用。
  • 驳回所有 Sourcery 审阅: 在拉取请求上评论 @sourcery-ai dismiss 来驳回所有现有的 Sourcery 审阅。如果您想重新开始新的审阅,这会特别有用——别忘了评论 @sourcery-ai review 来触发新的审阅!

自定义您的体验

访问您的 仪表盘 以:

  • 启用或禁用审阅功能,例如 Sourcery 生成的拉取请求摘要、审阅者指南等。
  • 更改审阅语言。
  • 添加、删除或编辑自定义审阅说明。
  • 调整其他审阅设置。

获取帮助

Original review guide in English

Reviewer's Guide

This PR refactors all sticker management into a standalone StickerService with perceptual‐hash–based deduplication, garbage collection, and thumbnail grid regeneration; updates ActionHandler, MessageBuilder, PromptBuilder, and bootstrap wiring to use the new service; and extends the database layer with perceptual_hash support and similarity lookup.

Sequence diagram for sticker add with perceptual hash deduplication

sequenceDiagram
    participant User
    participant ActionHandler
    participant StickerService
    participant StickerStorageService
    participant EventStorageService
    User->>ActionHandler: Request add sticker (image_hash, impression)
    ActionHandler->>StickerService: manage_stickers(add)
    StickerService->>EventStorageService: find_event_by_image_hash(image_hash)
    EventStorageService-->>StickerService: event_doc
    StickerService->>StickerService: calculate_perceptual_hash(image_bytes)
    StickerService->>StickerStorageService: find_similar_sticker_by_phash(perceptual_hash)
    StickerStorageService-->>StickerService: similar_sticker or None
    alt Similar sticker found
        StickerService-->>ActionHandler: Return deduplication message
    else No similar sticker
        StickerService->>StickerStorageService: add_sticker(..., perceptual_hash)
        StickerStorageService-->>StickerService: sticker_doc
        StickerService-->>ActionHandler: Return success message
    end
Loading

Sequence diagram for sticker garbage collection on startup

sequenceDiagram
    participant System
    participant StickerService
    participant StickerStorageService
    System->>StickerService: run_garbage_collection()
    StickerService->>StickerStorageService: get_all_stickers(platform)
    StickerStorageService-->>StickerService: all_db_stickers
    StickerService->>StickerService: Scan sticker files, compare with DB
    StickerService->>StickerService: Delete orphan files
    StickerService-->>System: Return summary
Loading

Class diagram for refactored sticker management

classDiagram
    class ActionHandler {
        - sticker_service: StickerService | None
        + set_dependencies(..., sticker_service: StickerService)
        + process_action_flow(...)
    }
    class StickerService {
        + get_all_stickers(platform_id)
        + get_sticker_file_path(platform_id, sticker_id)
        + manage_stickers(platform_id, params)
        + add_sticker(platform_id, params)
        + remove_sticker(platform_id, params)
        + edit_impression(platform_id, params)
        + regenerate_sticker_grid(platform_id)
        + run_garbage_collection()
    }
    class StickerStorageService {
        + add_sticker(platform, filename, impression, source_image_hash, perceptual_hash)
        + find_similar_sticker_by_phash(platform, phash_to_check, tolerance)
        + get_sticker_by_id(platform, sticker_id)
        + get_all_stickers(platform)
        + remove_sticker(platform, sticker_id)
        + edit_impression(platform, sticker_id, new_impression)
    }
    class EventStorageService {
        + find_event_by_image_hash(image_hash)
    }
    class MessageBuilder {
        + _add_sticker(sticker_id)
    }
    class PromptBuilder {
        + _build_system_prompt_blocks(...)
    }
    ActionHandler --> StickerService
    StickerService --> StickerStorageService
    StickerService --> EventStorageService
    MessageBuilder --> ActionHandler
    PromptBuilder --> ActionHandler
Loading

File-Level Changes

Change Details Files
Extract sticker management into a dedicated StickerService
  • Created StickerService with public methods for manage, add, remove, edit, regenerate grid, and garbage collection
  • Migrated all sticker logic out of ActionHandler into the new service
src/action/services/sticker_service.py
Refactor ActionHandler and bootstrap to use StickerService
  • Removed old sticker_storage_service fields/methods from ActionHandler
  • Delegated manage_stickers in process_action_flow to sticker_service
  • Updated dependency wiring in builder, container, wiring, and main to inject sticker_service and run startup GC
src/action/action_handler.py
src/bootstrap/builder.py
src/bootstrap/container.py
src/bootstrap/wiring.py
src/main.py
Update messaging and prompt components to use StickerService
  • MessageBuilder now uses sticker_service.get_sticker_file_path instead of direct file/path handling
  • PromptBuilder loads all stickers via sticker_service and updates preview filename
src/action/components/message_builder.py
src/core_logic/prompt_builder.py
Enhance StickerStorageService with perceptual_hash support
  • Extended add_sticker signature to store perceptual_hash
  • Added find_similar_sticker_by_phash for visual deduplication
  • Updated StickerDocument model and index to include perceptual_hash
src/database/services/sticker_storage_service.py
src/database/models.py
Add image_utils for perceptual hash calculations
  • Introduced calculate_perceptual_hash and compare_phashes utilities for hashing and similarity
src/common/image_utils.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Summary of Changes

Hello @Dax233, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly refactors the application's sticker management system. The primary goal is to centralize and enhance sticker-related functionalities by introducing a dedicated StickerService. This new service encapsulates all business logic previously scattered across different modules, improving code organization and maintainability. Key enhancements include the implementation of perceptual hashing to detect and prevent the addition of duplicate or visually similar stickers, and a new garbage collection routine to clean up unreferenced sticker files on disk. The changes involve updating dependencies across various components to utilize the new service, modifying the sticker database schema to support perceptual hashes, and adding new utility functions for image processing.

Highlights

  • Sticker Management Refactoring: The core logic for managing stickers (adding, removing, editing impressions, and regenerating grids) has been extracted from ActionHandler into a new, dedicated StickerService. This improves modularity and separation of concerns.
  • Introduction of StickerService: A new StickerService has been introduced, centralizing all sticker-related business logic. This service now handles file operations, database interactions, and image processing for stickers.
  • Duplicate Sticker Detection with Perceptual Hashing: The system now uses perceptual hashing (pHash) to detect visually similar stickers before adding new ones. This prevents the storage of redundant or near-duplicate images, improving collection efficiency.
  • Sticker File Garbage Collection: A garbage collection mechanism has been implemented within the StickerService to identify and remove sticker image files from disk that are no longer referenced in the database. This helps maintain a clean and efficient storage.
  • Database Schema and Index Update: The StickerDocument database model has been updated to include a perceptual_hash field, and a new database index has been added to support efficient lookups for similar stickers.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.


A sticker's journey, now refined, From handler's grasp, a service designed. With hash and cleanup, duplicates flee, A cleaner collection, for all to see.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@sourcery-ai sourcery-ai bot changed the title @sourcery-ai Introduce StickerService; add duplicate detection and cleanup Aug 11, 2025
Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

@Dax233 - 我已经审阅了你的更改,它们看起来很棒!

AI 代理提示
请解决此代码审查中的注释:
## 单个评论

### 评论 1
<location> `src/action/services/sticker_service.py:93` </location>
<code_context>
+    async def add_sticker(self, platform_id: str, params: dict) -> str:
</code_context>

<issue_to_address>
在添加新贴纸之前,`add_sticker` 会检查是否存在视觉上相似的贴纸。

使相似度容忍度可配置将提高灵活性,并允许针对特定平台进行调整。

Suggested implementation:

```python
    async def add_sticker(self, platform_id: str, params: dict, similarity_tolerance: float = 0.85) -> str:
        """处理添加表情包的逻辑 (加入查重, 支持可配置的相似度容忍度)."""
        image_hash = params.get("image_hash")
        impression = params.get("impression")
        if not image_hash or not impression:
            return "错误:添加表情包缺少 image_hash 或 impression。"

        event_doc = await self.event_storage_service.find_event_by_image_hash(image_hash)
        if not event_doc:
            return f"错误:找不到哈希值为 '{image_hash}' 的图片来源。"

```

1. 无论在哪里调用 `add_sticker`,都应传入所需的 `similarity_tolerance` 值,可以来自平台配置或作为参数。
2. 在检查视觉相似贴纸的代码中(未在你的代码片段中显示),将任何硬编码的容忍度值替换为 `similarity_tolerance` 参数。
3. 如果你有配置系统,请考虑根据 `platform_id` 从中获取容忍度。
</issue_to_address>

### 评论 2
<location> `src/common/image_utils.py:26` </location>
<code_context>
+        return None
+
+
+def compare_phashes(hash1: str, hash2: str, tolerance: int = 5) -> bool:
+    """比较两个感知哈希字符串的汉明距离.
+
+    Args:
+        hash1 (str): 第一个哈希值.
+        hash2 (str): 第二个哈希值.
+        tolerance (int): 相似度容忍度。汉明距离小于等于此值被认为是相似图片.
+                         默认值 5 是一个比较常用的阈值.
+
+    Returns:
+        bool: 如果图片相似则返回 True.
+    """
+    if len(hash1) != len(hash2):
+        return False
+
+    # 将十六进制字符串转换为整数进行汉明距离计算
+    h1 = int(hash1, 16)
+    h2 = int(hash2, 16)
+
+    # 计算汉明距离
+    distance = bin(h1 ^ h2).count("1")
+
+    return distance <= tolerance
</code_context>

<issue_to_address>
`compare_phashes` 假定两个哈希值都是长度相等的有效十六进制字符串。

添加输入验证以确保两个哈希值都是有效的十六进制字符串且长度相等,以防止意外错误。
</issue_to_address>

Sourcery 对开源免费 - 如果您喜欢我们的评论,请考虑分享它们 ✨
帮助我更有用!请在每个评论上点击 👍 或 👎,我将使用您的反馈来改进您的评论。
Original comment in English

Hey @Dax233 - I've reviewed your changes and they look great!

Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments

### Comment 1
<location> `src/action/services/sticker_service.py:93` </location>
<code_context>
+    async def add_sticker(self, platform_id: str, params: dict) -> str:
</code_context>

<issue_to_address>
add_sticker checks for visually similar stickers before adding a new one.

Making the similarity tolerance configurable would improve flexibility and allow for platform-specific adjustments.

Suggested implementation:

```python
    async def add_sticker(self, platform_id: str, params: dict, similarity_tolerance: float = 0.85) -> str:
        """处理添加表情包的逻辑 (加入查重, 支持可配置的相似度容忍度)."""
        image_hash = params.get("image_hash")
        impression = params.get("impression")
        if not image_hash or not impression:
            return "错误:添加表情包缺少 image_hash 或 impression。"

        event_doc = await self.event_storage_service.find_event_by_image_hash(image_hash)
        if not event_doc:
            return f"错误:找不到哈希值为 '{image_hash}' 的图片来源。"

```

1. Wherever `add_sticker` is called, you should pass the desired `similarity_tolerance` value, either from platform config or as a parameter.
2. In the code that checks for visually similar stickers (not shown in your snippet), replace any hardcoded tolerance value with the `similarity_tolerance` parameter.
3. If you have a config system, consider fetching the tolerance from there based on `platform_id`.
</issue_to_address>

### Comment 2
<location> `src/common/image_utils.py:26` </location>
<code_context>
+        return None
+
+
+def compare_phashes(hash1: str, hash2: str, tolerance: int = 5) -> bool:
+    """比较两个感知哈希字符串的汉明距离.
+
+    Args:
+        hash1 (str): 第一个哈希值.
+        hash2 (str): 第二个哈希值.
+        tolerance (int): 相似度容忍度。汉明距离小于等于此值被认为是相似图片.
+                         默认值 5 是一个比较常用的阈值.
+
+    Returns:
+        bool: 如果图片相似则返回 True.
+    """
+    if len(hash1) != len(hash2):
+        return False
+
+    # 将十六进制字符串转换为整数进行汉明距离计算
+    h1 = int(hash1, 16)
+    h2 = int(hash2, 16)
+
+    # 计算汉明距离
+    distance = bin(h1 ^ h2).count("1")
+
+    return distance <= tolerance
</code_context>

<issue_to_address>
compare_phashes assumes both hashes are valid hexadecimal strings of equal length.

Add input validation to ensure both hashes are valid hexadecimal strings and of equal length to prevent unexpected errors.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

这次的 Pull Request 做出了非常棒的重构和功能增强。将表情包管理的逻辑从 ActionHandler 中抽离到独立的 StickerService,极大地提升了代码的模块化和可维护性,这是一个非常清晰的改进。新增的基于感知哈希的相似表情包检测功能,以及启动时对孤立表情包文件的垃圾回收机制,都是非常有价值的增强,显著提升了系统的健壮性和用户体验。整体来看,这是一次高质量的提交。我在代码中发现两个可以进一步优化的地方,主要关于可扩展性和性能方面。

@Dax233 Dax233 merged commit e8434b7 into dev Aug 11, 2025
1 check passed
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.

1 participant