verify-activity-intro-field.md 4.3 KB

Activity intro 字段完整链路核验报告

核验时间:2026-10-24 核验人:Agnes 核验范围:cfc-frontend/pages/activity/create.vue + activity-detail.vue,后端 Entity/DTO/Migration,列表卡片与海报展示


A. intro 完整链路核验 ✅ 通过

A1. 创建/编辑页录入(create.vue)

节点 行号 状态
data.form.intro = '' L209 ✅
textarea v-model="form.intro" + maxlength="100" L110 ✅
loadDetail() 回填 `self.form.intro = d.intro ''`
buildPayload() 通过 Object.assign({}, this.form) 自动带出 intro L459 ✅

A2. 后端持久化链路

节点 文件:行号 状态
Entity Activity.java 有 private String intro L23 ✅
DTO ActivityDTO.java 有 private String intro L13 ✅
ActivityDTO.from() 映射 dto.setIntro(activity.getIntro()) L92 ✅
ActivityController create/update 接收 @RequestBody Activity,MyBatis-Plus 全字段持久化 L45/L57 ✅

A3. 列表卡片展示(index.vue)

节点 行号 状态
discover tab 卡片:`v-if="act.intro act.description"` 优先展示 intro
history tab 卡片:无 intro/description 展示(历史遗留,非本次引入) L189-212 ⚠️ 见 C 节备注

A4. 分享海报(activity-detail.vue + ActivityPoster.vue)

节点 行号 状态
detail.vue 海报 prop:`:intro="(activity && (activity.intro activity.description))
ActivityPoster.vue 定义 intro prop(String,默认 '') L75 ✅
ActivityPoster.vue _drawInfoCard canvas 绘制简介(仅当 plainIntro 非空时画) L457-464 ✅

结论:A 全链路已通。


B. 存量数据库 intro 列兜底 ✅ 通过

证据 内容
DatabaseInitializer.java L3118-3119 // 迁移388: activities表添加intro列 + ensureColumn("activities", "intro", "VARCHAR(200) DEFAULT NULL ...")
schema.sql L2134 intro VARCHAR(200) DEFAULT NULL COMMENT '活动简介(列表卡片展示)'
ensureColumn 实现(L4099附近) 自动忽略「列已存在」异常,幂等可重复执行

结论:存量 DB 已有 intro 列兜底,不会产生 Unknown column 报错。


C. 回归风险核验

C1. validate() 是否需要同步校验 intro

  • validate() (create.vue L443) 只校验 title / activityType / startTime,未校验 intro
  • 结论:无需校验。intro 是可选字段,不做必填校验是合理设计。

C2. intro 为空时是否表现正常(不会显示 undefined / 空行占位)

场景 处理逻辑 结论
index.vue 列表卡片 `v-if="act.intro
activity-detail.vue 海报 `(activity && (activity.intro
ActivityPoster.vue canvas if (plainIntro) 条件判断才绘制 ✅ 空字符串跳过
loadDetail() 回填 self.form.intro = d.intro \|\| '' ✅ 空值转为空字符串,不是 undefined

C3. 编辑旧活动时不填简介是否误清空已有简介

  • loadDetail() 回填 d.intro || '',旧活动有 intro 值时能正确回填到 form.intro
  • buildPayload() 通过 Object.assign({}, this.form) 整体拷贝,包括 intro
  • 关键检查:如果用户未修改 intro 字段,form.intro 保留原值,payload 会携带原值提交 → 不会清空
  • 结论:✅ 不会误清空

C4. 潜在遗留问题(非本次引入的回归)

  • index.vue history tab(L189-212):发现页卡片有 card-desc 展示 intro/description,但历史 tab 没有对应展示——这是 pre-existing 设计差异,与本次 intro 改动无关,不在本次核验范围内。

D. 编译验证 ✅ 通过

cd cfc-backend && mvn clean compile -q
  • 退出码:0
  • 无编译错误输出

最终结论

项 结论
A. intro 完整链路 ✅ 通过
B. 存量 intro 列兜底 ✅ 通过
C. 回归风险 ✅ 通过(history tab 展示差异为 pre-existing,非回归)
D. 后端编译 ✅ 通过

四项全绿,可以合入。