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 <noreply@anthropic.com>
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
|
|
"go_blog/i18n"
|
|
"go_blog/models"
|
|
)
|
|
|
|
// AuthRequired is middleware that protects routes. If the user is not logged in,
|
|
// they are redirected to /login.
|
|
func AuthRequired() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
session := sessions.Default(c)
|
|
userID := session.Get("user_id")
|
|
if userID == nil {
|
|
c.Redirect(http.StatusFound, "/login")
|
|
c.Abort()
|
|
return
|
|
}
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// SetUserContext is global middleware that reads the session and sets
|
|
// template-friendly context values for all pages (language, auth state, etc.).
|
|
func SetUserContext(db *gorm.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
session := sessions.Default(c)
|
|
|
|
// --- Language detection ---
|
|
// Priority: query param > session > Accept-Language header > default EN
|
|
var lang i18n.Lang
|
|
queryLang := c.Query("lang")
|
|
|
|
switch queryLang {
|
|
case "zh":
|
|
lang = i18n.ZH
|
|
case "en":
|
|
lang = i18n.EN
|
|
case "":
|
|
// Try session
|
|
if saved, ok := session.Get("lang").(string); ok {
|
|
lang = i18n.Lang(saved)
|
|
}
|
|
if lang == "" {
|
|
// Try Accept-Language header
|
|
lang = i18n.DetectLang(c.GetHeader("Accept-Language"))
|
|
}
|
|
default:
|
|
// Unsupported language in query — fall back to English.
|
|
lang = i18n.EN
|
|
}
|
|
|
|
// Persist language in session.
|
|
session.Set("lang", string(lang))
|
|
session.Save()
|
|
|
|
// Make translations available in the Gin context.
|
|
c.Set("tr", i18n.T(lang))
|
|
c.Set("lang", string(lang))
|
|
|
|
// Set the opposite language code for the language switcher link.
|
|
switchLang := "zh"
|
|
if lang == i18n.ZH {
|
|
switchLang = "en"
|
|
}
|
|
c.Set("switch_lang", switchLang)
|
|
|
|
// --- Auth state ---
|
|
userID := session.Get("user_id")
|
|
isLoggedIn := false
|
|
var username string
|
|
var avatar string
|
|
var displayName string
|
|
var role string
|
|
|
|
if userID != nil {
|
|
isLoggedIn = true
|
|
var user models.User
|
|
if err := db.First(&user, userID).Error; err == nil {
|
|
username = user.Username
|
|
avatar = user.Avatar
|
|
displayName = user.DisplayName
|
|
role = user.Role
|
|
}
|
|
}
|
|
|
|
c.Set("is_logged_in", isLoggedIn)
|
|
c.Set("username", username)
|
|
c.Set("avatar", avatar)
|
|
c.Set("display_name", displayName)
|
|
c.Set("role", role)
|
|
|
|
// --- Site platform configuration (from DB cache) ---
|
|
site := models.GetSiteSetting()
|
|
c.Set("site_setting", site)
|
|
c.Set("site_logo", site.Logo)
|
|
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()
|
|
}
|
|
}
|