Files
gemini-banlancer/internal/webhandlers/page_handler.go
2025-11-20 12:24:05 +08:00

120 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Filename: internal/webhandlers/page_handler.go (测试前版本)
package webhandlers
import (
"encoding/json"
"gemini-balancer/internal/service"
"net/http"
"github.com/gin-gonic/gin"
)
// PageHandler
type PageHandler struct {
queryService *service.DashboardQueryService
}
// 构造函数注入新依赖
func NewPageHandler(queryService *service.DashboardQueryService) *PageHandler {
return &PageHandler{queryService: queryService}
}
// ShowDashboardPage 渲染现代化的监控面板页面
func (h *PageHandler) ShowDashboardPage(c *gin.Context) {
// [核心改造] 调用高速缓存读取方法,为模板准备数据
overviewData, err := h.queryService.GetDashboardOverviewData()
if err != nil {
// 在SSR模式下如果缓存未就绪我们可以传递一个空对象或默认值
// 这样页面至少可以渲染出骨架,而不是直接报错
c.HTML(http.StatusOK, "dashboard.html", gin.H{
"PageID": "dashboard",
"pageTitle": "监控面板",
"overview": nil, // 或者一个默认的空结构体实例
"error": "Dashboard data is currently being generated. Please refresh in a moment.",
"ssr_error": err.Error(),
})
return
}
c.HTML(http.StatusOK, "dashboard.html", gin.H{
"PageID": "dashboard",
"pageTitle": "监控面板",
"overview": overviewData,
"ssr_error": nil,
})
}
// ShowConfigEditorPage 渲染配置编辑页面。
func (h *PageHandler) ShowConfigEditorPage(c *gin.Context) {
c.HTML(http.StatusOK, "settings.html", gin.H{
"PageID": "settings",
"pageTitle": "配置编辑",
"currentPage": "settings",
})
}
// ShowErrorLogsPage 渲染错误日志页面。
func (h *PageHandler) ShowErrorLogsPage(c *gin.Context) {
c.HTML(http.StatusOK, "logs.html", gin.H{
"PageID": "logs",
"pageTitle": "错误日志",
})
}
// ShowKeysPage 渲染密钥管理页面。
func (h *PageHandler) ShowKeysPage(c *gin.Context) {
c.HTML(http.StatusOK, "keys.html", gin.H{
"PageID": "keys",
"pageTitle": "密钥管理",
})
}
// ShowTasksPage renders the M:N testing page.
func (h *PageHandler) ShowTasksPage(c *gin.Context) {
c.HTML(http.StatusOK, "tasks.html", gin.H{
"PageID": "tasks",
"pageTitle": "计划任务",
})
}
// ShowTasksPage renders the M:N testing page.
func (h *PageHandler) ShowChatPage(c *gin.Context) {
c.HTML(http.StatusOK, "chat.html", gin.H{
"PageID": "chat",
"pageTitle": "Webchat",
})
}
// 它只负责从 DashboardQueryService 获取数据并将其作为JSON字符串渲染出来。
func (h *PageHandler) ShowDashboardDebugPage(c *gin.Context) {
// 1. 调用与正式Dashboard完全相同的数据获取方法
overviewData, err := h.queryService.GetDashboardOverviewData()
if err != nil {
// 如果出错,直接将错误信息打印出来
c.HTML(http.StatusInternalServerError, "dashboard_debug.html", gin.H{
"PageID": "dashboard_debug",
"pageTitle": "Dashboard 诊断 - 错误",
"overview_json": "获取数据时发生错误: " + err.Error(),
})
return
}
// 2. 将获取到的Go数据结构格式化美化成JSON字符串
// 使用 MarshalIndent 是为了让输出的JSON带缩进便于阅读
jsonData, err := json.MarshalIndent(overviewData, "", " ")
if err != nil {
// 如果JSON序列化出错也直接打印错误
c.HTML(http.StatusInternalServerError, "dashboard_debug.html", gin.H{
"PageID": "dashboard_debug",
"pageTitle": "Dashboard 诊断 - 错误",
"overview_json": "序列化JSON时发生错误: " + err.Error(),
})
return
}
// 3. 将这个JSON字符串直接传递给一个极简的HTML模板
c.HTML(http.StatusOK, "dashboard_debug.html", gin.H{
"PageID": "dashboard-debug",
"pageTitle": "Dashboard 诊断 - 成功",
"overview_json": string(jsonData), // 将 []byte 转换为 string
})
}