83 lines
2.6 KiB
Go
83 lines
2.6 KiB
Go
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("不支持的配置项")
|
||
}
|