Skip to content

Conversation

@Rogers-F
Copy link
Contributor

概述

本 PR 为 Code Switch 项目带来了多项重要功能增强和改进,主要包括:

  • ✅ 供应商失败自动拉黑机制
  • ✅ 拉黑配置界面
  • ✅ 自动更新功能
  • ✅ 实时状态刷新优化

核心功能

1. 供应商失败自动拉黑功能 (v0.3.0)

功能描述

  • 当供应商连续失败达到阈值(可配置,默认 3 次)时,自动拉黑指定时长(可配置:15/30/60 分钟)
  • 拉黑期间该供应商不会被选择,避免浪费请求
  • 拉黑时长到期后自动解禁并重置失败计数
  • 支持手动立即解禁

实现细节

  • 新增 BlacklistService 核心服务
  • 新增 SettingsService 配置管理服务
  • 数据持久化到 SQLite(~/.code-switch/app.db
  • 每分钟自动检查并恢复到期的拉黑记录

数据库表结构

CREATE TABLE provider_blacklist (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    platform TEXT NOT NULL,
    provider_name TEXT NOT NULL,
    failure_count INTEGER DEFAULT 1,
    blacklisted_at DATETIME,
    blacklisted_until DATETIME,
    last_failure_at DATETIME,
    auto_recovered BOOLEAN DEFAULT 0,
    UNIQUE(platform, provider_name)
);

CREATE TABLE app_settings (
    key TEXT PRIMARY KEY,
    value TEXT NOT NULL
);

前端 UI

  • 在供应商卡片上显示拉黑状态横幅
  • 实时倒计时显示剩余拉黑时间
  • 支持一键立即解禁

2. 拉黑配置界面 (v0.3.1)

功能描述
在应用设置中新增「拉黑配置」部分,用户可自定义拉黑策略:

  • 失败阈值:1-10 次(默认 3 次)
  • 拉黑时长:15/30/60 分钟(默认 30 分钟)
  • 配置即时生效并持久化到数据库

界面优化

  • 实时状态刷新优化,拉黑后条幅立即显示(无延迟)
  • 窗口焦点恢复监听(最小化后恢复时立即刷新)
  • 定期轮询机制(每 10 秒)
  • Tab 切换时立即刷新对应平台的黑名单状态

3. 自动更新功能修复 (v0.3.2)

修复问题

  1. ✅ 自动更新开关状态持久化(重启后不再丢失)
  2. ✅ 手动点击「立即检查」后自动引导下载和安装
  3. ✅ 兼容老版本升级(首次运行时自动保存默认配置)

用户体验改进

  • 发现新版本后自动弹窗询问是否下载
  • 下载完成后弹窗询问是否重启
  • 一键完成:检查 → 下载 → 安装

技术改进

后端

新增服务

  • services/blacklistservice.go - 核心拉黑逻辑
  • services/settingsservice.go - 全局配置管理
  • services/database.go - 数据库表初始化

核心逻辑

// 拉黑检查(在 providerrelay.go 中集成)
if isBlacklisted, until := prs.blacklistService.IsBlacklisted(kind, provider.Name); isBlacklisted {
    fmt.Printf("⛔ Provider %s 已拉黑,过期时间: %v\n", provider.Name, until.Format("15:04:05"))
    skippedCount++
    continue
}

// 失败记录(请求失败时调用)
if err := prs.blacklistService.RecordFailure(kind, provider.Name); err != nil {
    fmt.Printf("[ERROR] 记录失败到黑名单失败: %v\n", err)
}

更新服务改进

  • UpdateState 中新增 auto_check_enabled 字段
  • 使用 strings.Contains() 检查 JSON 字段存在性确保兼容性
  • 首次运行时自动保存默认配置

前端

新增文件

  • frontend/src/services/blacklist.ts - 拉黑 API 封装
  • frontend/src/services/settings.ts - 配置 API 封装

状态管理优化

  • 使用 Vue 3 reactive() 管理黑名单状态映射
  • 实现倒计时客户端递减(减少 API 调用)
  • 添加窗口焦点事件和定期轮询

配置界面测试

  1. 打开应用设置 → 拉黑配置
  2. 修改失败阈值和拉黑时长
  3. 重启应用验证配置是否保存

自动更新测试

  1. 勾选自动更新
  2. 彻底关闭应用并重启
  3. 验证设置是否保留
  4. 点击「立即检查」测试下载流程

版本历史

  • v0.3.2 (最新): 自动更新功能
  • v0.3.1: 新增拉黑配置界面 + 实时性优化
  • v0.3.0: 核心拉黑功能
  • v0.2.6: HTTP 状态码记录修复

兼容性

  • ✅ 向后兼容旧版本配置文件
  • ✅ 数据库自动迁移(新表自动创建)
  • ✅ Windows / macOS / Linux 全平台支持

将 autoStartEnabled 初始值从 false 改为 true,与其他设置保持一致,避免在异步加载期间出现从关闭到打开的视觉跳变
- 从 localStorage 读取缓存值作为初始值
- 加载和保存设置后更新缓存
- 实现"记住状态"效果,打开设置时直接显示正确状态
- 版本更新至 v0.2.4
- 新增 UpdateService 后端服务,支持 GitHub Release 版本检查
- 每天 8:00 AM 自动检查更新,网络失败时自动重试 3 次
- 实现智能重启机制,下载更新后在下次启动时应用
- 设置页面新增"应用更新"板块,可手动检查和下载更新
- 主页 GitHub 图标显示更新状态徽章(New/下载进度/Ready)
- 支持自动更新开关,状态持久化到本地配置
- 新增版本号管理服务,当前版本 v0.2.5
- 完善中英文国际化翻译

Co-Authored-By: Half open flowers <1816524875@qq.com>
Co-Authored-By: Half open flowers <1816524875@qq.com>
重命名 updateservice.go 中的 copyFile 为 copyUpdateFile,避免与 skillservice.go 冲突

Co-Authored-By: Half open flowers <1816524875@qq.com>
- 修复立即检查按钮文字换行问题,添加 white-space: nowrap
- 新增刷新按钮,一键刷新所有数据(热力图、供应商、统计、更新状态)
- 添加刷新按钮旋转动画效果
- 完善按钮样式(action-btn, primary-btn)
- 新增版本号和信息文本样式
- 完善中英文国际化翻译

Co-Authored-By: Half open flowers <1816524875@qq.com>
- 版本号更新到 v0.2.6
- 更新 release 说明,包含 UI 改进和 Bug 修复

Co-Authored-By: Half open flowers <1816524875@qq.com>
- 添加 display: inline-flex 和 align-items: center 确保垂直居中
- 调整 padding 从 6px 改为 8px,增加垂直空间
- 添加 line-height: 1.2 控制行高
- 添加 justify-content: center 确保水平居中

Co-Authored-By: Half open flowers <1816524875@qq.com>
- 改用 min-height: 36px 代替 padding 控制高度
- padding 改为 0 16px,只保留左右内边距
- line-height 改为 1,让文字更紧凑
- 让 flexbox 的 align-items: center 正确工作

Co-Authored-By: Half open flowers <1816524875@qq.com>
问题:当 provider 返回 4xx/5xx 错误时,日志中 HTTP 状态码显示为 0
原因:resp.Error() 检查在获取 StatusCode() 之前,导致提前返回
修复:先获取并设置 HttpCode,再检查 Error(),确保无论成功失败都能记录正确状态码

影响:修复后,所有错误响应都能正确显示 HTTP 状态码(如 400/401/429/500 等)

Co-Authored-By: Half open flowers <1816524875@qq.com>
主要变更:
- 实现失败次数追踪和自动拉黑机制(默认3次失败拉黑30分钟)
- 支持可配置的拉黑阈值(1-10次)和时长(15/30/60分钟)
- 添加黑名单状态持久化(SQLite存储)
- 实现后台自动恢复定时器(每分钟检查过期黑名单)
- 前端新增拉黑状态显示和实时倒计时
- 支持手动解禁功能
- 完善中英文国际化支持

技术细节:
- 新增 BlacklistService 和 SettingsService 服务
- 扩展数据库表:provider_blacklist 和 app_settings
- 集成到 ProviderRelay 降级逻辑中
- 前端 UI 适配深色/浅色主题

Author: Half open flowers <1816524875@qq.com>
修复构建错误:settingsservice.go 中导入了 database/sql 但未使用

Author: Half open flowers <1816524875@qq.com>
Author: Half open flowers <1816524875@qq.com>
**新增功能**
- 在应用设置中新增「拉黑配置」部分
- 支持自定义失败阈值(1-10 次,默认 3 次)
- 支持自定义拉黑时长(15/30/60 分钟,默认 30 分钟)
- 配置即时生效,持久化到数据库

**优化改��**
- 修复拉黑条幅延迟显示问题
- 添加窗口焦点恢复监听,最小化后立即刷新状态
- 添加定期轮询机制(10 秒间隔),确保状态同步
- 切换 Claude/Codex tab 时立即刷新黑名单状态
- 点击刷新按钮时同步更新黑名单数据

**版本更新**
- 版本号:v0.3.0 → v0.3.1
**问题修复**

1. **自动更新开关状态持久化**
   - 添加 AutoCheckEnabled 字段到 UpdateState 结构体
   - 在 SaveState/LoadState/GetUpdateState 中正确处理该字段
   - 用户勾选自动更新后,重启应用设置不再丢失

2. **兼容老版本升级**
   - 使用字符串检查 JSON 中是否包含 auto_check_enabled 字段
   - 老版本升级时,如果配置文件中没有该字段,保持默认值 true
   - 首次运行时自动保存默认配置

3. **手动检查更新后自动下载**
   - 修改前端 checkUpdateManually 方法
   - 发现新版本后弹窗确认,用户同意后自动下载
   - 下载完成后弹窗询问是否立即重启应用
   - 不再需要手动点击下载按钮

**技术细节**
- 在 LoadState 中,文件不存在时自动调用 SaveState 保存默认配置
- 使用 strings.Contains 检查 JSON 字段存在性,确保兼容性
- 改进用户体验:检查→下载→安装一键完成

**版本更新**
- 版本号:v0.3.1 → v0.3.2
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