From 0c5bcde7dae2c67fa763031739fc1f6c53af41bd Mon Sep 17 00:00:00 2001 From: kevin Date: Sun, 21 Jun 2026 20:41:45 +0800 Subject: [PATCH] feat: make home welcome/subtitle configurable and fix settings render Add home_welcome and home_subtitle fields (zh/en) to site_settings so the home page heading and subtitle are editable from the admin panel, falling back to the i18n defaults when empty. Wire them through the config cache, SetUserContext, DefaultData, and home.html. Fix the /admin/settings/site page rendering blank: Go templates cannot invoke methods on an interface{}-wrapped struct, so pre-compute SiteLogoIsURL in the handler instead of calling .Site.LogoIsURL() in the template. Co-Authored-By: Claude Fable 5 --- handlers/helpers.go | 4 +++ handlers/settings.go | 7 +++++ i18n/i18n.go | 8 ++++++ middleware/auth.go | 2 ++ models/site_setting.go | 42 +++++++++++++++++++++++++++--- templates/admin/settings_site.html | 30 +++++++++++++++++++-- templates/pages/home.html | 4 +-- 7 files changed, 89 insertions(+), 8 deletions(-) diff --git a/handlers/helpers.go b/handlers/helpers.go index 6ecb537..0a9d4c3 100644 --- a/handlers/helpers.go +++ b/handlers/helpers.go @@ -21,6 +21,8 @@ func DefaultData(c *gin.Context) gin.H { siteLogoIsURL, _ := c.Get("site_logo_is_url") siteLogoText, _ := c.Get("site_logo_text") siteHeaderText, _ := c.Get("site_header_text") + siteHomeWelcome, _ := c.Get("site_home_welcome") + siteHomeSubtitle, _ := c.Get("site_home_subtitle") siteFooterText, _ := c.Get("site_footer_text") return gin.H{ @@ -37,6 +39,8 @@ func DefaultData(c *gin.Context) gin.H { "SiteLogoIsURL": siteLogoIsURL, "SiteLogoText": siteLogoText, "SiteHeaderText": siteHeaderText, + "SiteHomeWelcome": siteHomeWelcome, + "SiteHomeSubtitle": siteHomeSubtitle, "SiteFooterText": siteFooterText, } } diff --git a/handlers/settings.go b/handlers/settings.go index 1ce7ece..dc44bdb 100644 --- a/handlers/settings.go +++ b/handlers/settings.go @@ -59,6 +59,9 @@ func SiteSettingsPage(db *gorm.DB) gin.HandlerFunc { data := DefaultData(c) data["Title"] = tr["settings_site_title"] data["Site"] = s + // Pre-compute derived values so the template never invokes methods on + // an interface{}-wrapped struct (which Go templates cannot resolve). + data["SiteLogoIsURL"] = s.LogoIsURL() if msg := c.Query("saved"); msg == "1" { data["Success"] = tr["settings_saved"] } @@ -78,6 +81,10 @@ func SiteSettingsSave(db *gorm.DB, storagePath string) gin.HandlerFunc { s.LogoTextEn = strings.TrimSpace(c.PostForm("logo_text_en")) s.HeaderTextZh = strings.TrimSpace(c.PostForm("header_text_zh")) s.HeaderTextEn = strings.TrimSpace(c.PostForm("header_text_en")) + s.HomeWelcomeZh = strings.TrimSpace(c.PostForm("home_welcome_zh")) + s.HomeWelcomeEn = strings.TrimSpace(c.PostForm("home_welcome_en")) + s.HomeSubtitleZh = strings.TrimSpace(c.PostForm("home_subtitle_zh")) + s.HomeSubtitleEn = strings.TrimSpace(c.PostForm("home_subtitle_en")) s.FooterTextZh = strings.TrimSpace(c.PostForm("footer_text_zh")) s.FooterTextEn = strings.TrimSpace(c.PostForm("footer_text_en")) s.UpdatedBy = userIDFromSession(c) diff --git a/i18n/i18n.go b/i18n/i18n.go index fa52f12..bf04224 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -150,6 +150,10 @@ var translations = map[Lang]map[string]string{ "settings_logo_text_en": "Site Title (English)", "settings_header_text_zh": "Header Banner Text (Chinese)", "settings_header_text_en": "Header Banner Text (English)", + "settings_home_welcome_zh": "Home Welcome Heading (Chinese)", + "settings_home_welcome_en": "Home Welcome Heading (English)", + "settings_home_subtitle_zh": "Home Subtitle (Chinese)", + "settings_home_subtitle_en": "Home Subtitle (English)", "settings_footer_text_zh": "Footer Text (Chinese)", "settings_footer_text_en": "Footer Text (English)", "settings_leave_blank": "Leave blank to use the built-in default.", @@ -318,6 +322,10 @@ var translations = map[Lang]map[string]string{ "settings_logo_text_en": "站点标题(英文)", "settings_header_text_zh": "顶部横幅文本(中文)", "settings_header_text_en": "顶部横幅文本(英文)", + "settings_home_welcome_zh": "主页欢迎标题(中文)", + "settings_home_welcome_en": "主页欢迎标题(英文)", + "settings_home_subtitle_zh": "主页副标题(中文)", + "settings_home_subtitle_en": "主页副标题(英文)", "settings_footer_text_zh": "页脚文本(中文)", "settings_footer_text_en": "页脚文本(英文)", "settings_leave_blank": "留空则使用内置默认值。", diff --git a/middleware/auth.go b/middleware/auth.go index f3a92ed..3d229dc 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -103,6 +103,8 @@ func SetUserContext(db *gorm.DB) gin.HandlerFunc { c.Set("site_logo_is_url", site.LogoIsURL()) c.Set("site_logo_text", site.LogoText(string(lang))) c.Set("site_header_text", site.HeaderText(string(lang))) + c.Set("site_home_welcome", site.HomeWelcome(string(lang))) + c.Set("site_home_subtitle", site.HomeSubtitle(string(lang))) c.Set("site_footer_text", site.FooterText(string(lang))) c.Next() diff --git a/models/site_setting.go b/models/site_setting.go index 58c624c..7debc34 100644 --- a/models/site_setting.go +++ b/models/site_setting.go @@ -10,10 +10,14 @@ type SiteSetting struct { Logo string `gorm:"size:512" json:"logo"` // local filename (served under /uploads/logos) OR a full URL LogoTextZh string `gorm:"size:255" json:"logo_text_zh"` // top-left title (zh) LogoTextEn string `gorm:"size:255" json:"logo_text_en"` // top-left title (en) - HeaderTextZh string `gorm:"size:512" json:"header_text_zh"` // header banner text (zh) - HeaderTextEn string `gorm:"size:512" json:"header_text_en"` // header banner text (en) - FooterTextZh string `gorm:"size:512" json:"footer_text_zh"` // footer text (zh) - FooterTextEn string `gorm:"size:512" json:"footer_text_en"` // footer text (en) + HeaderTextZh string `gorm:"size:512" json:"header_text_zh"` // header banner text (zh) + HeaderTextEn string `gorm:"size:512" json:"header_text_en"` // header banner text (en) + HomeWelcomeZh string `gorm:"size:255" json:"home_welcome_zh"` // home page welcome heading (zh) + HomeWelcomeEn string `gorm:"size:255" json:"home_welcome_en"` // home page welcome heading (en) + HomeSubtitleZh string `gorm:"size:512" json:"home_subtitle_zh"` // home page subtitle (zh) + HomeSubtitleEn string `gorm:"size:512" json:"home_subtitle_en"` // home page subtitle (en) + FooterTextZh string `gorm:"size:512" json:"footer_text_zh"` // footer text (zh) + FooterTextEn string `gorm:"size:512" json:"footer_text_en"` // footer text (en) UpdatedBy uint `gorm:"index" json:"updated_by"` UpdatedAt time.Time `json:"updated_at"` } @@ -62,6 +66,36 @@ func (s *SiteSetting) HeaderText(lang string) string { return s.HeaderTextZh } +// HomeWelcome returns the home page welcome heading for the given language, +// falling back to the other language when the requested one is empty. +func (s *SiteSetting) HomeWelcome(lang string) string { + if lang == "zh" { + if s.HomeWelcomeZh != "" { + return s.HomeWelcomeZh + } + return s.HomeWelcomeEn + } + if s.HomeWelcomeEn != "" { + return s.HomeWelcomeEn + } + return s.HomeWelcomeZh +} + +// HomeSubtitle returns the home page subtitle for the given language, +// falling back to the other language when the requested one is empty. +func (s *SiteSetting) HomeSubtitle(lang string) string { + if lang == "zh" { + if s.HomeSubtitleZh != "" { + return s.HomeSubtitleZh + } + return s.HomeSubtitleEn + } + if s.HomeSubtitleEn != "" { + return s.HomeSubtitleEn + } + return s.HomeSubtitleZh +} + // FooterText returns the footer text for the given language code, falling // back to the other language when the requested one is empty. func (s *SiteSetting) FooterText(lang string) string { diff --git a/templates/admin/settings_site.html b/templates/admin/settings_site.html index e844745..8051d4e 100644 --- a/templates/admin/settings_site.html +++ b/templates/admin/settings_site.html @@ -19,14 +19,14 @@
{{if .Site.Logo}} - {{if .Site.LogoIsURL}} + {{if .SiteLogoIsURL}} logo {{else}} logo {{end}} {{end}} + class="w-full border border-gray-300 rounded-lg px-3 py-2 mb-2" value="{{if .SiteLogoIsURL}}{{.Site.Logo}}{{end}}">
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
diff --git a/templates/pages/home.html b/templates/pages/home.html index 0c2af08..fca649d 100644 --- a/templates/pages/home.html +++ b/templates/pages/home.html @@ -2,10 +2,10 @@ {{template "header" .}}

- {{index .Tr "home_welcome"}} + {{if .SiteHomeWelcome}}{{.SiteHomeWelcome}}{{else}}{{index .Tr "home_welcome"}}{{end}}

- {{index .Tr "home_subtitle"}} + {{if .SiteHomeSubtitle}}{{.SiteHomeSubtitle}}{{else}}{{index .Tr "home_subtitle"}}{{end}}