From b4c815ec9daf52c5102a06777329bbbe9d6bfaca Mon Sep 17 00:00:00 2001 From: chengqian Date: Mon, 8 Jun 2026 18:01:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=A7=BB=E9=99=A4=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=BC=94=E7=A4=BA=E6=A8=A1=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/logic/common/settings_registry.go | 4 ---- internal/logic/settings/settings.go | 9 +++++++++ internal/middleware/demo.go | 7 ++++--- manifest/config/config.example.yaml | 6 ++++++ manifest/docker/config.example.yaml | 6 ++++++ .../src/views/system/settings/GeneralTab.vue | 18 ------------------ 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/internal/logic/common/settings_registry.go b/internal/logic/common/settings_registry.go index 0db7299..1fd34a8 100644 --- a/internal/logic/common/settings_registry.go +++ b/internal/logic/common/settings_registry.go @@ -67,10 +67,6 @@ var Registry = []SettingDef{ Label: "预计维护时长", Description: "维护模式预计持续时间,展示给用户", IsPublic: true}, {Key: "api_maintenance_enabled", Type: SettingTypeBool, Default: "false", Category: "general", Label: "全局 API 维护", Description: "开启后 API 代理返回 503,叠加维护模式使用", IsPublic: true}, - {Key: "demo_mode", Type: SettingTypeBool, Default: "false", Category: "general", - Label: "演示模式", Description: "开启后所有写操作被拦截,仅允许只读访问", IsPublic: true}, - {Key: "demo_message", Type: SettingTypeString, Default: "演示环境,数据不可修改", Category: "general", - Label: "演示模式提示", Description: "演示模式下返回给用户的提示信息", IsPublic: true}, {Key: "tenant_console_url", Type: SettingTypeString, Default: "", Category: "general", Label: "租户控制台地址", Description: "租户控制台的完整 URL,如 https://console.example.com,用于生成邀请链接等"}, diff --git a/internal/logic/settings/settings.go b/internal/logic/settings/settings.go index a3d6a76..071ead7 100644 --- a/internal/logic/settings/settings.go +++ b/internal/logic/settings/settings.go @@ -3,6 +3,7 @@ package settings import ( "context" + "github.com/gogf/gf/v2/frame/g" "github.com/qianfree/team-api/internal/dao" "github.com/qianfree/team-api/internal/logic/common" "github.com/qianfree/team-api/internal/service" @@ -42,6 +43,14 @@ func (s *sSettings) PublicSettingsGet(ctx context.Context, _ *v1.PublicSettingsG } } + // Inject demo mode from config file (not database — avoids the self-lock bug) + settings["demo_mode"] = g.Cfg().MustGet(ctx, "demo.enabled").Bool() + demoMsg := g.Cfg().MustGet(ctx, "demo.message").String() + if demoMsg == "" { + demoMsg = "演示环境,数据不可修改" + } + settings["demo_message"] = demoMsg + return &v1.PublicSettingsGetRes{Settings: settings}, nil } diff --git a/internal/middleware/demo.go b/internal/middleware/demo.go index 06d9b56..c8694ca 100644 --- a/internal/middleware/demo.go +++ b/internal/middleware/demo.go @@ -3,10 +3,10 @@ package middleware import ( "strings" + "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/qianfree/team-api/internal/consts" - "github.com/qianfree/team-api/internal/logic/common" "github.com/qianfree/team-api/internal/response" ) @@ -21,10 +21,11 @@ var demoWhitelistPaths = map[string]bool{ } // DemoMode blocks all write operations when demo mode is enabled. +// Controlled via config file: demo.enabled = true. // Read-only requests (GET/HEAD/OPTIONS) and whitelisted paths are allowed. func DemoMode(r *ghttp.Request) { ctx := r.Context() - if !common.Config().GetBool(ctx, "demo_mode") { + if !g.Cfg().MustGet(ctx, "demo.enabled").Bool() { r.Middleware.Next() return } @@ -50,7 +51,7 @@ func DemoMode(r *ghttp.Request) { return } - message := common.Config().GetString(ctx, "demo_message") + message := g.Cfg().MustGet(ctx, "demo.message").String() if message == "" { message = consts.MsgDemoModeRestricted } diff --git a/manifest/config/config.example.yaml b/manifest/config/config.example.yaml index e60b232..d7787bd 100644 --- a/manifest/config/config.example.yaml +++ b/manifest/config/config.example.yaml @@ -65,5 +65,11 @@ email: password: "" from: "" +# Demo mode (read-only mode, configured here — not in admin UI) +# Set enabled: true to block all write operations and show a watermark +demo: + enabled: false + message: "演示环境,数据不可修改" + # Channel proxy (for accessing Google/Anthropic etc. from China) channel_proxy_url: "" diff --git a/manifest/docker/config.example.yaml b/manifest/docker/config.example.yaml index 5d0cc04..2982df3 100644 --- a/manifest/docker/config.example.yaml +++ b/manifest/docker/config.example.yaml @@ -81,3 +81,9 @@ email: username: "" password: "" from: "" + +# 演示模式(通过配置文件控制,不在管理后台设置) +# 开启后所有写操作被拦截,仅允许只读访问,并在控制台显示水印 +demo: + enabled: false + message: "演示环境,数据不可修改" diff --git a/web/admin/src/views/system/settings/GeneralTab.vue b/web/admin/src/views/system/settings/GeneralTab.vue index 4a9c0cb..2583e9b 100644 --- a/web/admin/src/views/system/settings/GeneralTab.vue +++ b/web/admin/src/views/system/settings/GeneralTab.vue @@ -42,24 +42,6 @@ const values = useFormValues() - -
-
演示模式
-
- 启用演示模式 - 开启后所有写操作被拦截,仅允许只读访问 - -
-
- - - -
-
-
维护模式