package logic import ( "context" "strings" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" adminv1 "tool-api/api/admin/v1" "tool-api/internal/consts" ) // ============================================================================ // 管理端系统配置(迭代-2026-09-29) // // 走 settings 表(约定 S9:配置一律走 settings 表,不写 config.yaml)。 // 只开放白名单键:管理端可读可写的键集中在这里登记,避免把 settings 全表暴露。 // ============================================================================ // adminSettingWhitelist 管理端可读写的配置键白名单 var adminSettingWhitelist = []struct { Key string Remark string // Normalize 保存前的归一化(可为 nil) Normalize func(string) string }{ { Key: consts.SettingSiteBaseUrl, Remark: "图片等静态资源的对外拼接前缀(如 https://api.example.com),留空 = 按请求域名动态拼接", Normalize: func(v string) string { return strings.TrimRight(strings.TrimSpace(v), "/") }, }, { Key: consts.SettingHomeFeatureCovers, Remark: "首页便捷功能卡背景图,JSON:{\"note\":\"/static/...\",\"event\":\"...\"}(key 对齐小程序 features.ts)", Normalize: func(v string) string { return strings.TrimSpace(v) }, }, } // AdminSettingGet 读取白名单配置项(含当前值与说明) func AdminSettingGet(ctx context.Context) (*adminv1.AdminSettingGetRes, error) { res := &adminv1.AdminSettingGetRes{Items: make([]adminv1.AdminSettingItem, 0, len(adminSettingWhitelist))} for _, def := range adminSettingWhitelist { res.Items = append(res.Items, adminv1.AdminSettingItem{ Key: def.Key, Value: SettingValue(ctx, def.Key), Remark: def.Remark, }) } return res, nil } // AdminSettingSave 保存一项配置(key 必须在白名单内;保存立即生效,SettingValue 缓存同步失效) func AdminSettingSave(ctx context.Context, key, value string) (*adminv1.AdminSettingSaveRes, error) { for _, def := range adminSettingWhitelist { if def.Key != key { continue } v := value if def.Normalize != nil { v = def.Normalize(v) } before := SettingValue(ctx, key) if err := SettingSave(ctx, key, v, def.Remark); err != nil { return nil, err } WriteAudit(ctx, AuditEntry{ Action: "setting.save", TargetType: "setting", TargetId: key, Before: g.Map{"v": before}, After: g.Map{"v": v}, Result: consts.AuditResultSuccess, }) return &adminv1.AdminSettingSaveRes{}, nil } return nil, gerror.New("不支持的配置项") }