126 lines
3.3 KiB
Go
126 lines
3.3 KiB
Go
|
|
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)
|
|||
|
|
}
|
|||
|
|
}
|