增加配置文件

This commit is contained in:
2026-06-02 13:52:47 +08:00
parent 6117222625
commit aab3aeb5b2
31 changed files with 3326 additions and 198 deletions
+45 -90
View File
@@ -1,123 +1,78 @@
package main
import (
"log"
"strconv"
"log/slog"
"os"
"goblog/config"
"goblog/database"
"goblog/handlers"
"goblog/middleware"
"goblog/utils"
"goblog/models"
"goblog/routers"
"github.com/gin-gonic/gin"
)
func main() {
// 创建默认配置文件(如果不存在)
if err := config.CreateDefaultConfig(); err != nil {
slog.Error("创建默认配置文件失败", "error", err)
}
// 加载配置
cfg := config.Load()
// 设置 Gin 模式
gin.SetMode(cfg.Server.Mode)
// 初始化日志系统
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
}))
slog.SetDefault(logger)
slog.Info("启动博客系统",
"app", cfg.App.Name,
"theme", cfg.App.Theme,
"db_driver", cfg.Database.Driver,
"port", cfg.Server.Port,
)
// 初始化数据库
if err := database.Init(&cfg.Database); err != nil {
log.Fatal("数据库初始化失败:", err)
slog.Error("数据库初始化失败", "error", err)
os.Exit(1)
}
// 创建默认管理员
if err := database.CreateDefaultAdmin(); err != nil {
log.Fatal("创建默认管理员失败:", err)
slog.Error("创建默认管理员失败", "error", err)
os.Exit(1)
}
// 创建路由
// 从数据库读取主题设置,如果不存在则使用配置文件中的值
theme := cfg.App.Theme
var option models.Option
if err := database.DB.Where("name = ? AND user_id = ?", "theme", 0).First(&option).Error; err == nil {
theme = option.Value
slog.Info("从数据库加载主题", "theme", theme)
} else {
slog.Info("使用配置文件中的主题", "theme", theme)
}
// 创建路由引擎
r := gin.Default()
// 使用自定义的 TemplateRenderer
htmlRenderer := utils.LoadTemplates(cfg.App.Theme)
r.HTMLRender = htmlRenderer
// 配置模板渲染器
routers.SetupTemplates(r, theme)
// 静态文件
r.Static("/static", "./static")
// 后台管理(放在前面避免冲突)
r.Static("/admin/static", "./static/admin")
r.GET("/admin", func(c *gin.Context) {
c.File("./static/admin/index.html")
})
// 前端页面路由
r.GET("/", handlers.IndexView)
r.GET("/post/:slug", handlers.PostView)
r.GET("/page/:slug", handlers.PageView)
r.POST("/comment", handlers.SubmitComment)
// API 路由组
api := r.Group("/api")
{
// 公开 API(支持可选认证,以便管理员查看所有文章)
api.GET("/posts", middleware.OptionalAuth(), handlers.GetPosts)
api.GET("/posts/:id", middleware.OptionalAuth(), handlers.GetPost)
api.GET("/categories", handlers.GetCategories)
api.GET("/categories/:id", handlers.GetCategory)
api.GET("/tags", handlers.GetTags)
api.GET("/tags/:id", handlers.GetTag)
api.GET("/pages", handlers.GetPages)
api.GET("/pages/:id", handlers.GetPage)
api.GET("/comments", handlers.GetComments)
// 需要认证的 API
api.POST("/comments", middleware.OptionalAuth(), handlers.CreateComment)
// 用户认证
api.POST("/auth/login", handlers.Login)
api.POST("/auth/register", handlers.Register)
// 需要登录的 API
auth := api.Group("/")
auth.Use(middleware.JWTAuth())
{
auth.GET("/auth/me", handlers.GetCurrentUser)
auth.PUT("/auth/me", handlers.UpdateUser)
auth.PUT("/auth/password", handlers.ChangePassword)
}
// 管理员 API
admin := api.Group("/admin")
admin.Use(middleware.JWTAuth(), middleware.AdminRequired())
{
// 文章管理
admin.POST("/posts", handlers.CreatePost)
admin.PUT("/posts/:id", handlers.UpdatePost)
admin.DELETE("/posts/:id", handlers.DeletePost)
// 分类管理
admin.POST("/categories", handlers.CreateCategory)
admin.PUT("/categories/:id", handlers.UpdateCategory)
admin.DELETE("/categories/:id", handlers.DeleteCategory)
// 标签管理
admin.POST("/tags", handlers.CreateTag)
admin.PUT("/tags/:id", handlers.UpdateTag)
admin.DELETE("/tags/:id", handlers.DeleteTag)
// 页面管理
admin.POST("/pages", handlers.CreatePage)
admin.PUT("/pages/:id", handlers.UpdatePage)
admin.DELETE("/pages/:id", handlers.DeletePage)
// 评论管理
admin.GET("/admin/comments", handlers.GetComments)
admin.PUT("/comments/:id/approve", handlers.ApproveComment)
admin.PUT("/comments/:id/spam", handlers.MarkSpamComment)
admin.DELETE("/comments/:id", handlers.DeleteComment)
}
}
// 配置所有路由
routers.SetupRoutes(r, cfg)
// 启动服务器
port := ":" + strconv.Itoa(cfg.Server.Port)
log.Printf("服务器启动在 http://localhost%s", port)
port := routers.GetServerPort(cfg.Server.Port)
slog.Info("服务器启动成功", "port", port, "mode", cfg.Server.Mode)
if err := r.Run(port); err != nil {
log.Fatal("服务器启动失败:", err)
slog.Error("服务器启动失败", "error", err)
os.Exit(1)
}
}