From 53b40f8fad818182581f2573f115fec155f2c793 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Thu, 1 Oct 2026 09:04:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(distribution):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=86=E7=AB=99=E8=B7=91=E9=A9=AC=E7=81=AF=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E6=8A=8A=E9=85=8D=E7=BD=AE=20JSON=20=E5=8E=9F=E6=96=87?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 分销站公告存在 distribution_sites.announcements_json 的是 { title, content } 对象数组 (分销后台品牌装修写入),而前台跑马灯组件按字符串数组渲染。Vue 对对象会做 JSON.stringify,配合 no-wrap 样式,前台就显示成 {"title":"天域商行专注AWM子弹回收、高比例!不排队!秒结算!","content":""}。 - 新增 shared/utils/announcements.ts:把公告条目归一化为展示文本,兼容纯文本、 { title, content } 对象,以及被字符串化的对象(历史脏数据)与标题为空回退内容 - distributionSite store 解析 announcements_json 时归一化,跑马灯组件内部再兜底一次 - 首页配置 mergeHomeConfig 同样接受对象形态,主站/移动端公告入口口径统一 - 分销后台装修预览的跑马灯示例按同一口径取值(只有内容时不再空白) - 补 9 条单测覆盖对象、字符串化对象、普通花括号文案、混排去重与空输入 --- distribution-admin/src/pages/SiteSettings.tsx | 2 +- .../src/features/listings/api/homeConfig.ts | 7 +- .../listings/components/HomeAnnouncement.vue | 12 ++- .../utils/__tests__/announcements.spec.ts | 73 +++++++++++++++++++ frontend/src/shared/utils/announcements.ts | 62 ++++++++++++++++ frontend/src/stores/distributionSite.ts | 5 +- 6 files changed, 152 insertions(+), 9 deletions(-) create mode 100644 frontend/src/shared/utils/__tests__/announcements.spec.ts create mode 100644 frontend/src/shared/utils/announcements.ts diff --git a/distribution-admin/src/pages/SiteSettings.tsx b/distribution-admin/src/pages/SiteSettings.tsx index efdb296..9a54231 100644 --- a/distribution-admin/src/pages/SiteSettings.tsx +++ b/distribution-admin/src/pages/SiteSettings.tsx @@ -1149,7 +1149,7 @@ export default function SiteSettings() { > - {announcements[0]?.title} + {announcements[0]?.title || announcements[0]?.content} )} diff --git a/frontend/src/features/listings/api/homeConfig.ts b/frontend/src/features/listings/api/homeConfig.ts index a08c724..6050163 100644 --- a/frontend/src/features/listings/api/homeConfig.ts +++ b/frontend/src/features/listings/api/homeConfig.ts @@ -1,5 +1,6 @@ import { apiClient } from '@/shared/api/client' import type { ApiResponse } from '@/shared/types/types' +import { normalizeAnnouncements } from '@/shared/utils/announcements' import { mergeListingPublishOptions, type ListingPublishOptions } from './listingOptions' export interface HomeBannerSlide { @@ -86,10 +87,8 @@ export async function fetchMobileHomeConfig() { } export function mergeHomeConfig(config?: Partial): MobileHomeConfig { - const announcements = - config?.announcements - ?.map(item => (typeof item === 'string' ? item.trim() : '')) - .filter(Boolean) || [] + // 公告可能是纯文本,也可能是 { title, content } 对象(分销站装修口径),统一归一化。 + const announcements = normalizeAnnouncements(config?.announcements) const banners = config?.banners ?.map(item => { diff --git a/frontend/src/features/listings/components/HomeAnnouncement.vue b/frontend/src/features/listings/components/HomeAnnouncement.vue index d03d27d..0d04dd1 100644 --- a/frontend/src/features/listings/components/HomeAnnouncement.vue +++ b/frontend/src/features/listings/components/HomeAnnouncement.vue @@ -1,11 +1,17 @@