package main import ( "go_blog/config" "go_blog/models" "go_blog/routers" "log/slog" "os" "time" "go_blog/themes" "gorm.io/gorm" "github.com/gin-gonic/gin" ) // @title 个人博客系统API // @version 1.0 // @description 基于Go语言的可定制主题博客系统 const templatePath = "./templates/*" func main() { //读取配置文件 // 1. 初始化配置 conf, err := config.LoadConfig("config.yml") if err != nil { slog.Error("配置加载失败", "error", err) os.Exit(1) } // 2. 初始化日志系统 // if err := logger.Initialize(cfg.Log); err != nil { // slog.Error("日志初始化失败", "error", err) // os.Exit(1) // } // defer logger.Flush() logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) slog.SetDefault(logger) // 3. 初始化数据库 models.InitDatabase(conf) sqlDB, _ := models.DB.DB() defer func() { if err := sqlDB.Close(); err != nil { slog.Error("数据库关闭异常", "error", err) } }() // 4. 初始化主题系统 themeManager := themes.NewManager("web\\themes") if err := themeManager.LoadTheme(conf.Theme.Current); err != nil { slog.Error("主题系统初始化失败", "error", err) os.Exit(1) } // 5. 创建Gin实例 // 根据环境设置Gin模式 if conf.Env == config.EnvProduction { gin.SetMode(gin.ReleaseMode) } router := gin.Default() router.LoadHTMLGlob(templatePath) themeManager.RegisterStaticRoutes(router) // 6. 注册中间件 router.Use( loggerMiddleware(), gin.Logger(), gin.Recovery(), databaseMiddleware(models.DB), //configMiddleware(cfg), themeMiddleware(themeManager), ) // 7. 设置模板路径 //router.HTMLRender = createTemplateRenderer(cfg.Theme.Current) // 8. 注册路由 routers.RegisterRoutes(router) // 9. 启动服务 router.Run(":" + conf.Server.Port) } // 自定义模板渲染器 // func createTemplateRenderer(currentTheme string) gin.HTMLRender { // return gin.HTMLTemplates{ // Root: "web/templates", // Extension: ".html", // FuncMap: template.FuncMap{ // "safe": func(s string) template.HTML { return template.HTML(s) }, // }, // Directory: "web/themes/" + currentTheme, // } // } // 数据库中间件 func databaseMiddleware(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Set("DB", db) c.Next() } } // 配置上下文中间件 func configMiddleware(cfg *config.Config) gin.HandlerFunc { return func(c *gin.Context) { c.Set("Config", cfg) c.Next() } } // 主题管理器中间件 func themeMiddleware(manager *themes.ThemeManager) gin.HandlerFunc { return func(c *gin.Context) { c.Set("ThemeManager", manager) c.Next() } } func loggerMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() duration := time.Since(start) slog.Info("请求处理完成", "status", c.Writer.Status(), "method", c.Request.Method, "path", c.Request.URL.Path, "duration", duration, ) } }