2023-12-20 16:50:05 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
2024-01-10 16:05:15 +08:00
|
|
|
|
import (
|
2025-04-15 16:47:00 +08:00
|
|
|
|
"go_blog/config"
|
2024-01-10 16:05:15 +08:00
|
|
|
|
"go_blog/models"
|
2025-04-09 16:56:05 +08:00
|
|
|
|
"go_blog/routers"
|
2025-07-12 15:56:36 +08:00
|
|
|
|
"go_blog/utils"
|
2025-05-21 20:38:25 +08:00
|
|
|
|
"log/slog"
|
|
|
|
|
|
"os"
|
|
|
|
|
|
"time"
|
2024-01-10 16:05:15 +08:00
|
|
|
|
|
2025-04-09 16:56:05 +08:00
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
|
|
2025-06-13 08:59:01 +08:00
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
|
|
|
|
"github.com/gin-contrib/sessions/cookie"
|
2024-01-10 16:05:15 +08:00
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-06-13 08:59:01 +08:00
|
|
|
|
// @title 个人博客系统
|
2025-05-21 20:38:25 +08:00
|
|
|
|
// @version 1.0
|
|
|
|
|
|
// @description 基于Go语言的可定制主题博客系统
|
2023-12-20 16:50:05 +08:00
|
|
|
|
func main() {
|
2025-05-21 20:38:25 +08:00
|
|
|
|
// 1. 初始化配置
|
2025-04-15 16:47:00 +08:00
|
|
|
|
conf, err := config.LoadConfig("config.yml")
|
|
|
|
|
|
if err != nil {
|
2025-05-21 20:38:25 +08:00
|
|
|
|
slog.Error("配置加载失败", "error", err)
|
|
|
|
|
|
os.Exit(1)
|
2025-04-15 16:47:00 +08:00
|
|
|
|
}
|
2025-06-13 08:59:01 +08:00
|
|
|
|
slog.Info("配置加载成功", "config", conf)
|
2025-05-21 20:38:25 +08:00
|
|
|
|
// 2. 初始化日志系统
|
|
|
|
|
|
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
|
|
|
|
|
|
slog.SetDefault(logger)
|
2025-06-13 08:59:01 +08:00
|
|
|
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
2025-09-18 17:58:19 +08:00
|
|
|
|
slog.Info("初始化日志系统成功", "Defaultlogger", logger, "LogLevel", slog.LevelDebug)
|
2025-05-21 20:38:25 +08:00
|
|
|
|
|
|
|
|
|
|
// 3. 初始化数据库
|
|
|
|
|
|
models.InitDatabase(conf)
|
2025-05-22 13:56:57 +08:00
|
|
|
|
sqlDB, _ := models.DB.DB()
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if err := sqlDB.Close(); err != nil {
|
|
|
|
|
|
slog.Error("数据库关闭异常", "error", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
2025-05-21 20:38:25 +08:00
|
|
|
|
// 4. 初始化主题系统
|
2025-07-12 15:56:36 +08:00
|
|
|
|
themeManager := utils.NewManager("web\\themes")
|
2025-05-21 20:38:25 +08:00
|
|
|
|
if err := themeManager.LoadTheme(conf.Theme.Current); err != nil {
|
|
|
|
|
|
slog.Error("主题系统初始化失败", "error", err)
|
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
|
}
|
2025-04-09 16:56:05 +08:00
|
|
|
|
|
|
|
|
|
|
// 5. 创建Gin实例
|
2025-05-21 20:38:25 +08:00
|
|
|
|
// 根据环境设置Gin模式
|
|
|
|
|
|
if conf.Env == config.EnvProduction {
|
|
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
|
|
|
|
}
|
2025-04-09 16:56:05 +08:00
|
|
|
|
router := gin.Default()
|
2025-05-21 20:38:25 +08:00
|
|
|
|
themeManager.RegisterStaticRoutes(router)
|
2025-04-09 16:56:05 +08:00
|
|
|
|
|
2025-06-13 08:59:01 +08:00
|
|
|
|
// 初始化Session存储(使用Cookie)
|
|
|
|
|
|
store := cookie.NewStore([]byte("your-session-secret")) // 建议从配置文件读取密钥
|
|
|
|
|
|
store.Options(sessions.Options{
|
|
|
|
|
|
Path: "/",
|
|
|
|
|
|
MaxAge: 86400 * 7, // 7天
|
|
|
|
|
|
HttpOnly: true,
|
|
|
|
|
|
})
|
2025-04-09 16:56:05 +08:00
|
|
|
|
// 6. 注册中间件
|
|
|
|
|
|
router.Use(
|
2025-05-21 20:38:25 +08:00
|
|
|
|
loggerMiddleware(),
|
2025-04-09 16:56:05 +08:00
|
|
|
|
gin.Logger(),
|
|
|
|
|
|
gin.Recovery(),
|
|
|
|
|
|
databaseMiddleware(models.DB),
|
2025-06-24 19:34:39 +08:00
|
|
|
|
configMiddleware(conf),
|
2025-04-09 16:56:05 +08:00
|
|
|
|
themeMiddleware(themeManager),
|
2025-06-13 08:59:01 +08:00
|
|
|
|
sessions.Sessions("blog-session", store),
|
2025-04-09 16:56:05 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 8. 注册路由
|
|
|
|
|
|
routers.RegisterRoutes(router)
|
2025-06-13 08:59:01 +08:00
|
|
|
|
|
2025-04-09 16:56:05 +08:00
|
|
|
|
// 9. 启动服务
|
2025-05-21 20:38:25 +08:00
|
|
|
|
router.Run(":" + conf.Server.Port)
|
2025-04-09 16:56:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 数据库中间件
|
|
|
|
|
|
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()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 主题管理器中间件
|
2025-07-12 15:56:36 +08:00
|
|
|
|
func themeMiddleware(manager *utils.ThemeManager) gin.HandlerFunc {
|
2025-04-09 16:56:05 +08:00
|
|
|
|
return func(c *gin.Context) {
|
|
|
|
|
|
c.Set("ThemeManager", manager)
|
|
|
|
|
|
c.Next()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-21 20:38:25 +08:00
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|