diff --git a/internal/controller/post_controller.go b/internal/controller/post_controller.go index 92485dc..ef3b406 100644 --- a/internal/controller/post_controller.go +++ b/internal/controller/post_controller.go @@ -135,147 +135,6 @@ func (ctrl *PostController) ShowPage(c *gin.Context) { })) } -// EditPage 编辑页面 -func (ctrl *PostController) EditPage(c *gin.Context) { - id, err := strconv.ParseUint(c.Param("id"), 10, 64) - if err != nil { - c.HTML(http.StatusNotFound, "posts/404.html", common.BuildPageData(c, gin.H{ - "Title": "未找到", - "ExtraCSS": "/static/css/posts.css", - })) - return - } - - post, err := ctrl.postService.GetByID(uint(id)) - if err != nil || post.Status == model.PostStatusPending || post.IsLocked { - c.HTML(http.StatusNotFound, "posts/404.html", common.BuildPageData(c, gin.H{ - "Title": "未找到或无法编辑", - "ExtraCSS": "/static/css/posts.css", - })) - return - } - - uid, role, _ := common.GetGinUser(c) - if !ctrl.postService.IsPostAccessible(uid, role, post.UserID) { - c.HTML(http.StatusNotFound, "posts/404.html", common.BuildPageData(c, gin.H{ - "Title": "未找到", - "ExtraCSS": "/static/css/posts.css", - })) - return - } - - // 已通过帖子有待审修订时,编辑页展示待审内容 - if post.PendingBody != "" { - post.Title = post.PendingTitle - post.Body = post.PendingBody - } - - c.HTML(http.StatusOK, "posts/new.html", common.BuildPageData(c, gin.H{ - "Title": "编辑帖子", - "Post": post, - "ExtraCSS": "/static/css/posts.css", - })) -} - -// Create API 发帖 -func (ctrl *PostController) Create(c *gin.Context) { - uid, _, ok := common.GetGinUser(c) - if !ok { - common.Error(c, http.StatusUnauthorized, "请先登录") - return - } - - var req model.PostCreateRequest - if err := c.ShouldBindJSON(&req); err != nil { - common.Error(c, http.StatusBadRequest, "标题和正文不能为空") - return - } - - post, err := ctrl.postService.Create(uid, req.Title, req.Body) - if err != nil { - common.Error(c, http.StatusInternalServerError, "发帖失败") - return - } - - common.OkWithMessage(c, post, "发布成功") -} - -// Update API 编辑帖子 -func (ctrl *PostController) Update(c *gin.Context) { - uid, role, ok := common.GetGinUser(c) - if !ok { - common.Error(c, http.StatusUnauthorized, "请先登录") - return - } - - id, err := strconv.ParseUint(c.Param("id"), 10, 64) - if err != nil { - common.Error(c, http.StatusBadRequest, "无效的帖子 ID") - return - } - - var req model.PostUpdateRequest - if err := c.ShouldBindJSON(&req); err != nil { - common.Error(c, http.StatusBadRequest, "标题和正文不能为空") - return - } - - if _, ok := ctrl.getPostAndCheckAccess(uint(id), c, uid, role); !ok { - return - } - - if err := ctrl.postService.Update(uint(id), req.Title, req.Body); err != nil { - if errors.Is(err, common.ErrPostCannotEdit) { - common.Error(c, http.StatusBadRequest, err.Error()) - } else { - common.Error(c, http.StatusInternalServerError, "编辑失败") - } - return - } - - common.OkMessage(c, "编辑成功") -} - -// Delete API 删除帖子 -func (ctrl *PostController) Delete(c *gin.Context) { - uid, role, ok := common.GetGinUser(c) - if !ok { - common.Error(c, http.StatusUnauthorized, "请先登录") - return - } - - id, err := strconv.ParseUint(c.Param("id"), 10, 64) - if err != nil { - common.Error(c, http.StatusBadRequest, "无效的帖子 ID") - return - } - - if _, ok := ctrl.getPostAndCheckAccess(uint(id), c, uid, role); !ok { - return - } - - if err := ctrl.postService.Delete(uint(id)); err != nil { - common.Error(c, http.StatusInternalServerError, "删除失败") - return - } - - common.OkMessage(c, "删除成功") -} - -// getPostAndCheckAccess 获取帖子并检查当前用户权限 -// 返回 (*model.Post, true) 表示通过;返回 (nil, false) 表示已写入错误响应 -func (ctrl *PostController) getPostAndCheckAccess(id uint, c *gin.Context, uid uint, role string) (*model.Post, bool) { - post, err := ctrl.postService.GetByID(id) - if err != nil { - common.Error(c, http.StatusNotFound, "帖子不存在") - return nil, false - } - if !ctrl.postService.IsPostAccessible(uid, role, post.UserID) { - common.Error(c, http.StatusForbidden, "无权操作此帖子") - return nil, false - } - return post, true -} // Submit API 提交审核 func (ctrl *PostController) Submit(c *gin.Context) { diff --git a/internal/router/api.go b/internal/router/api.go index d5688ee..c9cc151 100644 --- a/internal/router/api.go +++ b/internal/router/api.go @@ -57,9 +57,6 @@ func setupAPIRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) { postsAPI.Use(d.authMdw.Required()) postsAPI.Use(middleware.CSRF(cfg)) { - postsAPI.POST("", d.postCtrl.Create) - postsAPI.PUT("/:id", d.postCtrl.Update) - postsAPI.DELETE("/:id", d.postCtrl.Delete) postsAPI.POST("/:id/submit", d.postCtrl.Submit) postsAPI.POST("/upload-image", d.postCtrl.UploadImage) } diff --git a/internal/router/frontend.go b/internal/router/frontend.go index fb18f81..acc53a5 100644 --- a/internal/router/frontend.go +++ b/internal/router/frontend.go @@ -40,11 +40,10 @@ func setupFrontendRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) { // 帖子页面 pages.GET("/posts", d.postCtrl.ListPage) - pages.GET("/posts/new", d.authMdw.Required(), func(c *gin.Context) { - c.Redirect(http.StatusMovedPermanently, "/studio/write") - }) pages.GET("/posts/:id", d.postCtrl.ShowPage) - pages.GET("/posts/:id/edit", d.authMdw.Required(), d.postCtrl.EditPage) + pages.GET("/posts/:id/edit", d.authMdw.Required(), func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "/studio/write?id="+c.Param("id")) + }) // 创作中心(需登录) studioPages := pages.Group("/studio") diff --git a/templates/MetaLab-2026/html/posts/new.html b/templates/MetaLab-2026/html/posts/new.html deleted file mode 100644 index 904c16c..0000000 --- a/templates/MetaLab-2026/html/posts/new.html +++ /dev/null @@ -1,70 +0,0 @@ -{{template "layout/header.html" .}} -
- -{{template "layout/nav.html" .}} - -