From 2917562bf0d118a761586e0b7527ab6dc969ce13 Mon Sep 17 00:00:00 2001 From: Victor_Jay Date: Thu, 28 May 2026 00:53:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E4=BB=A3=E7=A0=81=E5=9D=97=E6=A0=B7=E5=BC=8F=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=20+=20=E6=8F=90=E4=BA=A4=20HTML=20=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E6=A0=BC=E5=BC=8F=20+=20=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 编辑器 pre code 移除 wangEditor 内置 border,与预览区样式统一 - 代码块语言标签 padding 加大并用 !important 对抗 wangEditor 全局重置 - 编辑器 ::before 伪元素仅作降级方案,避免与 JS 注入的 .code-lang-label 冲突 - 编辑器 pre padding-top 统一为 36px,font-size/line-height 对齐预览区 - 提交改用 editor.getHtml(),后端 sanitizeHTML 替代 renderMarkdown,保留富文本格式 - 详情页 post-detail-header 覆盖 common.css sticky,固定在文章卡片内 - 详情页增加白色卡片背景、圆角、阴影和内边距 - 详情页添加代码块语言标签 JS 注入 - 详情页用户名移除括号 UID 显示,移除管理按钮 --- internal/service/post_service.go | 27 +++++------- templates/MetaLab-2026/html/posts/show.html | 17 +++++-- templates/MetaLab-2026/static/css/posts.css | 49 +++++++++++---------- templates/MetaLab-2026/static/js/editor.js | 5 ++- 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/internal/service/post_service.go b/internal/service/post_service.go index 13c6bb9..32cf005 100644 --- a/internal/service/post_service.go +++ b/internal/service/post_service.go @@ -53,8 +53,14 @@ func (s *PostService) auditEnabled() bool { return s.ss.IsAuditEnabled() } -// renderMarkdown 将 Markdown 渲染为安全 HTML(Goldmark + bluemonday 消毒) -func (s *PostService) renderMarkdown(body string) (string, error) { +// sanitizeHTML 对编辑器输出的 HTML 做安全消毒(bluemonday) +// 编辑器提交的是富文本 HTML,不再经过 Markdown 渲染 +func (s *PostService) sanitizeHTML(body string) string { + return ucgPolicy.Sanitize(body) +} + +// RenderMarkdown 对外暴露,用于预览(从纯文本 Markdown 渲染为 HTML) +func (s *PostService) RenderMarkdown(body string) (string, error) { var buf bytes.Buffer if err := s.md.Convert([]byte(body), &buf); err != nil { return "", err @@ -64,10 +70,7 @@ func (s *PostService) renderMarkdown(body string) (string, error) { // Create 创建帖子 func (s *PostService) Create(userID uint, title, body string) (*model.Post, error) { - bodyHTML, err := s.renderMarkdown(body) - if err != nil { - bodyHTML = body // 渲染失败降级使用纯文本 - } + bodyHTML := s.sanitizeHTML(body) status := model.PostStatusApproved if s.auditEnabled() { @@ -125,12 +128,7 @@ func (s *PostService) Update(postID uint, title, body string) error { post.Title = title post.Body = body - - bodyHTML, err := s.renderMarkdown(body) - if err != nil { - bodyHTML = body - } - post.BodyHTML = bodyHTML + post.BodyHTML = s.sanitizeHTML(body) // rejected 状态编辑后自动重置为 draft if post.Status == model.PostStatusRejected { @@ -214,8 +212,3 @@ func (s *PostService) Unlock(postID uint) error { func (s *PostService) Restore(postID uint) error { return s.repo.Restore(postID) } - -// RenderMarkdown 公开的 Markdown 渲染(供预览 API 使用,不写 DB) -func (s *PostService) RenderMarkdown(body string) (string, error) { - return s.renderMarkdown(body) -} diff --git a/templates/MetaLab-2026/html/posts/show.html b/templates/MetaLab-2026/html/posts/show.html index 885200a..5d537aa 100644 --- a/templates/MetaLab-2026/html/posts/show.html +++ b/templates/MetaLab-2026/html/posts/show.html @@ -8,7 +8,7 @@

{{.Post.Title}}

- + {{.Post.CreatedAt.Format "2006-01-02 15:04"}} {{if ne .Post.Status "approved"}} {{index $.StatusNames .Post.Status}} @@ -39,9 +39,6 @@ {{if and $.Post (eq $.Post.UserID $.UID) (or (eq $.Post.Status "draft") (eq $.Post.Status "rejected"))}} {{end}} - {{if $.CanAccessAdmin}} - 管理 - {{end}}
{{end}} @@ -51,6 +48,18 @@