Files
mce/internal/config/site_settings.go
Victor_Jay 0014bdb9ff feat: 品牌CMS配置化 + cookie_secure配置
- config.yaml 新增 server.cookie_secure 配置项
- site_settings 新增 site_name/site_tagline/contact_email 站点信息
- SiteInfo 结构体扩展,支持运行时从 DB 读取站点品牌信息
- cookie.go 使用 cfg.Server.CookieSecure 替代 Mode!=debug 判断
- SetSessionCookie/ClearSessionCookie 支持 siteSettings 运行时覆盖
- 模板替换硬编码 MetaLab → {{.SiteName}}(nav/header/footer/home/login/register/guidelines/admin,12+处)
- 管理后台站点设置页新增站点名称/标语/联系邮箱输入项
- 页脚版权年份改为动态 CurrentYear
- 注册成功消息 CMS 化(后端+前端)
2026-06-21 23:34:14 +08:00

147 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package config
import (
"strconv"
"sync"
"metazone.cc/mce/internal/model"
"gorm.io/gorm"
)
// SiteSettings 站点设置管理器DB 持久化 + 内存缓存,不重启生效)
// 启动时从 DB 加载全量到内存,运行时读内存不查 DB写入同步写 DB 和内存
type SiteSettings struct {
mu sync.RWMutex
data map[string]string
db *gorm.DB
}
// NewSiteSettings 创建站点设置管理器并加载 DB 中已有配置
func NewSiteSettings(db *gorm.DB) (*SiteSettings, error) {
ss := &SiteSettings{
data: make(map[string]string),
db: db,
}
if err := ss.reload(); err != nil {
return nil, err
}
return ss, nil
}
// reload 从 DB 加载全量设置到内存
func (s *SiteSettings) reload() error {
var rows []model.SiteSetting
if err := s.db.Find(&rows).Error; err != nil {
return err
}
s.mu.Lock()
defer s.mu.Unlock()
for _, row := range rows {
s.data[row.Key] = row.Value
}
return nil
}
// Get 读取一个字符串值,不存在返回默认值
func (s *SiteSettings) Get(key, defaultVal string) string {
s.mu.RLock()
defer s.mu.RUnlock()
val, ok := s.data[key]
if !ok {
return defaultVal
}
return val
}
// GetBool 读取布尔值,不存在返回默认值(仅 "true" 字符串视为 true
func (s *SiteSettings) GetBool(key string, defaultVal bool) bool {
s.mu.RLock()
defer s.mu.RUnlock()
val, ok := s.data[key]
if !ok {
return defaultVal
}
b, err := strconv.ParseBool(val)
if err != nil {
return defaultVal
}
return b
}
// Set 写入设置(同步写 DB + 更新内存)
func (s *SiteSettings) Set(key, value string) error {
entry := model.SiteSetting{Key: key, Value: value}
if err := s.db.Save(&entry).Error; err != nil {
return err
}
s.mu.Lock()
s.data[key] = value
s.mu.Unlock()
return nil
}
// SetBool 写入布尔设置
func (s *SiteSettings) SetBool(key string, value bool) error {
return s.Set(key, strconv.FormatBool(value))
}
// All 返回所有设置的快照(用于前端展示)
func (s *SiteSettings) All() map[string]string {
s.mu.RLock()
defer s.mu.RUnlock()
cp := make(map[string]string, len(s.data))
for k, v := range s.data {
cp[k] = v
}
return cp
}
// IsAuditEnabled 审核总开关是否开启
// 优先查站点设置 DB若无则取 config.yaml 默认值
func (s *SiteSettings) IsAuditEnabled() bool {
return s.GetBool("audit.enabled", App.Audit.Enabled)
}
// IsAuditTypeEnabled 某类型审核是否开启
func (s *SiteSettings) IsAuditTypeEnabled(auditType string, defaultVal bool) bool {
return s.GetBool("audit."+auditType, defaultVal)
}
// --- 站点信息设置 ---
// SiteInfoDefaults 站点展示信息的默认值
type SiteInfoDefaults struct {
SiteName string // 站点名称,默认 "MetaLab"
SiteTagline string // 站点标语,默认 "下一代开发者社区"
ContactEmail string // 联系/申诉邮箱,默认 "metazone@foxmail.com"
Framework string // 附加标识,默认 "Framework: MetaGenesis"
CopyrightStart string // 版权起始年份,默认 "2024"
}
// SiteInfo 获取站点展示信息(优先 DB 设置fallback 默认值)
func (s *SiteSettings) SiteInfo() SiteInfoDefaults {
return SiteInfoDefaults{
SiteName: s.Get("site.name", "MetaLab"),
SiteTagline: s.Get("site.tagline", "下一代开发者社区"),
ContactEmail: s.Get("site.contact_email", "metazone@foxmail.com"),
Framework: s.Get("site.framework", "Framework: MetaGenesis"),
CopyrightStart: s.Get("site.copyright_start", "2024"),
}
}
// CookieSecure 返回 cookie_secure 配置值优先站点设置fallback config.yaml
func (s *SiteSettings) CookieSecure() bool {
return s.GetBool("site.cookie_secure", App.Server.CookieSecure)
}
// IsRegistrationEnabled 是否允许新用户注册
func (s *SiteSettings) IsRegistrationEnabled() bool {
return s.GetBool("registration.enabled", true)
}
// IsMaintenanceEnabled 是否处于维护模式(维护期间仅站长可登录和访问)
func (s *SiteSettings) IsMaintenanceEnabled() bool {
return s.GetBool("maintenance.enabled", false)
}