- Add Favicon field to SiteSetting model with FaviconIsURL() helper - Implement favicon upload and management in site settings page - Support both external URL and local file upload for favicon - Add favicon display in page header with automatic URL detection - Add i18n translations for favicon settings (EN/ZH) - Update middleware and helpers to pass favicon data to templates - Include migration script for existing databases Users can now customize their site's favicon from /admin/settings/site by either providing an external URL or uploading a local image file (recommended formats: .ico, .png, .svg, 16x16 or 32x32 pixels). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
123 lines
4.0 KiB
Go
123 lines
4.0 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
// SiteSetting holds the singleton (id=1) global display configuration:
|
|
// logo, top-left title, header banner text, and footer text, each with
|
|
// zh/en variants that fall back to i18n defaults when empty.
|
|
type SiteSetting struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Logo string `gorm:"size:512" json:"logo"` // local filename (served under /uploads/logos) OR a full URL
|
|
Favicon string `gorm:"size:512" json:"favicon"` // 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)
|
|
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"`
|
|
}
|
|
|
|
// TableName overrides the default GORM table name.
|
|
func (SiteSetting) TableName() string {
|
|
return "site_settings"
|
|
}
|
|
|
|
// LogoIsURL reports whether the logo value is an external URL rather than a
|
|
// local filename.
|
|
func (s *SiteSetting) LogoIsURL() bool {
|
|
if s == nil || s.Logo == "" {
|
|
return false
|
|
}
|
|
return len(s.Logo) >= 4 && (s.Logo[:4] == "http")
|
|
}
|
|
|
|
// FaviconIsURL reports whether the favicon value is an external URL rather than a
|
|
// local filename.
|
|
func (s *SiteSetting) FaviconIsURL() bool {
|
|
if s == nil || s.Favicon == "" {
|
|
return false
|
|
}
|
|
return len(s.Favicon) >= 4 && (s.Favicon[:4] == "http")
|
|
}
|
|
|
|
// LogoText returns the title for the given language code, falling back to the
|
|
// other language when the requested one is empty.
|
|
func (s *SiteSetting) LogoText(lang string) string {
|
|
if lang == "zh" {
|
|
if s.LogoTextZh != "" {
|
|
return s.LogoTextZh
|
|
}
|
|
return s.LogoTextEn
|
|
}
|
|
if s.LogoTextEn != "" {
|
|
return s.LogoTextEn
|
|
}
|
|
return s.LogoTextZh
|
|
}
|
|
|
|
// HeaderText returns the header banner text for the given language code,
|
|
// falling back to the other language when the requested one is empty.
|
|
func (s *SiteSetting) HeaderText(lang string) string {
|
|
if lang == "zh" {
|
|
if s.HeaderTextZh != "" {
|
|
return s.HeaderTextZh
|
|
}
|
|
return s.HeaderTextEn
|
|
}
|
|
if s.HeaderTextEn != "" {
|
|
return s.HeaderTextEn
|
|
}
|
|
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 {
|
|
if lang == "zh" {
|
|
if s.FooterTextZh != "" {
|
|
return s.FooterTextZh
|
|
}
|
|
return s.FooterTextEn
|
|
}
|
|
if s.FooterTextEn != "" {
|
|
return s.FooterTextEn
|
|
}
|
|
return s.FooterTextZh
|
|
}
|