package controllers import ( "html/template" "net/http" "go_blog/config" "go_blog/models" "go_blog/themes" "github.com/gin-gonic/gin" ) // ListThemes 显示主题管理页面(返回主题列表和当前主题) func ListThemes(c *gin.Context) { // 从上下文中获取主题管理器 tm, exists := c.Get("ThemeManager") if !exists { c.String(http.StatusInternalServerError, "主题管理器未找到") return } themeManager, ok := tm.(*themes.ThemeManager) if !ok { c.String(http.StatusInternalServerError, "主题管理器类型错误") return } // 获取可用主题列表(读取 web/themes 目录下的所有子目录) entries, err := themeManager.GetAvailableThemes() // 假设 ThemeManager 新增获取主题列表方法 if err != nil { c.String(http.StatusInternalServerError, "读取主题目录失败: "+err.Error()) return } // 渲染管理页面模板 // 直接加载 web/admin/themes.tmpl 文件(路径相对于项目根目录) const themesTemplatePath = "web/admin/themes.tmpl" // 定义模板路径常量 tpl, err := template.ParseFiles(themesTemplatePath) if err != nil { c.String(http.StatusInternalServerError, "模板加载失败: "+err.Error()) return } c.Header("Content-Type", "text/html; charset=utf-8") err = tpl.Execute(c.Writer, gin.H{ "CurrentTheme": themeManager.CurrentTheme(), "Themes": entries, }) if err != nil { c.String(http.StatusInternalServerError, "渲染模板失败: "+err.Error()) } } // SwitchTheme 处理主题切换请求 func SwitchTheme(c *gin.Context) { // 从上下文中获取主题管理器 tm, exists := c.Get("ThemeManager") if !exists { c.JSON(http.StatusInternalServerError, gin.H{"error": "主题管理器未找到"}) return } themeManager, ok := tm.(*themes.ThemeManager) if !ok { c.JSON(http.StatusInternalServerError, gin.H{"error": "主题管理器类型错误"}) return } newTheme := c.PostForm("theme") if newTheme == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "主题名称不能为空"}) return } // 校验主题是否存在(保持原有逻辑) availableThemes, _ := themeManager.GetAvailableThemes() themeExists := false for _, t := range availableThemes { if t == newTheme { themeExists = true break } } if !themeExists { c.JSON(http.StatusBadRequest, gin.H{"error": "无效的主题名称"}) return } // 加载新主题(保持原有逻辑) if err := themeManager.LoadTheme(newTheme); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "主题加载失败,请检查主题文件"}) return } // 更新全局配置 globalConfig := config.GetGlobalConfig() globalConfig.Theme.Current = newTheme // 调用options.go的SetOptionValue持久化配置 if err := models.SetOptionValue(models.DB, "current_theme", 0, newTheme); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "主题配置保存失败: " + err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "主题切换成功", "current_theme": newTheme}) }