BalanceHub

功能与架构参考

本文承接 README 中不适合展开的细节,集中说明 BalanceHub 的功能边界、技术框架、架构分层和目录结构。

功能清单

功能 定义 实现位置 说明
中转站账号管理 把 NewAPI、Sub2API 和通用 OpenAI 兼容 API 集中到一个桌面面板中管理。 src/components/ProviderBoard.vuesrc/components/ProviderCard.vuesrc/components/ProviderEditorDrawer.vuesrc-tauri/src/services/provider_service/ AnyRouter 按 NewAPI 方言兼容处理,不作为独立类型展示。
认证方式管理 按协议保存账号密码、Cookie、访问令牌、Refresh Token、API Key 等认证信息。 src/stores/provider-types.tssrc-tauri/src/models/src-tauri/src/adapters/ NewAPI / Sub2API 默认账号密码;通用 API 只使用 API Key。
操作能力契约 由 Rust 统一判断账号管理、签到、密钥管理和邀请等操作是否可用。 src-tauri/src/models/provider_domain/capabilities.rssrc-tauri/src/contracts.rssrc/utils/provider-actions.ts 不引入类型生成工具;TypeScript 只声明 IPC 结构并读取 Rust 返回结果。
协议探测 并发探测 NewAPI、Sub2API,并在 API Key 模式下通过模型接口识别通用 API。 src-tauri/src/adapters/detector.rssrc-tauri/src/adapters/protocol/registry/ 识别冲突或失败时允许用户手动选择协议。
站点探测 从中转站读取名称、图标、额度单位和货币符号。 src-tauri/src/adapters/new_api/site.rssrc-tauri/src/adapters/sub2_api/adapter.rssrc-tauri/src/adapters/api.rs 用于减少手动填写,并保证余额、日志、签到记录单位显示一致。
余额刷新 查询账号或 API Key 当前额度、已用额度和可用额度。 src-tauri/src/adapters/new_api/quota.rssrc-tauri/src/adapters/sub2_api/src-tauri/src/services/provider_service/quota.rs API Key 查询明确按 Key 维度展示;无限额度按无限状态处理。
自动刷新 按用户配置周期刷新中转站状态。 src-tauri/src/services/scheduler.rs 适合多站点长期挂后台观察余额和异常状态。
签到 对支持签到的 NewAPI 兼容站点执行每日签到。 src-tauri/src/adapters/new_api/check_in.rssrc-tauri/src/adapters/new_api/anyrouter.rssrc-tauri/src/services/provider_service/check_in.rs 签到结果会结合接口返回和余额变化展示,避免把无余额变化误判为有效收益。
签到记录 展示每日签到结果和余额增量。 src/components/CheckInCalendarModal.vuesrc-tauri/src/adapters/new_api/check_in/records.rs 兼容站点返回的显示额度和 NewAPI 原始额度单位转换。
用量趋势 查看周期内请求量和额度消耗趋势。 src/components/UsageTrendModal.vuesrc/composables/useUsageTrendChart.tssrc-tauri/src/adapters/new_api/usage.rssrc-tauri/src/adapters/sub2_api/usage.rs 用于判断站点消耗变化、请求峰值和账户使用节奏。
请求日志 查看模型请求记录、状态、Token 和消耗。 src/components/RequestLogsModal.vuesrc-tauri/src/adapters/new_api/logs.rssrc-tauri/src/adapters/sub2_api/adapter.rs 消耗金额沿用站点元数据中的额度单位、货币符号和换算规则。
API Key 管理 查看、创建、删除中转站 API Key,并读取 Key 额度。 src/components/ApiKeyManagerModal.vuesrc-tauri/src/adapters/new_api/keys.rssrc-tauri/src/adapters/sub2_api/keys.rs 适合从桌面端快速生成 Agent CLI 使用的 Key。
修改密码 在支持的账号协议上发起密码修改流程。 src/components/PasswordChangeModal.vuesrc-tauri/src/adapters/new_api/account.rssrc-tauri/src/adapters/sub2_api/adapter.rs 仅在协议、站点能力和认证信息满足要求时展示操作入口。
可用模型 读取中转站可用模型清单。 src/components/AvailableModelsModal.vuesrc/composables/useAvailableModels.ts 用于确认当前站点是否支持目标模型。
CLI 测活 使用已注册的 Agent CLI 对中转站执行真实请求验证。 src-tauri/src/services/liveness.rssrc-tauri/src/services/agent_cli/<agent>/liveness.rs 当前内置 Codex CLI、Claude Code、Gemini CLI、Grok Build;测活会消耗真实额度,首次开启自动测活前会要求确认。
CLI 候选扫描 扫描本机已注册 Agent CLI 的可执行文件。 src-tauri/src/services/agent_cli/discovery.rssrc/components/settings/SettingsCliManager.vue 扫描 PATH、常见安装目录和 Node 包管理器路径;不扫描 Codex Desktop App 内置二进制。
临时 CLI 启动 使用当前中转站临时启动已注册的 Agent CLI。 src-tauri/src/services/temporary_cli/src-tauri/src/services/agent_cli/<agent>/launch.rssrc/components/TemporaryCliModal.vue 覆盖 API Key、Base URL、模型和当前中转站的有效代理;工作目录由用户选择,其他 CLI 配置继续沿用默认配置。
统一代理 为业务请求、Webhook、updater、测活 CLI 和临时 CLI 解析同一套代理语义。 src-tauri/src/network/ 支持无代理、自定义 HTTP/SOCKS 代理及系统手工 HTTP/HTTPS/SOCKS 配置;PAC/WPAD 或无法静态读取的桌面配置保留运行环境,不虚构已解析结果。
CC Switch 导入 将当前中转站配置通过深链交给 CC Switch。 src/utils/ccswitch-deeplink.tssrc-tauri/src/commands/app.rssrc-tauri/src/platform/cc_switch.rs 支持 Codex CLI、Claude Code、OpenCode、OpenClaw、Hermes 目标;macOS 优先定位 CC Switch bundle,其他情况交给安全的系统处理器。
测活时间线 保存并展示每个中转站最近的测活结果。 src/components/ProviderLivenessTimeline.vuesrc/utils/provider-liveness.ts 用于区分余额正常但 CLI 不可用、模型不可用或网络异常。
系统通知 对自动刷新、自动签到等结果发出系统通知。 src-tauri/src/services/notifications/adapters/system.rs 系统通知使用纯文本内容,避免显示 Markdown 语法。
Webhook 通知 通过钉钉、企业微信、飞书、Slack 或通用 Webhook 推送消息。 src-tauri/src/services/notifications/adapters/ 不同渠道按各自消息格式发送,并处理签名和返回校验。
配置导入导出 将本地中转站配置导出备份或迁移到另一台设备。 src/composables/useAppDataTransfer.tssrc-tauri/src/storage.rs 导出的配置可能包含敏感认证信息,应自行妥善保管。
本地存储恢复 读写本地配置,并从临时文件恢复异常写入。 src-tauri/src/storage.rs 避免写入中断导致配置文件损坏。
系统托盘 / 菜单栏 将桌面 App 保持在后台并提供快速入口。 src-tauri/src/tray.rs 支持显示窗口、刷新和退出,适合长期后台运行。
自动更新 从 GitHub Releases 读取更新元数据并安装新版本。 src/composables/useAppUpdater.tssrc-tauri/src/services/app_updater.rssrc-tauri/tauri.release.conf.json 启动 30 秒后静默检查,之后每 6 小时检查;只提示、不自动下载。下载可取消,并有 45 秒停滞超时、20 分钟总时限和 256 MiB 上限;.sig 用于签名校验。
主题和响应式布局 提供明暗主题和不同窗口宽度下的可用布局。 src/styles/modules/ 优先保证桌面工具场景的信息密度和扫描效率。

技术框架

层级 技术 用途
桌面容器 Tauri 2 打包跨平台桌面应用,提供窗口、托盘、权限、通知、更新和系统能力。
后端语言 Rust 2021 实现协议适配、调度、存储、通知、测活和 Tauri command。
前端框架 Vue 3 构建设置、卡片、弹窗、抽屉和状态交互。
前端状态 Pinia 管理中转站、设置、运行状态和 UI 派生数据。
UI 组件 Arco Design Vue 提供表单、弹窗、按钮、抽屉、消息提示等基础组件。
构建工具 Vite 6 前端开发服务器和生产构建。
类型系统 TypeScript 约束前端状态、API 返回和组件数据。
HTTP 客户端 reqwest 后端访问中转站、Webhook 和更新相关接口。
异步运行 tokio 支撑定时任务、网络请求和外部进程等待。
序列化 serde / serde_json 读写本地配置、解析协议响应、构造 Webhook 请求。
加密签名 hmac / sha2 / base64 生成钉钉、飞书等 Webhook 签名。
时间处理 chrono 处理签到日期、调度时间和本地时间判断。
Tauri 插件 opener / dialog / notification / autostart / updater / process 打开链接、文件选择、系统通知、开机启动、自动更新和进程能力。

架构说明

BalanceHub 按“前端交互、Tauri command、Rust 服务、站点接口、本地存储”分层:

Vue 3 UI
  -> composables / Pinia store
    -> Tauri invoke API
      -> src-tauri/src/desktop.rs 注册 command
        -> src-tauri/src/commands/ command 实现
        -> services/provider_service 调度业务
          -> adapters/protocol 运行时分发与描述注册表
            -> adapters/new_api
            -> adapters/sub2_api
            -> adapters/api
          -> services/agent_cli 注册 Agent 能力 Adapter
            -> services/liveness 执行 CLI 测活
            -> services/temporary_cli 启动临时 CLI
          -> services/notifications 发送通知
          -> storage.rs 读写本地配置

前端负责操作体验和状态呈现;Rust 负责带认证的站点请求、调度、持久化、通知和外部 CLI 调用。账号密码、Cookie、Token、API Key 不需要交给远端服务,也不依赖浏览器页面直接访问中转站。

目录说明

.
├── README.md                         # 项目入口、能力摘要、截图和文档导航
├── CHANGELOG.md                      # 用户可感知的版本更新记录
├── CONTRIBUTING.md                   # 本地开发、二次开发和仓库协作边界
├── docs/                             # GitHub Pages 文档站和详细说明
│   ├── index.html                    # 项目主页
│   ├── getting-started.md            # 快速开始
│   ├── provider-config.md            # 中转站配置说明
│   ├── liveness.md                   # Agent CLI 测活说明
│   ├── release.md                    # 发布包和自动更新说明
│   ├── faq.md                        # 常见问题
│   ├── reference.md                  # 功能与架构参考
│   └── assets/screenshots/           # README 和 Pages 共用截图
├── .github/
│   ├── workflows/ci.yml              # 多平台质量检查
│   ├── workflows/release.yml         # tag 触发的正式打包发布
│   ├── workflows/pages.yml           # GitHub Pages 文档站部署
│   ├── workflows/close-pull-requests.yml
│   ├── scripts/release-notes.mjs     # 从 CHANGELOG 生成 Release 正文
│   └── ISSUE_TEMPLATE/               # Issue 模板
├── src/                              # Vue 前端
│   ├── App.vue                       # 应用根组件
│   ├── main.ts                       # 前端入口
│   ├── api/                          # Tauri invoke 封装
│   ├── components/                   # 页面、抽屉、弹窗、卡片和设置组件
│   │   └── provider-card/             # 卡片头部、主体、操作区和弹出菜单
│   ├── composables/                  # 前端状态编排和业务动作
│   ├── stores/                       # Pinia store、类型和默认值
│   ├── styles/                       # 全局样式和业务模块样式
│   └── utils/                        # 展示格式化、拖拽、测活、趋势等工具函数
└── src-tauri/                        # Tauri / Rust 后端
    ├── tauri.conf.json               # 开发配置、窗口、安全策略和插件配置
    ├── tauri.release.conf.json       # Release / updater 构建配置
    ├── capabilities/                 # Tauri 权限能力配置
    ├── icons/                        # 应用图标
    └── src/
        ├── lib.rs                    # Rust 库入口
        ├── desktop.rs                # Tauri 应用编排、插件和 command 注册
        ├── commands/                 # 应用、CLI 和中转站 command 实现
        ├── main.rs                   # 桌面进程入口
        ├── state.rs                  # 全局运行状态
        ├── storage.rs                # 本地配置读写、版本检查和恢复
        ├── tray.rs                   # 系统托盘 / 菜单栏
        ├── network/                  # 跨平台系统代理解析和统一网络语义
        ├── platform/                 # 深链、后台进程等平台能力封装
        ├── contracts.rs              # Rust 派生操作能力和 IPC View
        ├── adapters/                 # 协议探测、运行时分发、描述注册表及各协议实现
        ├── provider_protocol_catalog.rs # 协议枚举身份与描述模块目录
        ├── terminal_catalog.rs       # 终端枚举身份与 fallback 名称目录
        ├── models/                   # Rust 数据模型
        └── services/                 # 业务服务、测活、通知和调度

关键边界