From d7578a3383bda769cf660a6320abaf9ccefd30d6 Mon Sep 17 00:00:00 2001 From: QiuSW Date: Wed, 7 Oct 2026 16:53:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=86=E9=A2=91=E9=87=87=E9=9B=86?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E6=94=AF=E6=8C=81=E6=9C=80=E9=95=BF=203600?= =?UTF-8?q?=20=E7=A7=92=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.example.yaml | 2 +- docs/03-business-rules-and-glossary.md | 6 +++--- frontend/src/views/SettingsView.vue | 6 +++--- internal/config/config.go | 10 ++++----- internal/config/config_test.go | 29 ++++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/config.example.yaml b/config.example.yaml index 3833b07..90e113b 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -71,7 +71,7 @@ download: # 仅控制视频 CDN 文件下载;淘宝页面访问保持串行。 concurrency: 2 - # 商品和候选详情访问间的等待区间;降低请求量,不保证解除风控。 + # 商品和候选详情访问间的等待区间(0—3600 秒);降低请求量,不保证解除风控。 # 默认 10—20 秒是降低负载的起点,不是平台公布的安全阈值。 wait_seconds_min: 10 wait_seconds_max: 20 diff --git a/docs/03-business-rules-and-glossary.md b/docs/03-business-rules-and-glossary.md index a9e61a2..2b06d26 100644 --- a/docs/03-business-rules-and-glossary.md +++ b/docs/03-business-rules-and-glossary.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Business-Rules-and-Glossary wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Business-Rules-and-Glossary.- -wiki_revision: 3f8176505ad472eb9c7899fb032a41b1b5fa28b4 -synchronized_at: 2026-10-07T08:26:24Z +wiki_revision: fdb09a1e0c414d6e4463ae31aa34b7b4970a06d3 +synchronized_at: 2026-10-07T08:51:30Z # 业务规则与术语 @@ -122,7 +122,7 @@ MTOP 搜索方式、签名与请求参数保持现状。商品原链接以实际 12. 每个商品下载的视频数量有上限,可在参数设置中调整。 13. 下载先写入临时文件,经 `ffprobe` 校验通过后才改名为正式文件;校验失败视为下载失败。 14. 已存在且非空的目标文件视为已完成,跳过重复下载。 -15. 商品及新候选详情之间插入可取消等待,等待区间可配置,用于降低访问负载。 +15. 商品及新候选详情之间插入可取消等待,最短和最长等待均可配置为 0—3600 秒,最长不得小于最短;两者相同时使用固定间隔。此等待用于降低访问负载,不保证解除平台限制。 ### 货憨憨 diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index 98526f0..77623a4 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -314,10 +314,10 @@ onUnmounted(() => {
- - + + — - +
diff --git a/internal/config/config.go b/internal/config/config.go index 4613864..8b7bde9 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -219,11 +219,11 @@ func (c Config) Validate() error { if err := checkIntRange(d.Concurrency, 1, 8, "下载并发数"); err != nil { return err } - if d.WaitSecondsMin < 0 || d.WaitSecondsMin > 60 { - return fmt.Errorf("商品间最短等待秒数不合法,允许范围 0—60") + if d.WaitSecondsMin < 0 || d.WaitSecondsMin > 3600 { + return fmt.Errorf("商品间最短等待秒数不合法,允许范围 0—3600") } - if d.WaitSecondsMax < 0 || d.WaitSecondsMax > 120 { - return fmt.Errorf("商品间最长等待秒数不合法,允许范围 0—120") + if d.WaitSecondsMax < 0 || d.WaitSecondsMax > 3600 { + return fmt.Errorf("商品间最长等待秒数不合法,允许范围 0—3600") } if d.WaitSecondsMax < d.WaitSecondsMin { return fmt.Errorf("商品间最长等待秒数不能小于最短等待秒数") @@ -386,7 +386,7 @@ download: # 仅控制视频 CDN 文件下载;淘宝页面访问保持串行。 concurrency: %d - # 商品和候选详情访问间的等待区间;降低请求量,不保证解除风控。 + # 商品和候选详情访问间的等待区间(0—3600 秒);降低请求量,不保证解除风控。 # 默认 10—20 秒是降低负载的起点,不是平台公布的安全阈值。 wait_seconds_min: %s wait_seconds_max: %s diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 14befec..725aedd 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -119,6 +119,35 @@ func TestValidateRejectsBadValues(t *testing.T) { } } +func Test商品间等待允许一小时并拒绝超限(t *testing.T) { + cfg := Default() + cfg.Download.WaitSecondsMin = 3600 + cfg.Download.WaitSecondsMax = 3600 + if err := cfg.Validate(); err != nil { + t.Fatalf("固定等待 3600 秒应当有效:%v", err) + } + path := filepath.Join(t.TempDir(), "config.yaml") + if err := Save(path, cfg); err != nil { + t.Fatalf("保存固定等待 3600 秒失败:%v", err) + } + loaded, err := Load(path) + if err != nil || loaded.Download.WaitSecondsMin != 3600 || loaded.Download.WaitSecondsMax != 3600 { + t.Fatalf("固定等待 3600 秒未正确读回:min=%v max=%v err=%v", loaded.Download.WaitSecondsMin, loaded.Download.WaitSecondsMax, err) + } + for _, field := range []string{"min", "max"} { + invalid := cfg + if field == "min" { + invalid.Download.WaitSecondsMin = 3601 + invalid.Download.WaitSecondsMax = 3601 + } else { + invalid.Download.WaitSecondsMax = 3601 + } + if err := invalid.Validate(); err == nil { + t.Fatalf("%s 超过 3600 秒应被拒绝", field) + } + } +} + func TestLegacyHuohanhanFieldsDoNotBlockERPGo(t *testing.T) { cfg := Default() cfg.Huohanhan.BaseURL = ""