From 9bff652c667848c0112e5ffa59b67aa40a779421 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 26 Jun 2026 13:46:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=AE=9A=E4=B9=89=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E9=97=B4=E9=9A=94=E7=AD=96=E7=95=A5=20+=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=8C=89=E9=92=AEhover=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增重试间隔阶段配置,支持自定义时间分界点和频率 - 默认配置: 0-8秒=130ms, 8-25秒=260ms, 25-75秒=900ms - 设置面板添加可增删的阶段配置 UI - 修复按钮 hover 时文字变白的问题 --- app.go | 8 +- frontend/src/components/ck/CKManager.vue | 6 +- .../src/components/modal/SettingsModal.vue | 165 ++++++++++++++++-- frontend/src/composables/useSettings.ts | 20 ++- frontend/src/styles/common.css | 9 +- internal/config/config.go | 13 ++ internal/seckill/scheduler.go | 34 ++-- internal/types/types.go | 19 +- 8 files changed, 231 insertions(+), 43 deletions(-) diff --git a/app.go b/app.go index 8df3055..94068ee 100644 --- a/app.go +++ b/app.go @@ -70,7 +70,7 @@ func (a *App) startup(ctx context.Context) { a.client = client.New(a.cfg.TimeAPIURL, a.trace) a.font = imgpkg.LoadFont(a.paths.FontFiles) - a.scheduler = seckill.New(a.client, a.paths, a.font, a.cfg.Concurrency, a.cfg.Attempts) + a.scheduler = seckill.New(a.client, a.paths, a.font, a.cfg.Concurrency, a.cfg.Attempts, a.cfg.RetryStages) a.scheduler.LoadAccounts() if err := os.MkdirAll(a.paths.SuccessDir, 0755); err != nil { @@ -563,10 +563,10 @@ func (a *App) SaveSettings(cfg types.Config) map[string]any { // 运行时生效 a.cfg = cfg logger.SetMinLevel(cfg.LogLevel) - a.scheduler.UpdateSettings(cfg.Concurrency, cfg.Attempts) + a.scheduler.UpdateSettings(cfg.Concurrency, cfg.Attempts, cfg.RetryStages) - logger.LogEvent("配置", "success", "配置已保存并生效: 日志等级=%s 并发=%d 重试=%d trace=%v", - cfg.LogLevel, cfg.Concurrency, cfg.Attempts, cfg.TraceEnabled) + logger.LogEvent("配置", "success", "配置已保存并生效: 日志等级=%s 并发=%d 重试=%d 重试阶段=%d trace=%v", + cfg.LogLevel, cfg.Concurrency, cfg.Attempts, len(cfg.RetryStages), cfg.TraceEnabled) return map[string]any{"success": true} } diff --git a/frontend/src/components/ck/CKManager.vue b/frontend/src/components/ck/CKManager.vue index 3fc1a59..42d3860 100644 --- a/frontend/src/components/ck/CKManager.vue +++ b/frontend/src/components/ck/CKManager.vue @@ -352,7 +352,8 @@ const handleOrganize = async () => { } .btn-primary:hover { - filter: brightness(1.08); + background: #4d9aff; + border-color: #4d9aff; } .btn-success { @@ -362,7 +363,8 @@ const handleOrganize = async () => { } .btn-success:hover { - filter: brightness(1.08); + background: #4fc95f; + border-color: #4fc95f; } .btn-compact { diff --git a/frontend/src/components/modal/SettingsModal.vue b/frontend/src/components/modal/SettingsModal.vue index d167c90..f460c7a 100644 --- a/frontend/src/components/modal/SettingsModal.vue +++ b/frontend/src/components/modal/SettingsModal.vue @@ -1,6 +1,6 @@ @@ -133,25 +150,65 @@ defineExpose({ open, close }) + +
+ +
+
+ 阶段{{ index + 1 }}: +
+
+ + 秒内 +
+ → +
+ + ms +
+
+ +
+ +
+
按经过秒数从小到大排列,每个阶段设置不同的重试频率
+
+
💡 抢购策略说明
-
-
⚠️ 自动停止条件
- -