导入确认 — 融合方案:步骤条骨架 + 映射/预览同屏(班级上下文内面板)
真实任务不变:教师导入更新后的名单 CSV(20 行、2 行学号重复、1 列表头改名):看清变化、处理冲突、原子生效、可回滚。步骤条保留事务心智模型(上传 → 映射预览 → 确认),映射编辑与冲突处理同屏即时更新(单页信息密度);不采用行级内联(C)——新增学生场景低频,内联弱化导入概念。
不可违反约束(§7.5,与 UX 无关、已冻结):parse 与 apply 分离;映射/迁移/验证在 apply 前可预览;apply 原子化;任一步失败不得留下半应用状态;可安全回滚到导入前状态;导入产生的 schema/data 变换可审计。呈现形态与 D1 一致——班级上下文内的引导面板,非独立全屏向导。
✓
融合目标形态
步骤条(上传 ✓ → 映射预览 → 确认)+ 映射与冲突同屏可改 + 预览即时更新 + 原子确认栏(含回滚说明)。
localhost:8765/class-302/students/import
✓上传文件
2映射与预览
3确认应用
students-v2.csv
20 行 · 18 新增 · 2 冲突 · 已应用映射 6 列
字段映射
CSV 表头 → 学生字段(点击下拉修改,预览即时更新)
student_id→✓
name→✓
gender→✓
height_cm→✓
score→✓
score→?
预览 20 行 · 红色 = 冲突 · 修改映射后即时更新
| 学号 | 姓名 | 性别 | 身高 | 成绩 | 状态 |
|---|---|---|---|---|---|
| STU011 | 学生下011 | 女 | 146 | 61.3 | 学号重复 |
| STU012 | 学生丌012 | 男 | 167 | 77.7 | 新增 |
| STU013 | 学生不013 | 女 | 147 | 75.4 | 新增 |
| STU014 | 学生与014 | 男 | 173 | 96.2 | 新增 |
| STU015 | 学生丏015 | 女 | 164 | 72.0 | 新增 |
| STU016 | 学生丐016 | 男 | 138 | 79.6 | 缺身高 |
步骤条 = 事务心智模型(A);同屏映射 + 冲突 + 预览 = 信息密度(B);呈现为班级上下文内面板 = 与 D1 导航一致。不采用 C(行级内联弱化导入,且新增学生场景低频)。
来自 A步骤条保留 parse/apply 分离的事务心智模型,一次只聚焦一类问题
来自 B映射编辑与冲突处理同屏、预览即时更新——减少往返
与 D1 一致班级上下文内引导面板,非独立全屏向导;C(行级内联)明确不采用
| 设计要点 | 说明 |
|---|---|
| 事务语义 | parse/apply 分离、apply 前预览、原子化、失败无半应用、可回滚、可审计——全部由 Rust application 层保证(§7.5),UI 只决定呈现与操作顺序 |
| 映射同屏 | CSV 表头 → 学生字段下拉;修改后预览即时更新;未映射列黄色警示 |
| 冲突处理 | 预览内红色标记(学号重复/缺字段);冲突处理在确认前完成,确认 = 一次原子事务 |
| schema/API 影响 | 无新 API;事务语义维持 Rust application 层现状 |
待验证(dogfood):
- 大文件(200 行)在单页预览的滚动体验
- 冲突处理的具体交互(覆盖/跳过/合并的选择呈现)