From dd5fac099f1cb488f8175b583c516af953c07006 Mon Sep 17 00:00:00 2001 From: fish Date: Wed, 11 Nov 2026 17:25:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=AD=E5=89=A7=20Description=20=E4=B8=8E=20?= =?UTF-8?q?SeoInfo.Description=20=E5=AD=98=E5=90=8C=E4=B8=80=E4=BB=BD?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 写入前先剥离历史/当前模板得到纯自定义, 再拼接当前模板 - 同一份 merged 值同时落 Playlet.Description 和 SeoInfo.Description - 重复保存通过 stripPlayletSeoAutoTemplate 保证不会堆叠 Co-Authored-By: Claude Opus 4.7 --- web/service/srv_playlet/playlet.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/web/service/srv_playlet/playlet.go b/web/service/srv_playlet/playlet.go index 70a4f59..9eb8f6e 100644 --- a/web/service/srv_playlet/playlet.go +++ b/web/service/srv_playlet/playlet.go @@ -1670,9 +1670,12 @@ func applyPlayletDescription(doc *playletmod.Playlet) { if autoDesc == "" { return } - // SeoInfo.Description 存纯自定义(用户没传时为空);Playlet.Description 存合并后的展示值。 - doc.SeoInfo.Description = stripPlayletSeoAutoTemplate(doc.SeoInfo.Description, autoDesc) - doc.Description = mergePlayletSeoDescription(doc.SeoInfo.Description, autoDesc) + // 先剥离历史模板,得到纯自定义,再拼接当前模板,同一份合并值同时写入 + // Playlet.Description 和 SeoInfo.Description,保证两个字段始终一致。 + custom := stripPlayletSeoAutoTemplate(doc.SeoInfo.Description, autoDesc) + merged := mergePlayletSeoDescription(custom, autoDesc) + doc.Description = merged + doc.SeoInfo.Description = merged } func applyPlayletDescriptionOnUpdate(exist *playletmod.Playlet, req *proto.PlayletUpdateReq, setDoc bson.M) { @@ -1704,11 +1707,12 @@ func applyPlayletDescriptionOnUpdate(exist *playletmod.Playlet, req *proto.Playl } } seo = normalizeSeoValue(seo) - // 剥离历史/当前版本的自动模板,仅保留纯自定义部分落到 SeoInfo.Description。 - seo.Description = stripPlayletSeoAutoTemplate(seo.Description, autoDesc) + // 先剥离历史/当前模板得到纯自定义,再拼接当前模板,同一份合并值写入两个字段。 + custom := stripPlayletSeoAutoTemplate(seo.Description, autoDesc) + merged := mergePlayletSeoDescription(custom, autoDesc) + seo.Description = merged setDoc["seoInfo"] = seo - // Playlet.Description = 自定义 + 自动模板,供前台 SEO 页面渲染。 - setDoc[playletmod.FN.Playlet.Description] = mergePlayletSeoDescription(seo.Description, autoDesc) + setDoc[playletmod.FN.Playlet.Description] = merged } func playletToWebResp(item *playletmod.Playlet, themeNameMap map[int64]string, tagNameMap map[int64]string, categoryId *int64) *proto.PlayletListResp {