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
最终结论
| 项 |
结论 |
| A. intro 完整链路 |
✅ 通过 |
| B. 存量 intro 列兜底 |
✅ 通过 |
| C. 回归风险 |
✅ 通过(history tab 展示差异为 pre-existing,非回归) |
| D. 后端编译 |
✅ 通过 |
四项全绿,可以合入。