pages/discover/index.vue 或其 components,代码实际落地在 pages/activity/index.vue 的「发现活动」tab(getActivityList 接口 + 活动卡片),已按代码实际为准处理。| 文件 | 是否改动 | 说明 |
|---|---|---|
cfc-frontend/pages/activity/index.vue |
✅ 改动 | 两个 bug 的唯一文件 |
cfc-frontend/pages/activity/activity-detail/activity-detail.vue |
已确认无需改动 | 详情页用 <mp-html :content="activity.description"> 渲染富文本(见 line 108-110),本来就是富文本正确渲染路径,不受本次改动影响 |
cfc-frontend/pages/guide/activities/index.vue |
未改动(本次范围外) | 该页 act.description 同样直出,但属于规划师「活动管理」列表而非发现活动列表;如需处理可另行跟进 |
cfc-frontend/components/DimensionActivities.vue |
未改动 | 仅展示标题/时间/状态/价格,不展示正文富文本,无此问题 |
发现活动 tab 的卡片描述(pages/activity/index.vue 活动卡片模板)原来直接绑定后端返回的富文本字段:
<text class="card-desc" v-if="act.intro || act.description">{{ act.intro || act.description }}</text>
后端 description/intro 是富文本(含 <p>、<div>、<br>、 、' 等标签与实体),小程序 <text> 不会解析 HTML,于是标签与实体按字面显示。此前没有做任何纯文本化处理。
模板改为经 plainText() 处理后输出:
<text class="card-desc" v-if="act.intro || act.description">{{ plainText(act.intro || act.description) }}</text>
新增 plainText(html) 方法(与 repo 内 pages/mind-detail/articles.vue 的 stripHtml 实现口径保持一致并增强):
<style>/<script> 块,再去所有 HTML 标签; 、<、>、&、");' → '、📅 → 📅 等 &#x / &# 形式,用 String.fromCharCode);详情页无需改动:原本即用 <mp-html> 渲染富文本,保持正常。
页面数据加载链:
onLoad → loadData() → loadDiscoverActivities()(无 refresh 参数 → 非 replace 模式)
onShow(_onLoadFired 已消费)→ loadData() → loadDiscoverActivities()(同样无 refresh)
loadDiscoverActivities(refresh) 只在 refresh === true 时 discoverPage = 1; discoverActivities = [] 并整体替换,否则走 concat 追加。onShow 里调用 loadData() 又不带 refresh 参数:
discoverActivities 原封不动,discoverPage 保持当前值;concat,最终列表条目翻倍(同样活动重复出现一次)。即「页面重新可见(onShow)再次调用加载,但没有重置页码或清空列表」。
pages/activity/index.vue)loadData 增加 refresh 形参并透传给 loadMyActivities/loadDiscoverActivities/loadHistoryActivities;manage 分支本身是全量替换,不需要该参数。onShow 的 else 分支改传 this.loadData(true)——从子页返回时按「下拉刷新」语义重置(page=1、列表清空、整体替换),首页分支仍保持 loadData()(首次列表为空,语义不变)。loadXxxActivities 各自维护请求序号 _mineReqSeq / _discoverReqSeq / _historyReqSeq,then/catch 里校验序号,过期响应直接丢弃,不做 concat;load* 改为 return promise,未登录等早退路径返回 Promise.resolve()——原来它们返回 undefined,而 onRefresh 依赖 .finally() 复位 isRefreshing,缺返回会让下拉刷新卡死。onLoadMore):仍走「翻页 + concat」路径,未改;序号机制只丢弃过期响应,不影响正常追加。onRefresh):仍走 refresh=true 重置语义;因 load* 补齐 promise 返回,.finally 行为比修复前更可靠(不再有 undefined.finally 运行时报错导致 isRefreshing 卡在 true 的隐患)。onTabChange)/筛选(onMineFilterChange/onDimensionChange)/switchToDiscover:原本就手动重置列表+页码后调用,不受影响。onLoad 仍是 loadData(),无重复请求;_onLoadFired 双发防护逻辑不变。currentChildId 为空):改为返回 resolved promise,行为与原来直接 return 一致,仅多一个 promise 让 .finally 可复用。p / div / br / / ' 等字面量,只显示纯文本(含中文标点、emoji 等数字实体被正确解码)。用一条已知含富文本正文的活动核对。description 仍以 mp-html 富文本渲染(加粗/换行/图片不丢),未被改动破坏。loadMyActivities(true);切维度筛选;switchToDiscover 空态按钮跳转,均保持原行为。