Skip to content

Conversation

@jsrcode
Copy link
Collaborator

@jsrcode jsrcode commented Dec 10, 2025

动机

余额监控页面当前使用 localStorage 存储配置,存在以下问题:

  1. 数据安全性不足:localStorage 明文存储在浏览器,无法设置文件权限
  2. 存储容量限制:localStorage 通常限制 5MB,大量配置或长脚本可能超限
  3. 备份和同步困难:浏览器数据不便于备份、导出、云同步
  4. 多端共享不便:无法在多个应用实例间共享配置
  5. API Key 管理混乱:所有配置都强制在 localStorage,用户无法选择仅内存保存

本 PR 将存储层重构为基于 JSON 文件的后端管理架构,解决上述问题。

主要改动点

1. 后端存储服务

新增模块

  • models/balance.rs:数据模型定义(BalanceConfigBalanceStore
  • services/balance/manager.rsBalanceManager 服务,提供 CRUD 接口
  • 存储位置:~/.duckcoding/balance_configs.json
  • 使用 DataManager 统一管理,支持原子写入和 Unix 权限控制(0o600)

数据结构

struct BalanceConfig {
    id: String,
    name: String,
    endpoint: String,
    method: String,
    static_headers: Option<HashMap<String, String>>,
    extractor_script: String,
    interval_sec: Option<u32>,
    timeout_ms: Option<u64>,
    save_api_key: bool,      // 新增:是否持久化 API Key
    api_key: Option<String>, // 新增:可选持久化 API Key
    created_at: i64,
    updated_at: i64,
}

2. 新增 Tauri 命令

配置管理命令(位于 commands/balance_commands.rs):

  • get_all_balance_configs(): 获取所有配置
  • save_balance_config(config): 保存单个配置(创建或更新)
  • delete_balance_config(id): 删除配置
  • get_balance_config(id): 获取单个配置

3. 自动迁移系统

迁移逻辑migrations/balance_localstorage_to_json.rs):

  • 启动时检测 localStorage 数据(通过前端 Tauri 事件)
  • 自动迁移到 JSON 文件
  • 迁移完成后前端清理 localStorage
  • 无需用户手动操作

4. 前端集成改造

Hook 重构

  • useBalanceConfigs:切换到新的 Tauri 命令(get_all_balance_configs 等)
  • useApiKeys:支持从配置加载持久化的 API Key,内存保存模式不变

UI 增强

  • 新增 Checkbox 组件(ui/checkbox.tsx,基于 shadcn/ui)
  • ConfigFormDialog 添加"记住 API Key"选项
  • 支持用户选择是否持久化 API Key

类型更新

  • BalanceConfig 类型新增 saveApiKeyapiKey 字段

技术细节

存储优势

数据安全

  • 文件权限控制(Unix 0o600),仅当前用户可读写
  • 原子写入避免写入过程中崩溃导致数据损坏
  • 支持备份和版本控制

性能提升

  • 无 localStorage 容量限制
  • 减少浏览器存储压力
  • 支持更大的配置数据和脚本

多端同步

  • JSON 文件便于云同步工具(Dropbox、OneDrive 等)
  • 支持导入导出功能(未来可扩展)
  • 便于配置管理和团队共享

向后兼容

  • ✅ 首次启动自动迁移 localStorage 数据
  • ✅ 前端迁移完成后自动清理 localStorage
  • ✅ 用户无需手动操作,平滑升级

API Key 管理策略

两种模式

  1. 持久化模式save_api_key: true):

    • API Key 明文保存到 JSON 文件
    • 下次启动自动加载,无需重新输入
    • 适合个人设备或信任的环境
  2. 内存模式save_api_key: false,默认):

    • API Key 仅保存在前端内存
    • 关闭应用后清除,下次启动需重新输入
    • 适合共享设备或安全敏感场景

测试情况

后端测试

  • 配置 CRUD 操作验证
  • JSON 文件读写和原子写入
  • 文件权限设置验证(Unix 系统)
  • API Key 持久化和加载逻辑

前端测试

  • 配置新建、编辑、删除流程
  • API Key 记住选项交互
  • 配置列表刷新和状态同步
  • localStorage 迁移逻辑(清理验证)

集成测试

  • 首次启动迁移流程
  • 持久化 API Key 加载
  • 配置保存后跨会话加载
  • 文件损坏时的错误处理

风险评估

低风险

  • ✅ 自动迁移逻辑完善,向后兼容
  • ✅ 原子写入保护数据完整性
  • ✅ 错误处理完整,包含文件读写失败场景

需要注意

  • ⚠️ API Key 持久化为明文存储,需要用户知情选择(UI 已添加说明)
  • ⚠️ 跨平台文件权限差异(Windows 无 Unix 权限,但文件仍在用户目录下)
  • ⚠️ 云同步工具可能同步 API Key 文件,用户需自行注意安全

安全建议

  • 默认不持久化 API Key,由用户主动选择
  • 文档中建议用户加密云同步目录或排除敏感文件
  • 未来可考虑使用操作系统密钥链(Keychain/Credential Manager)

受影响模块

  • 后端models/balance.rsservices/balance/commands/balance_commands.rs
  • 前端BalancePage/lib/tauri-commands.tscomponents/ui/checkbox.tsx
  • 迁移系统migration_manager/migrations/balance_localstorage_to_json.rs

截图/演示

(本地验证通过,如需截图可补充)

检查清单

  • 已运行 npm run check 且全部通过
  • Rust 测试已运行(cargo test --locked
  • 代码遵循 Conventional Commits 规范
  • 新增依赖说明(无新增第三方依赖)
  • PR 描述包含动机、改动点、测试、风险评估

后续计划

  1. 支持配置导入导出功能
  2. 考虑使用操作系统密钥链存储 API Key
  3. 支持配置模板和分享功能

## 主要改动

**后端存储服务:**
- 新增 `BalanceManager` 服务,统一管理余额监控配置的 CRUD 操作
- 数据模型:`BalanceConfig`(配置项)、`BalanceStore`(存储结构)
- 存储位置:`~/.duckcoding/balance_configs.json`
- 使用 `DataManager` 统一读写,支持原子写入和权限控制

**自动迁移系统:**
- 新增 `BalanceLocalStorageToJson` 迁移任务
- 启动时自动从 localStorage 迁移到 JSON 文件
- 迁移完成后前端自动清理 localStorage 数据

**新增命令:**
- `get_all_balance_configs`: 获取所有配置
- `save_balance_config`: 保存单个配置(创建或更新)
- `delete_balance_config`: 删除配置
- `get_balance_config`: 获取单个配置

**前端集成:**
- `useBalanceConfigs` Hook 切换到新的 Tauri 命令
- 支持 API Key 可选持久化(用户可选择保存到文件或仅内存)
- `useApiKeys` Hook 支持从配置加载 API Key
- 新增 Checkbox 组件用于"记住 API Key"选项

## 优势

**数据安全性:**
- 文件权限控制(Unix 0o600)
- 原子写入避免数据损坏
- 备份和导出更方便

**性能提升:**
- 避免 localStorage 5MB 限制
- 减少浏览器存储压力
- 支持更大的配置数据

**多端同步:**
- JSON 文件便于云同步
- 支持导入导出功能
- 便于版本控制和备份

## 数据结构

**BalanceConfig 字段:**
- `id`: 配置唯一标识
- `name`: 配置名称
- `endpoint`: API 端点 URL
- `method`: HTTP 方法
- `static_headers`: 静态请求头
- `extractor_script`: 提取器脚本
- `interval_sec`: 自动刷新间隔
- `timeout_ms`: 请求超时
- `save_api_key`: 是否持久化 API Key
- `api_key`: API Key(可选)
- `created_at` / `updated_at`: 时间戳

## 向后兼容

- 首次启动自动迁移 localStorage 数据
- 前端迁移完成后清理 localStorage
- 无需用户手动操作

## 影响范围

- 余额监控模块(完整重构)
- 数据存储层(新增 balance 服务)
- 迁移系统(新增迁移任务)
- 前端 Hook(切换到新 API)

## 测试情况

- [x] 新建配置保存和加载
- [x] 配置更新和删除
- [x] localStorage 迁移逻辑
- [x] API Key 持久化选项
- [x] 文件权限和原子写入
@DuckCoding-dev DuckCoding-dev merged commit 48f7b82 into DuckCoding-dev:main Dec 10, 2025
3 of 4 checks 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.

2 participants