From 974efb6685007da35984ea99155a7e6758c3e89d Mon Sep 17 00:00:00 2001 From: qian Date: Tue, 9 Jun 2026 22:53:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B0=94=E5=80=BC?= =?UTF-8?q?=E8=BD=AC=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/logic/admin/settings.go | 35 +++++++++++++++++++ .../src/views/system/settings/ChannelTab.vue | 12 +++---- .../system/settings/DataGovernanceTab.vue | 4 +-- .../src/views/system/settings/EmailTab.vue | 4 +-- .../src/views/system/settings/GeneralTab.vue | 16 ++++----- .../src/views/system/settings/OAuthTab.vue | 12 +++---- .../views/system/settings/PerformanceTab.vue | 8 ++--- .../src/views/system/settings/SecurityTab.vue | 2 +- .../src/views/system/settings/StorageTab.vue | 4 +-- .../src/views/system/settings/useSettings.ts | 7 +--- 10 files changed, 67 insertions(+), 37 deletions(-) diff --git a/internal/logic/admin/settings.go b/internal/logic/admin/settings.go index 070d6e0..0ddcc3d 100644 --- a/internal/logic/admin/settings.go +++ b/internal/logic/admin/settings.go @@ -2,6 +2,7 @@ package admin import ( "context" + "strings" v1 "github.com/qianfree/team-api/api/admin/v1" "github.com/qianfree/team-api/internal/logic/common" @@ -56,12 +57,46 @@ func (s *sAdmin) UpdateSettings(ctx context.Context, req *v1.AdminSettingsUpdate for key, val := range req.Settings { strValues[key] = common.NormalizeSettingValue(val) } + + if err := s.validateCrossFieldSettings(ctx, req.Category, strValues); err != nil { + return nil, err + } + if err := common.Config().UpdateCategory(ctx, req.Category, strValues); err != nil { return nil, err } return nil, nil } +// validateCrossFieldSettings validates interdependent settings within a category. +func (s *sAdmin) validateCrossFieldSettings(ctx context.Context, category string, values map[string]string) error { + if category != "security" { + return nil + } + + enabled, ok := values["turnstile_enabled"] + if !ok || (enabled != "true" && enabled != "1") { + return nil + } + + siteKey := values["turnstile_site_key"] + secretKey := values["turnstile_secret_key"] + + // If keys not in the current request, read existing values from DB + if siteKey == "" { + siteKey = common.Config().GetString(ctx, "turnstile_site_key") + } + if secretKey == "" || secretKey == "******" { + secretKey = common.Config().GetString(ctx, "turnstile_secret_key") + } + + if strings.TrimSpace(siteKey) == "" || strings.TrimSpace(secretKey) == "" { + return common.NewBadRequestError("启用 Turnstile 前必须先配置 Site Key 和 Secret Key") + } + + return nil +} + func isValidCategory(category string) bool { for _, c := range common.Categories { if c.Key == category { diff --git a/web/admin/src/views/system/settings/ChannelTab.vue b/web/admin/src/views/system/settings/ChannelTab.vue index 9e3fe75..0b1fc18 100644 --- a/web/admin/src/views/system/settings/ChannelTab.vue +++ b/web/admin/src/views/system/settings/ChannelTab.vue @@ -12,16 +12,16 @@ const values = useFormValues() 渠道自动探测 定期向活跃渠道发送测试请求,检测连通性并更新健康度(会消耗少量 Token)
自动恢复探测 定期测试已自动禁用的渠道,测试通过则恢复启用(依赖自动探测开启)
@@ -33,8 +33,8 @@ const values = useFormValues() 渠道自动禁用 连续失败达到阈值时自动禁用渠道
diff --git a/web/admin/src/views/system/settings/DataGovernanceTab.vue b/web/admin/src/views/system/settings/DataGovernanceTab.vue index aae21ee..021defb 100644 --- a/web/admin/src/views/system/settings/DataGovernanceTab.vue +++ b/web/admin/src/views/system/settings/DataGovernanceTab.vue @@ -47,8 +47,8 @@ function set(key: string, v: number | undefined): void {
启用文件保留期检查
diff --git a/web/admin/src/views/system/settings/EmailTab.vue b/web/admin/src/views/system/settings/EmailTab.vue index 8ca0ee4..74989ea 100644 --- a/web/admin/src/views/system/settings/EmailTab.vue +++ b/web/admin/src/views/system/settings/EmailTab.vue @@ -40,8 +40,8 @@ const values = useFormValues() 启用 TLS 587/465 端口建议开启 diff --git a/web/admin/src/views/system/settings/GeneralTab.vue b/web/admin/src/views/system/settings/GeneralTab.vue index 2583e9b..1955d14 100644 --- a/web/admin/src/views/system/settings/GeneralTab.vue +++ b/web/admin/src/views/system/settings/GeneralTab.vue @@ -28,16 +28,16 @@ const values = useFormValues() 开放注册 是否允许新用户注册
注册邮箱验证 注册时是否需要邮箱验证码,关闭时使用滑块验证
@@ -49,8 +49,8 @@ const values = useFormValues() 启用维护模式 开启后控制台显示维护提示
@@ -65,8 +65,8 @@ const values = useFormValues() 全局 API 维护 开启后 API 代理返回 503
diff --git a/web/admin/src/views/system/settings/OAuthTab.vue b/web/admin/src/views/system/settings/OAuthTab.vue index c3f4425..8978e8d 100644 --- a/web/admin/src/views/system/settings/OAuthTab.vue +++ b/web/admin/src/views/system/settings/OAuthTab.vue @@ -12,8 +12,8 @@ const values = useFormValues() OAuth 自动注册 首次 OAuth 登录自动创建租户账号
@@ -30,8 +30,8 @@ const values = useFormValues() 启用 GitHub 登录
@@ -51,8 +51,8 @@ const values = useFormValues() 启用 Google 登录
diff --git a/web/admin/src/views/system/settings/PerformanceTab.vue b/web/admin/src/views/system/settings/PerformanceTab.vue index 855d538..f8d99c6 100644 --- a/web/admin/src/views/system/settings/PerformanceTab.vue +++ b/web/admin/src/views/system/settings/PerformanceTab.vue @@ -65,8 +65,8 @@ function set(key: string, v: number | undefined): void {
@@ -107,8 +107,8 @@ function set(key: string, v: number | undefined): void {
diff --git a/web/admin/src/views/system/settings/SecurityTab.vue b/web/admin/src/views/system/settings/SecurityTab.vue index 45f2204..a7ae65b 100644 --- a/web/admin/src/views/system/settings/SecurityTab.vue +++ b/web/admin/src/views/system/settings/SecurityTab.vue @@ -89,7 +89,7 @@ const values = useFormValues() diff --git a/web/admin/src/views/system/settings/StorageTab.vue b/web/admin/src/views/system/settings/StorageTab.vue index 98637fa..da2b5c0 100644 --- a/web/admin/src/views/system/settings/StorageTab.vue +++ b/web/admin/src/views/system/settings/StorageTab.vue @@ -47,8 +47,8 @@ const values = useFormValues()
启用 SSL
diff --git a/web/admin/src/views/system/settings/useSettings.ts b/web/admin/src/views/system/settings/useSettings.ts index 1b2c3ec..64f8854 100644 --- a/web/admin/src/views/system/settings/useSettings.ts +++ b/web/admin/src/views/system/settings/useSettings.ts @@ -19,12 +19,7 @@ export function useSettings(category: () => string) { const items = res.data?.data?.list || [] const vals: Record = {} for (const item of items) { - let val = item.value ?? item.default ?? '' - // Normalize bool values to strings for consistent switch handling - if (item.type === 'bool') { - val = String(val) - } - vals[item.key] = val + vals[item.key] = item.value ?? item.default ?? '' } Object.keys(formValues).forEach(k => delete formValues[k]) Object.assign(formValues, vals)