diff --git a/handlers/backend/auth.go b/handlers/backend/auth.go index 919db2a..ec535a7 100644 --- a/handlers/backend/auth.go +++ b/handlers/backend/auth.go @@ -235,3 +235,9 @@ func ChangePassword(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "密码修改成功"}) } + +// 判断是否为管理员 +func isAdmin(c *gin.Context) bool { + role, exists := c.Get("role") + return exists && role == "admin" +} diff --git a/handlers/backend/comment.go b/handlers/backend/comment.go index 683a905..1f64519 100644 --- a/handlers/backend/comment.go +++ b/handlers/backend/comment.go @@ -17,15 +17,15 @@ func GetComments(c *gin.Context) { postSlug := c.Query("post_slug") // 前台使用 slug status := c.Query("status") pageStr := c.DefaultQuery("page", "1") - pageSizeStr := c.DefaultQuery("page_size", "10") + pageSizeStr := c.DefaultQuery("page_size", "1000") // 解析分页参数 page := 1 - pageSize := 10 + pageSize := 1000 if p, err := strconv.Atoi(pageStr); err == nil && p > 0 { page = p } - if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 100 { + if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 1000 { pageSize = ps } diff --git a/handlers/backend/post.go b/handlers/backend/post.go index a73048b..c392716 100644 --- a/handlers/backend/post.go +++ b/handlers/backend/post.go @@ -371,9 +371,3 @@ func DeletePost(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "删除成功"}) } - -// 判断是否为管理员 -func isAdmin(c *gin.Context) bool { - role, exists := c.Get("role") - return exists && role == "admin" -} diff --git a/handlers/frontend/view.go b/handlers/frontend/view.go index bc7b42a..33c4672 100644 --- a/handlers/frontend/view.go +++ b/handlers/frontend/view.go @@ -129,6 +129,15 @@ func IndexView(c *gin.Context) { db.Order("is_top DESC, published_at DESC, created_at DESC"). Offset(offset).Limit(pageSize).Find(&posts) + // 如果摘要为空,则从内容中提取摘要 + for i := range posts { + if posts[i].Summary == "" && posts[i].Content != "" && len(posts[i].Content) > 120 { + posts[i].Summary = posts[i].Content[:120] + } else { + posts[i].Summary = posts[i].Content + } + } + totalPages := int(math.Ceil(float64(total) / float64(pageSize))) categories, tags, postCount, categoryCount, tagCount := loadSidebarData() siteName, siteDesc := loadSiteInfo(cfg) @@ -397,7 +406,6 @@ func SubmitComment(c *gin.Context) { return } - // 检查文章是否存在 // 检查文章是否存在 var post models.Post if err := database.DB.First(&post, req.PostID).Error; err != nil { diff --git a/routers/router.go b/routers/router.go index abceffc..1ec5f40 100644 --- a/routers/router.go +++ b/routers/router.go @@ -9,30 +9,19 @@ import ( ) const ( - staticPath = "/static" - adminStaticPath = "/admin/static" - adminPath = "/admin" - apiPrefix = "/api" + staticPath = "/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.JWTAuth(), backend.AdminView) + // 前台页面 + setupFrontendRoutes(r) + // 后台管理页面 + setupAdminPageRoutes(r) } // setupFrontendRoutes 前台页面(服务端渲染) @@ -41,12 +30,20 @@ func setupFrontendRoutes(r *gin.Engine) { r.GET("/post/:slug", frontend.PostView) r.GET("/page/:slug", frontend.PageView) r.GET("/search", frontend.SearchView) - + // 评论管理 r.GET("/posts/:postID/comments", frontend.ListComments) r.POST("/posts/:postID/comment", frontend.SubmitComment) r.GET("/logout", backend.WebLogout) } +// setupAdminPageRoutes 后台管理页面(服务端渲染) +func setupAdminPageRoutes(r *gin.Engine) { + r.GET(adminPath+"/login", backend.AdminLoginView) + r.GET(adminPath, middleware.JWTAuth(), backend.AdminView) + // API 路由 + setupAPIRoutes(r) +} + // setupAPIRoutes API 路由分组 func setupAPIRoutes(r *gin.Engine) { api := r.Group(apiPrefix) @@ -61,7 +58,7 @@ func setupAuthenticatedAPIRoutes(api *gin.RouterGroup) { auth := api.Group("/") auth.Use(middleware.JWTAuth()) - // 仪表盘公开统计数据(可选认证,登录后返回更多数据) + // 仪表盘公开统计数据 auth.GET("/dashboard/stats", backend.GetDashboardStats) // 当前用户信息 auth.GET("/auth/me", backend.GetCurrentUser) @@ -81,12 +78,9 @@ func setupAuthenticatedAPIRoutes(api *gin.RouterGroup) { // 评论管理(查看所有评论,需登录) 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) + auth.PUT("/comments/:id/approve", backend.ApproveComment) + auth.PUT("/comments/:id/spam", backend.MarkSpamComment) + auth.DELETE("/comments/:id", backend.DeleteComment) // Markdown 预览 auth.POST("/markdown/preview", backend.PreviewMarkdown) @@ -110,6 +104,8 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) { admin.DELETE("/categories/:id", backend.DeleteCategory) // 标签管理(写入) + admin.GET("/tags", backend.GetTags) + admin.POST("/tags", backend.CreateTag) admin.GET("/tags/:id", backend.GetTag) admin.PUT("/tags/:id", backend.UpdateTag) admin.DELETE("/tags/:id", backend.DeleteTag) @@ -117,15 +113,10 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) { // 页面管理(写入) admin.GET("/pages", backend.GetPages) admin.POST("/pages", backend.CreatePage) + admin.GET("/pages/:id", backend.GetPage) 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) @@ -137,13 +128,7 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) { 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) - // 主题管理(登录用户可切换主题、创建主题、编辑文件) - // 主题公开信息 admin.GET("/themes", backend.GetThemes) admin.GET("/theme", backend.GetCurrentTheme) admin.POST("/theme", backend.SwitchTheme) diff --git a/static/css/adminstyle.css b/static/css/admin.css similarity index 100% rename from static/css/adminstyle.css rename to static/css/admin.css diff --git a/static/js/admin.js b/static/js/admin.js index fed95bf..6cba735 100644 --- a/static/js/admin.js +++ b/static/js/admin.js @@ -746,15 +746,10 @@ async function loadPages() { } } -// 评论管理 API 基础路径(管理员走 admin 组,普通用户走 my 组) -function commentsAPIBase() { - return (currentUser && currentUser.role === 'admin') ? `${API_BASE}/admin` : `${API_BASE}/my`; -} - // 加载评论(postId 为空时加载全部) async function loadComments(postId = '') { try { - const url = postId ? `${commentsAPIBase()}/comments?post_id=${postId}` : `${commentsAPIBase()}/comments`; + const url = postId ? `${API_BASE}/comments?post_id=${postId}` : `${API_BASE}/comments`; const res = await fetch(url, { headers: getHeaders() }); const data = await res.json(); @@ -958,7 +953,7 @@ async function deletePage(id) { // 通过评论 async function approveComment(id) { - await fetch(`${commentsAPIBase()}/comments/${id}/approve`, { + await fetch(`${API_BASE}/comments/${id}/approve`, { method: 'PUT', headers: getHeaders() }); @@ -968,7 +963,7 @@ async function approveComment(id) { // 删除评论 async function deleteComment(id) { if (!confirm('确定要删除这条评论吗?')) return; - await fetch(`${commentsAPIBase()}/comments/${id}`, { + await fetch(`${API_BASE}/comments/${id}`, { method: 'DELETE', headers: getHeaders() }); diff --git a/templates/admin/index.html b/templates/admin/index.html index 81c3613..45c7066 100644 --- a/templates/admin/index.html +++ b/templates/admin/index.html @@ -5,7 +5,7 @@ 后台管理 - GoBlog - +
diff --git a/templates/admin/login.html b/templates/admin/login.html index 6d1b204..82e5c80 100644 --- a/templates/admin/login.html +++ b/templates/admin/login.html @@ -5,7 +5,7 @@ 登录 - GoBlog 后台管理 - +