fix: 修复编辑器代码块样式不一致 + 提交 HTML 保留格式 + 详情页布局优化

- 编辑器 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 显示,移除管理按钮
This commit is contained in:
2026-05-28 00:53:02 +08:00
parent ec8fa3eb56
commit 2917562bf0
4 changed files with 52 additions and 46 deletions

View File

@ -53,8 +53,14 @@ func (s *PostService) auditEnabled() bool {
return s.ss.IsAuditEnabled()
}
// renderMarkdown 将 Markdown 渲染为安全 HTMLGoldmark + 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)
}