package main import ( "log" "strconv" "goblog/config" "goblog/database" "goblog/handlers" "goblog/middleware" "github.com/gin-gonic/gin" ) func main() { // 加载配置 cfg := config.Load() // 设置 Gin 模式 gin.SetMode(cfg.Server.Mode) // 初始化数据库 if err := database.Init(&cfg.Database); err != nil { log.Fatal("数据库初始化失败:", err) } // 创建默认管理员 if err := database.CreateDefaultAdmin(); err != nil { log.Fatal("创建默认管理员失败:", err) } // 创建路由 r := gin.Default() // 初始化模板 tmpl, err := handlers.InitTemplates(cfg.App.Theme) if err != nil { log.Fatal("模板初始化失败:", err) } r.SetHTMLTemplate(tmpl) // 静态文件 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) } } // 启动服务器 port := ":" + strconv.Itoa(cfg.Server.Port) log.Printf("服务器启动在 http://localhost%s", port) if err := r.Run(port); err != nil { log.Fatal("服务器启动失败:", err) } }