新增功能:
- 主题发现模块:扫描 templates/ 目录下含 theme.json 的目录
- 站点设置新增 site.theme 键,DB 持久化 + 内存缓存
- 运行时切换主题:保存后即时重载 Gin 模板 + 静态资源哈希
- 管理后台 '外观主题' 页面:列表展示、选择、一键切换
- 动态静态资源服务:根据当前主题目录提供 CSS/JS
修复:
- account.html 残留孤儿 {{end}} 模板语法错误
- 动态静态资源 handler 误判 Gin *filepath 路径前缀为绝对路径
变更文件(12 modified + 3 new):
- cmd/server/main.go: 动态主题加载 + 运行时重载 + 动态静态服务
- internal/theme/discovery.go: 新增主题扫描
- internal/config/site_settings.go: ThemeName()
- internal/service/site_setting_service.go: ThemeReloader + UpdateTheme
- internal/controller/admin/: ISP 扩展 + GetThemes/UpdateTheme/ThemePage
- internal/controller/auth_controller.go: 准则路径动态化
- internal/router/: InjectThemeReloader + 新路由
- templates/: 外观主题页面 + JS + CSS + 子导航
This commit is contained in:
@ -36,6 +36,8 @@ func setupAdminRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
middleware.RequirePageRole(model.RoleOwner))
|
||||
adminPages.GET("/settings/content", d.siteSettingCtrl.ContentPage,
|
||||
middleware.RequirePageRole(model.RoleOwner))
|
||||
adminPages.GET("/settings/theme", d.siteSettingCtrl.ThemePage,
|
||||
middleware.RequirePageRole(model.RoleOwner))
|
||||
adminPages.GET("/energy", d.adminEnergyCtrl.EnergyPage)
|
||||
adminPages.GET("/energy/logs", d.adminEnergyCtrl.EnergyLogPage)
|
||||
adminPages.GET("/energy/fund-logs", d.adminEnergyCtrl.FundLogPage)
|
||||
@ -70,6 +72,8 @@ func setupAdminRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
siteSettingsAPI.PUT("", d.siteSettingCtrl.UpdateSetting)
|
||||
siteSettingsAPI.PUT("/bool", d.siteSettingCtrl.UpdateBoolSetting)
|
||||
siteSettingsAPI.GET("/bool", d.siteSettingCtrl.GetBoolSetting)
|
||||
siteSettingsAPI.GET("/themes", d.siteSettingCtrl.GetThemes)
|
||||
siteSettingsAPI.PUT("/theme", d.siteSettingCtrl.UpdateTheme)
|
||||
}
|
||||
|
||||
// --- 帖子管理 API(admin+) ---
|
||||
|
||||
@ -3,13 +3,25 @@ package router
|
||||
|
||||
import (
|
||||
"metazone.cc/mce/internal/config"
|
||||
adminCtrl "metazone.cc/mce/internal/controller/admin"
|
||||
"metazone.cc/mce/internal/middleware"
|
||||
"metazone.cc/mce/internal/service"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// 保存站点设置 Controller 引用,供 InjectThemeReloader 使用
|
||||
var globalSiteSettingCtrl *adminCtrl.SiteSettingController
|
||||
|
||||
// InjectThemeReloader 注入主题重载回调(main.go 在路由注册后调用,使主题切换实时生效)
|
||||
func InjectThemeReloader(reload service.ThemeReloader) {
|
||||
if globalSiteSettingCtrl != nil {
|
||||
globalSiteSettingCtrl.SetThemeReloader(reload)
|
||||
}
|
||||
}
|
||||
|
||||
// Setup 注册所有路由
|
||||
func Setup(r *gin.Engine, db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) {
|
||||
r.Use(middleware.SecurityHeaders())
|
||||
@ -18,6 +30,9 @@ func Setup(r *gin.Engine, db *gorm.DB, cfg *config.Config, siteSettings *config.
|
||||
|
||||
deps := buildDeps(db, cfg, siteSettings, redisClient)
|
||||
|
||||
// 保存站点设置 Controller 引用
|
||||
globalSiteSettingCtrl = deps.siteSettingCtrl
|
||||
|
||||
// 维护模式中间件(全局,在路由匹配之前)
|
||||
r.Use(deps.maintenanceMdw.Handler())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user