package routers import ( "strconv" "goblog/handlers/backend" "goblog/handlers/frontend" "goblog/middleware" "goblog/utils" "github.com/gin-gonic/gin" ) // SetupRoutes 配置所有路由 func SetupRoutes(r *gin.Engine) { // 静态文件 r.Static("/static", "./static") // 后台管理(放在前面避免冲突) r.Static("/admin/static", "./static/admin") // 独立登录页 r.GET("/admin/login", backend.AdminLoginView) // 后台首页:可选认证中间件注入用户信息,服务端按角色渲染菜单与页面框架 r.GET("/admin", middleware.OptionalAuth(), backend.AdminView) // 前端页面路由(可选认证:侧边栏根据登录态显示系统菜单) 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) // 前台退出登录:清除 Cookie 后回首页 r.GET("/logout", backend.WebLogout) // API 路由组 api := r.Group("/api") { // 公开 API(支持可选认证,以便管理员查看所有文章) api.GET("/posts", middleware.OptionalAuth(), backend.GetPosts) api.GET("/dashboard/stats", middleware.OptionalAuth(), backend.GetDashboardStats) 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 api.POST("/comments", middleware.OptionalAuth(), backend.CreateComment) // 用户认证 api.POST("/auth/login", backend.Login) api.POST("/auth/logout", backend.Logout) // 需要登录的 API auth := api.Group("/") auth.Use(middleware.JWTAuth()) { auth.GET("/auth/me", backend.GetCurrentUser) // 仪表盘统计(所有登录用户可访问,handler 内部按角色过滤数据) auth.GET("/dashboard", middleware.OptionalAuth(), backend.GetDashboardStats) auth.PUT("/auth/me", backend.UpdateUser) auth.PUT("/auth/password", backend.ChangePassword) // 文章管理(所有登录用户可新建文章,修改/删除自己的文章) 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) } // 主题管理(可选认证) api.GET("/themes", backend.GetThemes) api.GET("/theme", backend.GetCurrentTheme) api.POST("/theme", middleware.JWTAuth(), backend.SwitchTheme) api.POST("/themes/create", middleware.JWTAuth(), backend.CreateTheme) api.GET("/themes/:theme/files", middleware.JWTAuth(), backend.GetThemeFiles) api.GET("/themes/:theme/files/:file", middleware.JWTAuth(), backend.GetThemeFile) api.PUT("/themes/:theme/files/:file", middleware.JWTAuth(), backend.SaveThemeFile) // 管理员 API admin := api.Group("/admin") admin.Use(middleware.JWTAuth(), middleware.AdminRequired()) { // Markdown 预览(文章编辑器用)已移至登录组 // 分类管理 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) } } } // SetupTemplates 配置模板渲染器 func SetupTemplates(r *gin.Engine, theme string) { htmlRenderer := utils.LoadTemplates(theme) utils.SetGlobalRenderer(htmlRenderer) r.HTMLRender = htmlRenderer } // GetServerPort 获取服务器端口 func GetServerPort(port int) string { return ":" + strconv.Itoa(port) }