Files
go_typecho/routers/router.go
T

169 lines
5.5 KiB
Go
Raw 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 routers
import (
"goblog/handlers/backend"
"goblog/handlers/frontend"
"goblog/middleware"
"github.com/gin-gonic/gin"
)
const (
staticPath = "/static"
adminStaticPath = "/admin/static"
adminPath = "/admin"
apiPrefix = "/api"
)
// SetupRoutes 配置所有路由
func SetupRoutes(r *gin.Engine) {
setupStaticRoutes(r)
setupAdminPageRoutes(r)
setupFrontendRoutes(r)
setupAPIRoutes(r)
}
// setupStaticRoutes 静态资源
func setupStaticRoutes(r *gin.Engine) {
r.Static(staticPath, "./static")
r.Static(adminStaticPath, "./static/admin")
}
// setupAdminPageRoutes 后台管理页面(服务端渲染)
func setupAdminPageRoutes(r *gin.Engine) {
r.GET(adminPath+"/login", backend.AdminLoginView)
r.GET(adminPath, middleware.OptionalAuth(), backend.AdminView)
}
// setupFrontendRoutes 前台页面(服务端渲染)
func setupFrontendRoutes(r *gin.Engine) {
r.GET("/", middleware.OptionalAuth(), frontend.IndexView)
r.GET("/post/:slug", middleware.OptionalAuth(), frontend.PostView)
r.GET("/page/:slug", middleware.OptionalAuth(), frontend.PageView)
r.GET("/search", middleware.OptionalAuth(), frontend.SearchView)
r.GET("/posts/:postID/comments", frontend.ListComments)
r.POST("/posts/:postID/comment", frontend.SubmitComment)
r.GET("/logout", backend.WebLogout)
}
// setupAPIRoutes API 路由分组
func setupAPIRoutes(r *gin.Engine) {
api := r.Group(apiPrefix)
setupPublicAPIRoutes(api) // 公开接口
setupAuthenticatedAPIRoutes(api) // 需要 JWT 的接口
setupAdminAPIRoutes(api) // 管理员专属接口
}
// setupPublicAPIRoutes 公开 API(无需登录)
func setupPublicAPIRoutes(api *gin.RouterGroup) {
// 登录
api.POST("/auth/login", backend.Login)
// 仪表盘公开统计数据(可选认证,登录后返回更多数据)
api.GET("/dashboard/stats", middleware.OptionalAuth(), backend.GetDashboardStats)
// 主题公开信息
api.GET("/themes", backend.GetThemes)
api.GET("/theme", backend.GetCurrentTheme)
}
// setupAuthenticatedAPIRoutes 需要 JWT 的接口(所有登录用户)
func setupAuthenticatedAPIRoutes(api *gin.RouterGroup) {
auth := api.Group("/")
auth.Use(middleware.JWTAuth())
// 当前用户信息
auth.GET("/auth/me", backend.GetCurrentUser)
auth.PUT("/auth/me", backend.UpdateUser)
auth.PUT("/auth/password", backend.ChangePassword)
auth.POST("/auth/logout", backend.Logout)
// 文章管理(读取 + 写入)
auth.GET("/posts", backend.GetPosts)
auth.GET("/posts/:id", backend.GetPost)
auth.POST("/posts", backend.CreatePost)
auth.PUT("/posts/:id", backend.UpdatePost)
auth.DELETE("/posts/:id", backend.DeletePost)
// 分类读取(写入在管理员组)
auth.GET("/categories", backend.GetCategories)
auth.GET("/categories/:id", backend.GetCategory)
// 标签读取(写入在管理员组)
auth.GET("/tags", backend.GetTags)
auth.GET("/tags/:id", backend.GetTag)
// 页面读取(写入在管理员组)
auth.GET("/pages", backend.GetPages)
auth.GET("/pages/:id", backend.GetPage)
// 评论管理(查看所有评论,需登录)
auth.GET("/comments", backend.GetComments)
// 我的评论管理(用户自己文章下的评论)
auth.GET("/my/comments", backend.GetComments)
auth.PUT("/my/comments/:id/approve", backend.ApproveComment)
auth.PUT("/my/comments/:id/spam", backend.MarkSpamComment)
auth.DELETE("/my/comments/:id", backend.DeleteComment)
// Markdown 预览
auth.POST("/markdown/preview", backend.PreviewMarkdown)
// 文件上传
auth.POST("/upload", backend.UploadImage)
auth.GET("/uploads", backend.ListUploads)
auth.DELETE("/uploads/:id", backend.DeleteUpload)
// 主题管理(登录用户可切换主题、创建主题、编辑文件)
auth.POST("/theme", backend.SwitchTheme)
auth.POST("/themes/create", backend.CreateTheme)
auth.GET("/themes/:theme/files", backend.GetThemeFiles)
auth.GET("/themes/:theme/files/:file", backend.GetThemeFile)
auth.PUT("/themes/:theme/files/:file", backend.SaveThemeFile)
}
// setupAdminAPIRoutes 管理员专属接口(JWT + AdminRequired)
func setupAdminAPIRoutes(api *gin.RouterGroup) {
admin := api.Group("/admin")
admin.Use(middleware.JWTAuth(), middleware.AdminRequired())
// 分类管理(写入)
admin.POST("/categories", backend.CreateCategory)
admin.PUT("/categories/:id", backend.UpdateCategory)
admin.DELETE("/categories/:id", backend.DeleteCategory)
// 标签管理(写入)
admin.POST("/tags", backend.CreateTag)
admin.PUT("/tags/:id", backend.UpdateTag)
admin.DELETE("/tags/:id", backend.DeleteTag)
// 页面管理(写入)
admin.POST("/pages", backend.CreatePage)
admin.PUT("/pages/:id", backend.UpdatePage)
admin.DELETE("/pages/:id", backend.DeletePage)
// 评论管理(所有评论,写入 + 删除)
admin.GET("/comments", backend.GetComments) // 管理员可查看所有评论
admin.PUT("/comments/:id/approve", backend.ApproveComment)
admin.PUT("/comments/:id/spam", backend.MarkSpamComment)
admin.DELETE("/comments/:id", backend.DeleteComment)
// 用户管理
admin.GET("/users", backend.GetUsers)
admin.POST("/users", backend.CreateUser)
admin.PUT("/users/:id", backend.AdminUpdateUser)
admin.PUT("/users/:id/password", backend.AdminResetPassword)
admin.DELETE("/users/:id", backend.DeleteUser)
// 基础设置
admin.GET("/settings", backend.GetSettings)
admin.PUT("/settings", backend.UpdateSettings)
// 文件管理
admin.POST("/upload", backend.UploadImage) // 管理员上传(也可在认证组)
admin.GET("/uploads", backend.ListUploads)
admin.DELETE("/uploads/:id", backend.DeleteUpload)
}