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:
@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user