Files
go_typecho/main.go
2026-02-13 10:53:54 +08:00

126 lines
3.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}
}