# 可打印教学设计生成器设计方案

## 1. 建设目标

在现有 Vue 3 + TypeScript + Vite 项目中建设一个纯前端教学设计生成网站。用户一次上传多份 Markdown 教案后，网站将其解析为一整册可编辑、可打印的 A4 教学设计，并支持调整课次顺序、自动暂存和分别导出修改后的 Markdown 文件。

所有文件均在浏览器本地处理，不上传到服务器。

## 2. 输入材料与兼容范围

主要输入为 `data` 目录下的编号 Markdown 教案：

- `data/Web/1.md` 至 `data/Web/18.md`
- `data/Python/1.md` 至 `data/Python/18.md`
- `data/C#/1.md` 至 `data/C#/19.md`

标准教案通常包含：

1. 一级标题
2. 基本信息表
3. `## 教学过程`
4. 教学过程五列表格
5. `## 板书设计`
6. `## 教学成效与反思`
7. 教学成效与反思表

部分 C# 教案缺少板书、教学过程或反思章节。系统必须尽量解析这些文件，不因局部缺失拒绝整批导入。

## 3. 核心产品决策

- 采用左侧课次导航、右侧 A4 页面直接编辑的工作区。
- 上传后按文件名中的数字自然排序。
- 左侧列表支持拖拽调整课次顺序。
- 整册包含一张封面，不生成目录。
- 封面可编辑课程名称和教师姓名。
- 每份教案在打印时独立起页。
- 板书设计保留在教案中并参与打印。
- 编辑结果自动暂存在浏览器本地。
- 修改后的 Markdown 按原文件分别生成，并打包为 ZIP 下载。
- 格式不完整的文件仍然导入，缺失区域留空并显示警告。

## 4. 技术方案

采用结构化解析器和统一教案数据模型，而不是直接编辑 Markdown DOM。

技术栈：

- Vue 3
- TypeScript
- Vite
- 浏览器 File API
- 浏览器打印 API
- `localStorage` 或等价浏览器本地存储
- 用于生成 ZIP 的轻量前端库

系统不依赖后端、数据库或外部文件服务。

## 5. 系统架构

### 5.1 MarkdownParser

负责把单个 Markdown 文件解析为统一的 `TeachingDesign` 对象。

职责：

- 识别一级标题及课题名称。
- 解析基本信息表。
- 拆分知识目标、技能目标和素养目标。
- 拆分重点和难点。
- 解析教学过程表及每个教学环节的时间。
- 提取板书设计代码块或正文。
- 解析教学成效和教学反思。
- 保存无法归类的附加内容。
- 生成不阻断导入的解析警告。

### 5.2 TeachingDesign 数据模型

每个教案包含：

- 唯一标识
- 原文件名
- 当前排序位置
- 标题
- 课题
- 课时
- 知识目标
- 技能目标
- 素养目标
- 教学重点
- 教学难点
- 教学资源准备
- 教学过程环节数组
- 板书设计
- 教学成效
- 教学反思
- 附加内容
- 解析警告数组

每个教学环节包含：

- 教学环节名称
- 时间
- 教学内容
- 教师活动
- 学生活动
- 设计意图

### 5.3 Workspace

工作区由固定工具栏、课次侧栏和 A4 编辑区组成。

工具栏提供：

- 上传或追加 Markdown
- 打印整册
- 导出 Markdown ZIP
- 清空当前整册

课次侧栏提供：

- 封面入口
- 课次编号和课题摘要
- 拖拽排序
- 当前选中状态
- 每课解析警告状态

### 5.4 A4Editor

右侧仅展示封面或当前选中的一份教案。

编辑方式：

- 表格字段在 A4 页面内直接编辑。
- 教学过程支持增删环节。
- 板书设计使用适合多行文本的编辑区域。
- 缺失字段显示空白可编辑区域。
- 编辑状态只在屏幕上可见，打印时隐藏。

页面宽度按 A4 比例显示，并允许根据浏览器宽度缩放预览。

### 5.5 PrintBook

打印时渲染完整整册，而不是只打印当前选中教案。

规则：

- 第一页为封面。
- 每份教案从新页开始。
- 隐藏工具栏、侧栏、按钮、拖拽控件、警告和编辑边框。
- A4 页面使用统一页边距和中文字体栈。
- 教学过程表允许跨页。
- 跨页后重复教学过程表头。
- 单个教学环节行尽量避免拆分。
- 板书和反思标题避免与正文分离。

### 5.6 Storage

系统在内容、顺序或封面信息变化后自动暂存。

暂存内容包括：

- 封面课程名称
- 教师姓名
- 全部教案结构化数据
- 当前课次顺序
- 当前选中页面

重新打开页面时提示恢复最近一次未清空的整册。存储失败不得中断编辑。

### 5.7 MarkdownExporter

导出器把当前结构化数据重新生成规范 Markdown。

导出规则：

- 每份教案保留原文件名。
- ZIP 内文件顺序通过文件名和当前排序清单体现。
- 输出统一使用标准标题、基本信息表、教学过程表、板书设计和反思表结构。
- 保留加粗、行内代码、列表、换行和代码块等 Markdown 内容。
- 附加内容放在明确的附加章节，避免导入时无法识别的正文丢失。
- 不保证原文件空格、换行和表格对齐符完全不变。

## 6. 解析兼容规则

解析器需要兼容：

- LF 和 CRLF 换行。
- 全角和半角冒号。
- `1课时（40分钟）` 与 `1课时(40分钟)`。
- 不同长度的 Markdown 表格分隔符。
- `<br>`、`<br/>` 和 `<br />`。
- 带序号或不带序号的教学环节。
- `（6分钟）`、`(6分钟)` 等时间写法。
- 板书使用围栏代码块或普通段落。
- 缺失章节、空单元格和额外正文。

解析失败分为字段级警告，不将单个字段问题升级为整份文件失败。只有无法读取文件文本时，才把该文件标记为导入失败。

## 7. 用户流程

1. 用户在初始页拖入或选择多份 `.md` 文件。
2. 系统自然排序并批量解析文件。
3. 系统显示工作区及解析结果摘要。
4. 用户编辑封面课程名称和教师姓名。
5. 用户在左侧切换课次，直接编辑右侧 A4 页面。
6. 用户通过拖拽调整课次顺序。
7. 系统在每次修改后自动暂存。
8. 用户点击打印整册，浏览器打开打印界面。
9. 用户点击导出 Markdown，下载包含所有修改后文件的 ZIP。

用户可以追加文件。文件名冲突时必须提示用户选择替换或保留两份，不能静默覆盖。

## 8. 错误与状态反馈

系统应提供以下反馈：

- 文件格式不支持。
- 文件读取失败。
- 单份教案缺少章节或字段。
- 教学过程表列数异常。
- 暂存失败或空间不足。
- ZIP 生成失败。
- 当前没有可打印或可导出的教案。

错误提示不得清除已经成功解析或编辑的内容。

## 9. 视觉设计

整体采用克制的教学文档工具风格：

- 页面背景使用浅灰色，A4 纸张使用白色和轻阴影。
- 主色使用稳重的绿色，用于当前课次、按钮和章节标识。
- 正文优先使用系统中文无衬线字体。
- A4 标题可使用中文宋体类字体栈增强正式文档感。
- 编辑边框、警告和辅助提示只在屏幕模式显示。
- 移动端允许浏览和轻量编辑，但主要使用场景为桌面浏览器。

## 10. 测试策略

### 10.1 单元测试

覆盖：

- 数字文件名自然排序。
- 标准 Web 教案完整解析。
- Python 教案的半角标点和 CRLF 解析。
- C# 教案缺失章节时的容错处理。
- 教学目标和重难点拆分。
- 教学环节时间提取。
- Markdown 重新生成。
- 暂存序列化和恢复。

### 10.2 组件测试

覆盖：

- 批量上传。
- 课次切换。
- 页面内字段编辑。
- 教学环节增删。
- 拖拽排序。
- 警告展示。
- 封面编辑。
- ZIP 导出触发。

### 10.3 打印验证

使用浏览器打印预览人工检查：

- 封面独立一页。
- 每份教案独立起页。
- 控件全部隐藏。
- 长教学过程表跨页正常。
- 表头重复。
- 中文、代码和板书不溢出。

### 10.4 语料回归

批量导入仓库内全部编号教案，确认：

- Web 18 份均可解析。
- Python 18 份均可解析。
- C# 19 份均不会导致整批中断。
- 缺失章节会产生警告和空白编辑区。
- 导出后文件可再次导入。

## 11. 验收标准

- 可一次上传至少 20 份 Markdown 文件。
- 文件按数字自然排序，并可拖拽调整。
- 每份教案可在 A4 页面中直接编辑。
- 标准教案主要字段均能正确解析。
- 不完整教案可容错导入并显示警告。
- 板书设计可编辑且参与打印。
- 封面包含可编辑的课程名称和教师姓名。
- 自动暂存可恢复。
- 打印整册包含封面，且每份教案独立起页。
- 可下载包含全部修改后 Markdown 的 ZIP。
- 全部处理在浏览器本地完成。
