Files
qitongxue-api/internal/logic/setting_admin.go

83 lines
2.6 KiB
Go
Raw Normal View History

2026-09-30 17:01:18 +08:00
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("不支持的配置项")
}