Files
go_typecho/routers/router.go
T

182 lines
5.6 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.POST("/comment", frontend.SubmitComment) // 前台提交评论(公开)
r.GET("/logout", backend.WebLogout) // 前台退出登录
}
// setupAPIRoutes 配置所有 /api 下的接口路由
func setupAPIRoutes(r *gin.Engine) {
api := r.Group(apiPrefix)
// 公开接口:无需认证或可选认证
setupPublicAPIRoutes(api)
// 需要认证的接口(JWT)
setupAuthenticatedAPIRoutes(api)
// 管理员专属接口(JWT + 管理员角色)
setupAdminAPIRoutes(api)
}
// setupPublicAPIRoutes 配置公开 API(无需认证或可选认证)
func setupPublicAPIRoutes(api *gin.RouterGroup) {
// 文章
api.GET("/posts", middleware.OptionalAuth(), backend.GetPosts)
api.GET("/posts/:id", middleware.OptionalAuth(), backend.GetPost)
// 分类
api.GET("/categories", backend.GetCategories)
api.GET("/categories/:id", backend.GetCategory)
// 标签
api.GET("/tags", backend.GetTags)
api.GET("/tags/:id", backend.GetTag)
// 页面
api.GET("/pages", backend.GetPages)
api.GET("/pages/:id", backend.GetPage)
// 评论列表(公开,仅显示已批准评论)
api.GET("/comments", backend.GetComments)
// 创建评论(可选认证,若登录则关联用户)
api.POST("/comments", middleware.OptionalAuth(), backend.CreateComment)
// 登录(公开)
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 配置需要登录的 API(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.POST("/posts", backend.CreatePost)
auth.PUT("/posts/:id", backend.UpdatePost)
auth.DELETE("/posts/:id", backend.DeletePost)
// Markdown 预览
auth.POST("/markdown/preview", backend.PreviewMarkdown)
// 文件上传
auth.POST("/upload", backend.UploadImage)
// 我的评论管理(管理自己文章下的评论)
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)
// 主题管理(认证用户可切换主题、创建主题、编辑主题文件)
themeAuth := auth.Group("/")
{
themeAuth.POST("/theme", backend.SwitchTheme)
themeAuth.POST("/themes/create", backend.CreateTheme)
themeAuth.GET("/themes/:theme/files", backend.GetThemeFiles)
themeAuth.GET("/themes/:theme/files/:file", backend.GetThemeFile)
themeAuth.PUT("/themes/:theme/files/:file", backend.SaveThemeFile)
}
}
// setupAdminAPIRoutes 配置管理员专属 API(需要登录 + 管理员角色)
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/:name", backend.DeleteUpload)
}