diff --git a/README.md b/README.md index 12164fda..6441a234 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Development skills for AI coding agents. Plug into your favorite AI coding tool | `pptx-generator` | Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. | Official | | `minimax-xlsx` | Open, create, read, analyze, edit, or validate Excel/spreadsheet files (.xlsx, .xlsm, .csv, .tsv). Covers creating new xlsx from scratch via XML templates, reading and analyzing with pandas, editing existing files with zero format loss, formula recalculation, validation, and professional financial formatting. | Official | | `minimax-docx` | Professional DOCX document creation, editing, and formatting using OpenXML SDK (.NET). Three pipelines: create new documents from scratch, fill/edit content in existing documents, or apply template formatting with XSD validation gate-check. | Official | +| `classroom-inspiration` | K-12 classroom creative teaching design — generate lesson plans, courseware PPT, assignments, worksheets, and classroom assessments. Multi-disciplinary (Chinese, Math, English, Science, Arts), supports differentiated instruction, UDL framework, and story/narrative based teaching. Built-in python-pptx engine. | Community | | `vision-analysis` | Analyze, describe, and extract information from images using vision AI models. Supports describe, OCR, UI mockup review, chart data extraction, and object detection. Powered by MiniMax VL API with OpenAI GPT-4V fallback. | Community | | `minimax-multimodal-toolkit` | Generate voice, music, video, and image content via MiniMax APIs — the unified entry for MiniMax multimodal use cases. Covers TTS (text-to-speech, voice cloning, voice design, multi-segment), music (songs, instrumentals), video (text-to-video, image-to-video, start-end frame, subject reference, templates, long-form multi-scene), image (text-to-image, image-to-image with character reference), and media processing (convert, concat, trim, extract) via FFmpeg. | Official | | `minimax-music-gen` | Generate vocal songs, instrumentals, and covers using MiniMax Music API. Two modes: Basic (one-liner in, song out) and Advanced Control (edit lyrics, refine prompt, plan structure). Supports lyrics generation, style vocabulary, streaming playback, and iterative feedback. | Official | diff --git a/README_zh.md b/README_zh.md index b4b7f5f4..2c65b90a 100644 --- a/README_zh.md +++ b/README_zh.md @@ -22,6 +22,7 @@ | `pptx-generator` | 生成、编辑和读取 PowerPoint 演示文稿。支持用 PptxGenJS 从零创建(封面、目录、内容、分节页、总结页),通过 XML 工作流编辑现有 PPTX,或用 markitdown 提取文本。 | Official | | `minimax-xlsx` | 打开、创建、读取、分析、编辑或验证 Excel/电子表格文件(.xlsx、.xlsm、.csv、.tsv)。支持通过 XML 模板从零创建 xlsx、使用 pandas 读取分析、零格式损失编辑现有文件、公式重算与验证、专业财务格式化。 | Official | | `minimax-docx` | 基于 OpenXML SDK(.NET)的专业 DOCX 文档创建、编辑与排版。三条流水线:从零创建新文档、填写/编辑现有文档内容、应用模板格式并通过 XSD 验证门控检查。 | Official | +| `classroom-inspiration` | K-12 课堂创意教学设计 — 生成教案、课件 PPT、作业设计、学习单和课堂评估。多学科覆盖(语文、数学、英语、科学、艺术),支持差异化教学、UDL 框架和故事化教学法。内置 python-pptx 引擎。 | Community | | `vision-analysis` | 使用视觉 AI 模型分析、描述和提取图像信息。支持描述、OCR 文字识别、UI 界面审查、图表数据提取和物体检测。基于 MiniMax VL API,OpenAI GPT-4V 作为备选。 | Community | | `minimax-multimodal-toolkit` | 通过 MiniMax API 生成语音、音乐、视频和图片内容 — MiniMax 多模态使用场景的统一入口。涵盖 TTS(文字转语音、声音克隆、声音设计、多段合成)、音乐(带词歌曲、纯音乐)、视频(文生视频、图生视频、首尾帧、主体参考、模板、长视频多场景)、图片(文生图、图生图含角色参考),以及基于 FFmpeg 的媒体处理(格式转换、拼接、裁剪、提取)。 | Official | | `minimax-music-gen` | 使用 MiniMax Music API 生成人声歌曲、纯音乐和翻唱。支持基础模式(一句话生成)和强控制模式(编辑歌词、调整 prompt、规划曲式)。内置歌词生成、风格词表、流式播放和迭代反馈。 | Official | diff --git a/skills/classroom-inspiration/SKILL.md b/skills/classroom-inspiration/SKILL.md new file mode 100644 index 00000000..bd114548 --- /dev/null +++ b/skills/classroom-inspiration/SKILL.md @@ -0,0 +1,368 @@ +--- +name: classroom-inspiration +description: | + AI-powered classroom creative teaching design expert. Designs engaging public lesson plans, + competition-class teaching schemes, courseware PPT, teaching activities, and evaluation systems + for K-12 teachers across all subjects and grades. Supports differentiated instruction, + AI-integrated teaching, creative classroom management, lesson presentation, and teaching evaluation. + Use when: the user asks to design a lesson, create a public class, generate teaching activities, + make courseware PPT, write a teaching plan, design classroom games, or prepare lesson evaluations. +license: MIT +metadata: + version: "1.0.0" + category: productivity + sources: + - K-12 classroom teaching methodologies + - Creative teaching activity design patterns + - Public/competition lesson preparation best practices + - Differentiated instruction frameworks + - python-pptx documentation +triggers: + - 公开课 + - 教学设计 + - 课堂创意 + - 课件制作 + - 说课 + - 课堂活动 + - 公开课比赛 + - 教案 + - 课堂管理 + - 创意课堂 + - 作业设计 + - lesson plan + - classroom activity + - teaching design +compatibility: "Requires Python 3.8+ and python-pptx>=0.6.21" +--- + +## 【本体声明】核心实体与语义关系 + +> ⚡ **高频加载**:以下实体和关系是本技能语义网络的锚点。每次激活时优先加载。 +> LLM 在处理任何阶段时,遇到同名实体直接引用其定义和关系,无需重新推断。 + +### 核心实体 + +``` +Actor(参与角色) + ├── Teacher 属性: [subject, grade, style_preference] + ├── Student 属性: [grade, level, class_size] + └── Evaluator 属性: [role(self/peer/expert)] + +Core(核心内容) + ├── KnowledgePoint 属性: [name, textbook_location, mastery_level] + ├── Objective 属性: [dimension, level(basic/core/advanced)] + ├── CreativeForm 属性: [name, style, suitability] + ├── Activity 属性: [type, duration, coverage] + └── Question 属性: [text, context, bloom_level] + +Deliverable(交付物) + ├── LessonPlan 属性: [segments[], objectives[], activities[]] + ├── Courseware 属性: [pages[], color_scheme, font_spec] + ├── Script 属性: [sections[], design_intentions[]] + ├── ResourcePack 属性: [role_cards, clue_cards, worksheets] + └── EvaluationReport 属性: [scores[], observations[]] + +Tool(分析工具)— 见 scripts/ 目录 + ├── ObjectiveValidator 输入: Objective[] 输出: quality_score + verb_check + ├── TimeStructureAnalyzer 输入: Segment[] 输出: time_score + rhythm_pattern + ├── QuestionAnalyzer 输入: Question[] 输出: bloom_distribution + ├── InteractionAnalyzer 输入: Activity[] 输出: diversity_index + coverage + └── ComprehensiveDiagnosis 输入: 以上全部 输出: weighted_score + priority +``` + +### 语义关系(核心链路) + +``` +Teacher --[designs]--> LessonPlan +LessonPlan --[contains]--> Objective[] + Activity[] + Question[] +KnowledgePoint --[anchors]--> Activity + Courseware.pages +Objective --[evaluated_by]--> ObjectiveValidator (scripts/objective-validator.py) +Activity --[analyzed_by]--> InteractionAnalyzer +Question --[analyzed_by]--> QuestionAnalyzer +CreativeForm --[adapts]--> KnowledgePoint +Courseware --[generated_by]--> python-pptx (scripts/ppt_generator.py) +ResourcePack --[contains]--> role_cards + worksheets + observation_forms +``` + +### 渐进加载架构 + +``` +[HIGH] 本体声明 ← 每次激活必加载(本节) +[MEDIUM] 工作流程 Phase A→B→C→1→2→3→4 ← 按路由结果加载(本文后续) +[LOW] 参考文件 ← 按实体引用按需加载(references/ 目录) +``` + +--- + +# 课堂灵感生成器(Pro 升级版) + +你是一位资深教学创意设计师,擅长将任何学科、任何课题的公开课设计得令人耳目一新。你精通 AI 辅助教学、跨学科融合、差异化教学、创意课堂管理和多元评价策略。 + +--- + +## 学习原则 + +1. **逐步引导**:一次只给一个概念,配合示例。从简单到复杂,确认理解后再进阶。 +2. **具体 > 抽象**:用真实课堂案例、逐字稿、你见过的具体教学场景来解释每一个策略。 +3. **验证理解**:给出新知识点后,询问"这个策略在你教的__学科里会怎么应用?"检查迁移能力。 +4. **文件按需加载**:核心工作流在本文件中。深入设计规范和案例库在 `references/` 目录中,按阶段提示加载。 + +--- + +## 工作流程 + +**规则**:Phase A→B→C→1→2→3→4 顺次推进。每个 Phase 结尾的检查点达标后才能进入下一阶段。**不可跳步。** + +--- + +### Phase A — 课堂类型识别 + +> 🎯 目标:根据用户的输入自动匹配课程类型,确定设计起点。 + +#### 课程类型对照表 + +| 类型 | 特征 | 设计重心 | +|------|------|---------| +| 日常公开课 | 常态教学+适量创新 | 结构完整+局部亮点 | +| 比赛课 | 竞争评选 | 冲击力+记忆点+理论基础 | +| 展示课 | 汇报展示 | 学生主体+可视化成果 | +| 常态课 | 日常教学 | 实用高效+可操作 | + +**指令**:请根据以上分类,选择本次设计所属类型。如不确定,追问用户。 + +✅ **检查点 A**:是否已明确课程类型并得到用户确认? + +--- + +### Phase B — 教学背景采集 + +> 🎯 目标:系统采集设计所需的关键背景信息。 + +**必采信息**: +1. **学科**(语文/数学/英语/物理/化学/生物/历史/地理/政治/艺术/体育等) +2. **课题**(具体章节/课文/知识点名称) +3. **年级**(一年级至高三) +4. **教材版本**(人教版/部编版/苏教版/北师大版/自定义等) +5. **课时位置**(第几单元第几课/第几课时) +6. **特殊要求**(如有 AI 融合要求、跨学科需求、特色活动要求等) + +**指令**:逐项向用户采集以上信息。用户未主动提供的,逐个提问。全部收集完毕后进入 Phase C。 + +✅ **检查点 B**:6 项背景信息是否已全部采集完毕并得到用户确认? + +--- + +### Phase C — 课本锚点分析 + +> 🎯 目标:对课题核心内容进行深度分析,确定设计锚点。 + +**分析维度**: + +``` +1. 知识定位 + └─ 本课在单元/学段中的角色?(奠基/拓展/应用/总结) + +2. 核心概念 + └─ 本课最核心的概念/技能是什么?(用一句话表述) + +3. 认知层次 + └─ 主要认知层次:识记/理解/应用/分析/评价/创造 + +4. 学生困难 + └─ 学生最容易在哪里卡住?为什么? + +5. 素养指向 + └─ 对应哪些核心素养? +``` + +**指令**:对课题进行以上 5 个维度的分析,形成锚点报告。确认后进入 Phase 1。 + +✅ **检查点 C**:锚点分析报告是否完成并得到用户确认? + +--- + +### Phase 1 — 教学目标设计 + +> 🎯 目标:制定精确、可评的三维/核心素养目标。 + +**操作步骤**: + +1. **课标依据**:引用对应学段课标相关要求 +2. **目标分类**(按课型选择一种框架): + - 新课标框架:核心素养×具体表现 + - 三维框架:知识与技能 / 过程与方法 / 情感态度价值观 +3. **行为动词规范**: + - 基础:说出、识别、列举、复述 + - 核心:解释、比较、运用、分析 + - 高阶:评价、设计、创造、论证 +4. **分层写法**:基础目标(全员必达)→ 核心目标(主体达成的)→ 高阶目标(学有余力) +5. **验证**:使用 `scripts/objective-validator.py` 检验目标的行为动词是否具体、可评 + +✅ **检查点 1**:教学目标是否做到具体、分层、可评?是否通过 `objective-validator.py` 验证? + +--- + +### Phase 2 — 方案设计 + +> 🎯 目标:设计整体教学方案,选择创意形式,规划教学流程。 + +#### 步骤 2.1 — 创意形式选型 + +根据 Phase C 的分析结果,从 `references/case-library.md` 中的「创意案例一览」「创意形式速查表」「选型决策树」选择适合本课的创意形式。 + +**选型标准**: +- **学科适配**:形式是否适合本学科特点 +- **认知匹配**:形式是否匹配本课的主要认知层次 +- **可行性**:准备时间、资源、课堂氛围是否允许 +- **新颖度**:学生是否已经接触过类似形式 + +#### 步骤 2.2 — 流程设计 + +设计四段式教学流程,每段标注设计意图: + +``` +导入(3-5min) → 激趣/唤醒前备知识/提出驱动问题 +新授+互动(15-20min)→ 知识建构+活动体验+思维可视化 +活动+展示(10-15min)→ 应用迁移+成果展示+同伴互评 +总结+作业(3-5min) → 知识结构化+反思+分层作业 +``` + +**指导文件**:教学设计完成后,如需更多创意参考,加载 `references/case-library.md`。 + +✅ **检查点 2**:教学方案是否完整(导入→新授→活动→总结)?是否选定了创意形式?各环节时长是否合理? + +--- + +### Phase 3 — 资源准备 + +> 🎯 目标:根据 Phase 2 的方案,逐步产出课件、逐字稿、活动材料。 + +#### 步骤 3.1 — 课件 PPT 设计 + +1. 从 `references/ppt-design-guide.md` 选择适合本课的配色方案(3.3 分学科配色) +2. 按逐页设计规范(3.2 A-F 六件套)规划页面结构 +3. 参考 A-F 逐份设计:封面→导入→目标→知识共建→活动→总结 +4. 填写逐页大纲记录表(3.9) +5. 如需视觉升级,参考 3.14 视觉升级指南 + +#### 步骤 3.2 — PPT 代码生成(可选) + +如需生成可运行的 Python 脚本,加载 `references/pptx-codegen.md`。 + +**代码生成流程**: +1. 将 Phase 2 的方案填入代码模板 +2. 生成完整 Python 脚本 +3. 输出到 `output/` 目录(文件名 = `{课题}_{学科}_{日期}.pptx`) +4. 提示用户安装依赖并运行 + +**现有脚本**(`scripts/` 目录): +- `ppt_generator.py` — PPT 生成脚本 +- `objective-validator.py` — 教学目标验证 +- `time-checker.py` — 时间分配检查 +- `coverage-checker.py` — 知识覆盖检查 + +#### 步骤 3.3 — 演讲逐字稿 + +如需要,加载 `references/presentation-guide.md`。 + +- 按逐字稿结构模板(3.11)撰写 +- 标注过渡语和预设学生反应 +- 参考 3.12 学科案例示范 + +#### 步骤 3.4 — 资源包制作 + +如有活动需要材料(角色卡/工作表/观察记录表),生成配套资源模板。 + +✅ **检查点 3**:课件是否完成所有必要页面?PPT 脚本是否可运行?逐字稿是否涵盖全部环节? + +--- + +### Phase 4 — 自检与发布 + +> 🎯 目标:检查设计质量,修复缺陷,准备最终交付。 + +#### 步骤 4.1 — 综合诊断 + +运行 `scripts/` 下的诊断工具: + +``` +1. objective-validator.py → 目标质量评分 + 动词规范性检查 +2. time-checker.py → 时间分配合理性评分 + 节奏模式分析 +3. coverage-checker.py → 知识点覆盖率检查 +``` + +#### 步骤 4.2 — 五维自检清单 + +``` +□ 目标性(20%):所有活动是否直接指向教学目标? +□ 参与度(20%):全员参与还是部分学生"旁观"? +□ 层次性(20%):是否有基础/进阶/挑战的分层设计? +□ 创新性(20%):是否有至少一处让人"眼前一亮"的设计? +□ 可行性(20%):在实际课堂中能否顺畅执行? +``` + +每项评分 1-5 分,总分 < 20 需优化后重新检查。 + +#### 步骤 4.3 — 问题修复 + +针对自检发现的问题进行修复: + +| 问题类型 | 修复策略 | +|---------|---------| +| 目标性不足 | 重新审视目标→活动匹配度,删掉无关活动 | +| 参与度低 | 增加全员参与环节(举手/投票/同伴讨论) | +| 层次性弱 | 添加分层任务卡或选做挑战 | +| 创新性低 | 替换 1-2 个常规活动为创意形式 | +| 可行性差 | 减少材料依赖,简化操作步骤 | + +✅ **检查点 4**:五项自检是否全部 ≥ 4 分?诊断工具是否全部通过?用户是否对最终方案满意? + +--- + +### 异常恢复指南 + +| 情况 | 处理方式 | +|------|---------| +| 用户对方案不满意 | 回溯 Phase 2,换用不同的创意形式重新设计 | +| 代码生成报错 | 检查 python-pptx 版本、字体路径、文件路径;提供逐条修复指引 | +| 用户临时改变课题 | 从 Phase C(锚点分析)重新开始,保留已有学科背景信息 | +| 用户需要更多案例 | 加载 `references/case-library.md` 查阅更多学科案例 | +| 课时太短/太长 | 运行时 `time-checker.py` 调整各环节时长比例 | +| 用户想要更详细的设计规范 | 加载 `references/ppt-design-guide.md` 或 `references/supplementary.md` | + +--- + +### 作业设计(可选阶段) + +> 如用户需要作业设计支持,加载 `references/supplementary.md` 的「作业设计工具箱」。 + +### 课堂管理(可选阶段) + +> 如用户需要课堂管理方案,加载 `references/supplementary.md` 的「创意课堂管理」。 + +### 说课/评课(可选阶段) + +> 如用户需要说课稿或评课框架,加载 `references/supplementary.md` 的「说课与评课指导」。 + +### 差异化教学(可选阶段) + +> 如学生群体包含不同能力水平或特殊需要,加载 `references/supplementary.md` 的「差异化教学与融合教育」。 + +### 前沿趋势参考(可选阶段) + +> 如用户想了解最新的教学趋势或工具,加载 `references/supplementary.md` 的「前沿趋势与工具」。 + +--- + +## Reference Files Index + +| 文件 | 内容 | 加载时机 | +|------|------|---------| +| `references/ppt-design-guide.md` | PPT 设计规范(配色/字体/版式/动画) | Phase 3.1 课件设计 | +| `references/presentation-guide.md` | 演讲技巧 + 逐字稿模板 + 学科案例 | Phase 3.3 逐字稿 | +| `references/pptx-codegen.md` | python-pptx 代码生成 + 视觉升级 + 叙事结构 | Phase 3.2 代码生成 | +| `references/case-library.md` | 20+ 创意案例 + 形式速查表 + 选型决策树 + 分学科设计 | Phase 2 选型 / 创意参考 | +| `references/supplementary.md` | 作业设计 / 差异化 / 课堂管理 / 说课评课 / 前沿趋势 | 按需加载 | +| `scripts/` | Python 工具脚本(含 requirements.txt) | Phase 1/3/4 验证与生成 | + +**加载方式**:在对应阶段第一次引用时加载。文件之间无循环依赖,可独立加载。 diff --git a/skills/classroom-inspiration/references/case-library.md b/skills/classroom-inspiration/references/case-library.md new file mode 100644 index 00000000..a7c10f2f --- /dev/null +++ b/skills/classroom-inspiration/references/case-library.md @@ -0,0 +1,374 @@ +# LLM Wiki 创意案例库 + +> **加载条件**:当工作流程中需要创意形式参考、案例借鉴,或用户要求查找学科设计案例时加载此文件。 +> **预计加载量**:约 350 行 + +--- + +## 创意案例一览 + +### 案例一:侦探事务所 —— 语文·古诗词鉴赏 + +``` +角色:诗词侦探 +任务:破解诗人"情感密码" +证据:诗词中的意象(关键词) +推理链:意象 → 情感基调 → 创作背景 +产出:侦探报告(每首诗一份"破案记录") +``` + +- 适用年级:3-9 年级 +- 复杂度:★★☆☆☆ +- 核心能力:文本细读 + 推理 + 表达 + +### 案例二:历史决策模拟器 —— 历史·重大历史事件 + +``` +情境:回到历史转折点 +角色:当权者/决策团队 +任务:基于给定信息做出决策 +规则:不能使用现代知识 +产出:决策书 + 实际历史对比复盘 +``` + +- 适用年级:7-12 年级 +- 复杂度:★★★★☆ +- 核心能力:历史思维 + 共情 + 决策分析 + +### 案例三:知识快闪店 —— 地理/生物/物理·概念复习 + +``` +概念:将知识点包装成"商品" +展台布置:知识海报 + 模型/实物 +推销员:每组负责一个知识点 +顾客:巡店评分+"购买"最打动自己的知识 +``` + +- 适用年级:5-12 年级 +- 复杂度:★★★☆☆ +- 核心能力:信息整合 + 表达 + 评价 + +### 案例四:跨界实验室 —— 理化生·跨学科探究 + +``` +课题:以真实问题切入(如"为什么冰红茶瓶上有水珠?") +学科视角:物理(液化)→ 化学(溶液)→ 生物(蒸腾作用) +协作产出:一份"跨界研究报告"+ 学科联系图 +``` + +- 适用年级:5-9 年级 +- 复杂度:★★★★☆ +- 核心能力:跨学科迁移 + 探究 + 系统思维 + +### 案例五:绘本工作坊 —— 英语/语文·低段教学 + +``` +任务:将课文改编为 8-10 页绘本 +环节:故事地图 → 分镜设计 → 配文→ 插图 → 分享会 +产出:实体绘本/数字绘本(Canva/Book Creator) +``` + +- 适用年级:K-6 年级 +- 复杂度:★★☆☆☆ +- 核心能力:阅读理解 + 创意表达 + 美术 + +### 案例六:TED 微演讲 —— 全学科·表达训练 + +``` +任务:3 分钟 TED-style 演讲 +准备:观点提炼 → 故事化结构 → 视觉辅助 → 演讲打磨 +形式:录播/直播/现场 +评价:内容(40%)+表达(30%)+视觉(30%) +``` + +- 适用年级:7-12 年级 +- 复杂度:★★★☆☆ +- 核心能力:逻辑建构 + 公共表达 + 批判思维 + +### 案例七:概念类比工坊 —— 抽象概念教学 + +``` +目标:用学生熟悉的领域解释抽象概念 +方法: + 1. 列出概念的关键属性 + 2. 寻找学生熟悉的类比领域 + 3. 建立属性映射表 + 4. 让学生自己创造新类比 + +示例: + 细胞 → 工厂(细胞膜=门卫,线粒体=发电厂,核糖体=生产线) + 电流 → 水流(电压=水压,电阻=水管粗细,电流=流量) +``` + +- 适用年级:5-12 年级 +- 复杂度:★★☆☆☆ +- 核心能力:类比推理 + 抽象思维 + 创造力 + +### 案例八:画廊漫步 —— 全学科·成果展示 + +``` +流程:作品布置 → 半数留展半数参观 → 轮换 → 反馈贴纸 +各科应用: + 语文:优秀作文/书法展示 + 数学:解题策略海报 + 英语:主题手抄报 + 科学:实验报告/模型 + 历史:人物研究展板 +``` + +- 适用年级:K-12 年级 +- 复杂度:★☆☆☆☆ +- 核心能力:展示 + 评价 + 同伴学习 + +### 案例九:角色辩论赛 —— 历史/政治/语文 + +``` +设定:围绕争议性问题(历史决策/文学解读/社会议题) +角色:不限于正方反方,可设置"第三方观察员""历史人物本人" +辩论结构:开篇立论 → 自由辩论 → 总结陈词 → 评委点评 +``` + +- 适用年级:7-12 年级 +- 复杂度:★★★★☆ +- 核心能力:论证 + 倾听 + 批判思维 + +### 案例十:思维可视化工具包 + +| 工具 | 适用场景 | 操作方式 | +|------|---------|---------| +| 思维导图 | 知识梳理/头脑风暴 | 中心词→分支→关键词 | +| KWL 表 | 课前/课后 | 已知→想知→学到 | +| 鱼骨图 | 因果分析 | 问题(头)→原因(骨) | +| 韦恩图 | 比较异同 | 两个/三个重叠圆 | +| T 型图 | 对比分析 | 左/右两栏对比 | +| 十字定位 | 多维度评价 | 四象限坐标 | +| 流程图 | 流程/步骤 | 箭头+方框 | + +- 适用年级:K-12 年级 +- 复杂度:★☆☆☆☆ + +### 案例十一:微电影项目 —— 英语/语文·单元整合 + +``` +驱动问题:如何将一个故事/主题用 5 分钟微电影呈现? +分工:编剧→导演→演员→摄影→剪辑→音效 +流程:剧本 → 分镜 → 拍摄 → 剪辑 → 首映礼 +``` + +- 适用年级:5-12 年级 +- 复杂度:★★★★★ +- 核心能力:协作 + 统筹 + 综合表达 + +### 案例十二:数据新闻实验室 —— 数学/地理/政治 + +``` +任务:用真实数据制作一则"新闻报导" +步骤:收集数据 → 数据可视化 → 撰写报导 → 录制新闻播报 +工具:Excel/Google Sheets → Canva/Flourish → iMovie/剪映 +``` + +- 适用年级:7-12 年级 +- 复杂度:★★★★☆ +- 核心能力:数据素养 + 信息设计 + 表达 + +### 案例十三:反向教学 —— 全学科·高阶 + +``` +概念:学生先看"答案"/结论,反推过程和问题 +实操: + 1. 给结论(如 2023 年某地 GDP 增长 5.2%) + 2. 反推可能的影响因素 + 3. 验证哪些因素成立 + 4. 总结分析框架 +``` + +- 适用年级:9-12 年级 +- 复杂度:★★★★☆ +- 核心能力:逆向思维 + 推理 + 验证 + +### 案例十四:学科车站 + +``` +概念:教室设置 5-6 个"车站",每站一个知识点/任务 +运转:小组轮转(每站 5-8 分钟) +内容:站1-阅读资料 → 站2-视频学习 → 站3-实验操作 → 站4-讨论分析 → 站5-创意产出 +记分牌:统一记录各小组进度 +``` + +- 适用年级:3-12 年级 +- 复杂度:★★★☆☆ +- 核心能力:自主学习 + 时间管理 + 协作 + +### 案例十五:创意写作 × 历史/科学 + +- **给历史人物写简历**:为秦始皇写一份求职简历(语文+历史) +- **给化学元素写交友软件简介**:写出元素的"性格"和"配对偏好"(化学+语文) +- **给数学公式写使用说明书**:公式的"功能""用法""注意事项"(数学+写作) +- **给生态系统写游记**:以旅行者视角记录生态链(生物+写作) + +- 适用年级:5-9 年级 +- 复杂度:★★☆☆☆ +- 核心能力:创意写作 + 跨学科联想 + +### 案例十六:概念卡牌对战 + +``` +设计:每个知识点做成一张卡牌(名称+效果+消耗) +机制:学生抽卡 → 组合 → 对战(用知识回答问题/解决情境题) +进阶:学生自己设计新卡牌 +应用:化学元素/历史事件/英语词汇/数学公式 +``` + +- 适用年级:3-9 年级 +- 复杂度:★★★☆☆ +- 核心能力:知识整合 + 策略思维 + 合作竞争 + +--- + +## 创意形式速查表 + +| 形式 | 适用学科 | 活跃度 | 准备时间 | 适合人数 | 核心能力 | +|------|---------|--------|---------|---------|---------| +| 角色扮演 | 文史/英语 | ⭐⭐⭐ | 中 | 20-40 | 共情+表达 | +| 辩论赛 | 文史/政治 | ⭐⭐⭐ | 中 | 20-40 | 论证+倾听 | +| 模拟法庭 | 政治/历史 | ⭐⭐⭐ | 高 | 20-30 | 论证+逻辑 | +| 画廊漫步 | 全学科 | ⭐⭐ | 低 | 任何 | 展示+评价 | +| 知识拍卖 | 任何复习课 | ⭐⭐⭐⭐ | 中 | 20-40 | 记忆+策略 | +| 侦探破案 | 任何 | ⭐⭐⭐⭐ | 中 | 20-40 | 推理+细读 | +| 卡牌对战 | 任何 | ⭐⭐⭐⭐ | 高 | 20-30 | 整合+策略 | +| 快闪店/市集 | 任何 | ⭐⭐⭐ | 中 | 30+ | 整合+表达 | +| 学科车站 | 任何 | ⭐⭐⭐ | 中 | 20-40 | 自主+协作 | +| TED演讲 | 全学科 | ⭐⭐⭐ | 中 | 全班 | 逻辑+表达 | +| 微电影 | 语文/英语 | ⭐⭐⭐⭐⭐ | 高 | 全班分组 | 协作+创造 | +| 绘本创作 | 语文/英语 | ⭐⭐⭐ | 中 | 个人/小组 | 理解+创意 | +| 数据新闻 | 数理/地理 | ⭐⭐⭐ | 中 | 分组 | 数据+信息 | +| 翻转课堂 | 全学科 | ⭐⭐ | 高 | 任何 | 自学+探究 | +| 游戏化闯关 | 全学科 | ⭐⭐⭐⭐ | 中 | 任何 | 综合应用 | + +--- + +## 选型决策树 + +``` +用户场景? +├── 新授课 +│ ├── 概念抽象难理解 → 案例七(概念类比工坊) +│ ├── 需要深度探究 → 案例四(跨界实验室) +│ ├── 激发学习兴趣 → 案例一(侦探事务所) +│ └── 需要动手实践 → 案例十四(学科车站) +├── 复习课 +│ ├── 知识梳理 → 案例三(知识快闪店) +│ ├── 趣味巩固 → 案例十六(概念卡牌对战) +│ └── 查漏补缺 → 案例十二(数据新闻实验室) +├── 展示课 +│ ├── 作品展示 → 案例八(画廊漫步) +│ ├── 成果汇报 → 案例六(TED微演讲) +│ └── 综合展示 → 案例十一(微电影项目) +├── 公开课 +│ ├── 需要亮点 → 案例二(历史决策模拟器) +│ ├── 需要互动 → 案例九(角色辩论赛) +│ └── 需要创新 → 案例五(绘本工作坊) +└── 跨学科课程 + ├── STEM/STEAM → 案例四(跨界实验室) + ├── 文史融合 → 案例十五(创意写作×学科) + └── 综合实践 → 案例十三(反向教学) +``` + +--- + +## 分学科专题设计 + +### 语文 + +| 课型 | 创意形式 | 核心活动 | 产出物 | +|------|---------|---------|-------| +| 阅读课 | 阅读圈+角色日记 | 每组一个阅读角色(总结者/提问者/联结者/词汇者) | 阅读日志+角色讨论记录 | +| 写作课 | 写作工作坊 | 头脑风暴→提纲→初稿→同伴反馈→修改→发布 | 作文+同伴评语 | +| 古诗文 | 穿越访谈 | 穿越回古代"采访"诗人,还原创作心境 | 采访稿+古诗配画 | +| 整本书阅读 | 读书俱乐部+书籍评审会 | 每周阅读任务+讨论+书评撰写 | 书评卡+阅读进度表 | + +### 数学 + +| 课型 | 创意形式 | 核心活动 | 产出物 | +|------|---------|---------|-------| +| 概念课 | 数学实验室 | 操作教具/学具→发现规律→总结概念 | 实验记录单 | +| 计算课 | 数学游戏化 | 游戏关卡→算法理解→速算挑战 | 闯关记录卡 | +| 几何课 | 几何艺术工坊 | 几何图形→艺术作品→几何原理解密 | 几何艺术作品+原理说明 | +| 应用题 | 数学建模营 | 真实问题→简化假设→建立模型→求解验证→反思 | 建模报告 | + +### 英语 + +| 课型 | 创意形式 | 核心活动 | 产出物 | +|------|---------|---------|-------| +| 词汇课 | 词汇大闯关 | 主题词汇 → 游戏化操练 → 情境运用 | 词汇地图+词汇故事 | +| 阅读课 | 阅读圈 | 各角色分工阅读→讨论→分享 | 角色任务单+阅读笔记 | +| 写作课 | 过程写作法 | Pre-writing→Drafting→Revising→Editing→Publishing | 作文+互评表 | +| 口语课 | 情景交际 | 真实任务驱动→角色扮演→表演展示 | 对话视频/音频+自评 | + +### 科学 + +| 课型 | 创意形式 | 核心活动 | 产出物 | +|------|---------|---------|-------| +| 概念课 | 5E探究式 | Engage→Explore→Explain→Elaborate→Evaluate | 探究记录+概念图 | +| 实验课 | 科学侦探 | 问题→假设→实验→证据→结论 | 实验报告(像侦探记录) | +| 复习课 | 科学博览会 | 各小组负责一个知识展位+评委巡展 | 展板+讲解+互动设计 | + +### 历史/政治 + +| 课型 | 创意形式 | 核心活动 | 产出物 | +|------|---------|---------|-------| +| 历史事件 | 历史剧场 | 角色扮演+关键决策模拟+结果复盘 | 决策记录+历史反思 | +| 政治概念 | 模拟政协/人大 | 提案-讨论-表决-实施-反馈 | 提案+辩论记录 | + +--- + +## 小学低段(K-2)专项设计 + +### 设计原则 + +- **具象化**:所有抽象概念必须转化为可摸/可看/可玩的具体事物 +- **游戏化**:每节课至少包含 1 个完整的游戏环节 +- **短周期**:单一活动时长 ≤ 10 分钟 +- **多感官**:同时调动视觉、听觉、动觉 + +### 推荐活动形式 + +1. **魔法箱(神秘感导入)**:箱子里装什么?摸一摸猜一猜,引出课题 +2. **韵律歌谣**:将核心知识点编成有节奏的歌谣+动作 +3. **身体字母/数字**:用身体摆出字母/数字形状 +4. **色彩密码**:用颜色代表不同类别/答案(红色=名词、蓝色=动词) +5. **情绪温度计**:让学生用手势/表情表达理解程度(5-4-3-2-1) +6. **拼图任务**:小组合作拼出完整图片/文字/概念 +7. **Yes/No 阵营**:全班起立,Yes 站左边 No 站右边 + +--- + +## 跨学科 / STEAM 专题 + +### 设计步骤 + +1. 确定真实世界问题或驱动问题 +2. 列出涉及学科和对应的课程标准 +3. 设计整合点:哪些内容是跨学科重叠/互补的? +4. 规划时间分配:各学科课时比例 +5. 设计统一评价量规 + +### 经典主题库 + +| 主题 | 涉及学科 | 年级 | 项目周期 | +|------|---------|------|---------| +| 校园植物地图 | 生物+地理+美术+数学 | 3-6 | 2-4 周 | +| 小小城市规划师 | 数学+地理+政治+美术 | 5-8 | 3-5 周 | +| 水资源调查报告 | 科学+地理+数学+语文 | 5-9 | 2-3 周 | +| 古代科技发明 | 历史+物理+语文+美术 | 5-9 | 3-4 周 | +| 未来学校设计 | 全学科 | 3-9 | 2-6 周 | +| 零废弃校园计划 | 科学+数学+政治+语文 | 5-9 | 4-6 周 | +| 中国传统节日文化展 | 语文+历史+美术+劳动 | 1-6 | 2-3 周 | +| 社区服务地图 | 地理+数学+政治+信息技术 | 7-9 | 3-4 周 | + +--- + +## 文件引用索引 + +本文件被核心 `SKILL.md` 在 Phase 2(创意形式选型)和 Phase 3(具体案例参考)中引用。 +关联文件:`references/supplementary.md`(扩展教学资源) diff --git a/skills/classroom-inspiration/references/ppt-design-guide.md b/skills/classroom-inspiration/references/ppt-design-guide.md new file mode 100644 index 00000000..fedb3b5f --- /dev/null +++ b/skills/classroom-inspiration/references/ppt-design-guide.md @@ -0,0 +1,304 @@ +# PPT 设计规范(创意课件设计指南) + +> **加载条件**:当工作流程进入 Phase 3(课件制作阶段),或用户明确要求设计 PPT/课件时加载此文件。 +> **预计加载量**:约 300 行 + +--- + +## 3.1 PPT 设计核心原则 + +每条原则配套一个「检查问题」,请在完成后逐一对照。 + +1. **视觉一致性**:字体不超过两种、配色不超过三级(主色/辅色/强调色) + - Q:每一页是否都保持相同的位置感和视觉逻辑? +2. **逻辑可视化**:用箭头/流程线/连线来展示结构 + - Q:学生能否单凭页面图形就理解知识演进? +3. **认知分层**:先给「地图(目录/全景)」再给「细节」 + - Q:每一页有没有明确聚焦"只讲一件事"? +4. **留白法则**:每页正文不超过 7 行,能删则删 + - Q:去掉这个装饰性元素会不会让核心信息更清楚? +5. **情感设计**:配色、字体、图片传递学科气质 + - Q:这页PPT给学生的第一感觉是什么? + +--- + +## 3.2 逐页设计规范(标准 A–F 六件套) + +### 封面页 A + +``` +[左上角] 学校Logo / 学科图标 +[中央偏上] 课题名称(中英文双行 / 大号粗体) +[底部右下角] 授课教师 · 年级 · 日期 +``` + +- 图片:与课题强相关的全幅背景图(去色/渐变遮罩处理) +- 字体:标题 36-40pt,正文 16-18pt +- 不建议用纯文字封面——找一张高分辨率、与课题隐喻相关的背景图 + +**备选方案**:问题驱动型封面(中央一个大问号 + 核心驱动问题)、倒计时型封面("距离开课还有 X 秒"/制造紧迫预热感) + +### 情境导入页 B + +- 左侧 40% = 图片/短视频截图/漫画 +- 右侧 60% = 核心问题(认知冲突型)+ 关键词 + +设计要点: + +- 图片选择真实场景(有情感温度的照片 > 插画 > 图标) +- 问题应是"真问题"——没有标准答案、引发好奇 +- 设置 3 个"竞争性猜想"选项引导学生预判 + +### 学习目标页 C + +``` +本节课,我们将——(三栏卡片式排列) + 探索 → 核心问题/概念 + 掌握 → 必备知识/技能 + 创造 → 应用产出/作品 +``` + +- 每个目标前加 icon ✅/🛠/🎨(或学科相关 icon) +- 行为动词用色块突出(如 **分析**、**评估**、**创造**) +- 可选:右上角放置"时间地图"示意本环节时长 + +### 知识共建页 D(最核心的部分) + +按认知层次递增排列: + +| 层次 | 内容 | 呈现方式 | +|------|------|----------| +| 基础层 | 事实/概念/定义 | 图文并茂+示意图 | +| 应用层 | 案例/场景/数据 | 表格/时间线/对比框 | +| 挑战层 | 思辨题/矛盾 | 引语/数据可视化 | +| 创造层 | 活动/产出说明 | 步骤图/示例图 | + +### 课堂活动页 E + +``` +[标题] 活动名称(建议配图标) +[左] 任务卡(Step 1→2→3→4) +[右] 时间倒计时(沙漏/进度条)+ 产出形式(小组讨论/画廊漫步/角色扮演) +[底栏] 评价量规(简易 3 级:铜/银/金 或 ✅/⭐/🏆) +``` + +- 每个活动尽量做到 3E 原则:Easy to explain → Easy to start → Easy to show result +- 倒计时动画有效提升课堂节奏感 +- 活动指令用祈使句,一页能看懂全部步骤 + +### 总结作业页 F + +- 左侧:知识地图(概念连线 / 思维导图 skeleton) +- 右侧:分层作业(★ 基础 ★★ 挑战 ★★★ 创意) +- 底部:下节课预告 + 自评/互评二维码 + +--- + +## 3.3 配色方案系统 + +### 通用调配公式 + +``` +主色(60%) ← 学科代表色(降低饱和度 → 高级感) +辅色(30%) ← 主色的邻近色(同色系略深/略浅) +强调色(10%) ← 互补色或对比色(仅用于关键信息) +``` + +### 分学科配色推荐 + +| 学科 | 主色 | 辅色 | 强调色 | 心理暗示 | +|------|------|------|--------|----------| +| 语文 | 墨绿 #2D5A27 | 米白 #F5F0E8 | 朱红 #C23B22 | 典雅、人文 | +| 数学 | 深蓝 #1A365D | 浅灰 #E2E8F0 | 橙黄 #ED8936 | 理性、专注 | +| 英语 | 宝石蓝 #2B6CB0 | 浅蓝 #EBF8FF | 珊瑚 #F56565 | 开放、国际 | +| 物理 | 午夜蓝 #2C3E50 | 银灰 #BDC3C7 | 电光蓝 #3498DB | 科学、严谨 | +| 化学 | 墨绿 #2E7D32 | 白 #F5F5F5 | 紫 #7B1FA2 | 实验、探索 | +| 生物 | 草绿 #388E3C | 暖棕 #D7CCC8 | 明黄 #FDD835 | 生命、自然 | +| 历史 | 暗红 #8B0000 | 旧纸 #F5E6C8 | 金 #C9A96E | 厚重、叙事 | +| 地理 | 大地棕 #6D4C41 | 天空蓝 #BBDEFB | 草绿 #66BB6A | 广阔、连接 | +| 政治 | 中国红 #BE3A34 | 米色 #FFF8F0 | 金 #C9A96E | 庄重、大气 | +| 艺术 | 紫 #6A1B9A | 粉 #FCE4EC | 青绿 #00BCD4 | 创意、自由 | + +### 暗色模式微调 + +当课堂使用投影/电子白板时,建议使用浅色背景深色字体的高对比方案,避免在光线较强的环境中出现反光(深色背景 + 浅色字 = 反光严重)。 + +--- + +## 3.4 字体排版系统 + +### 推荐搭配 + +| 用途 | 中文字体 | 英文字体 | 备注 | +|------|----------|----------|------| +| 标题 | 思源黑体 Bold / 阿里巴巴普惠体 | Montserrat Bold | 无衬线、清晰有力 | +| 正文 | 思源黑体 Regular / 霞鹜文楷 | Open Sans / Lato | 易读、屏显友好 | +| 标注 | 思源黑体 Light | Roboto Light | 辅助信息、注释 | + +### 排版比例 + +- 标题:正文 = 2:1(视觉重量) +- 行高:1.5–1.8 倍(中文建议 1.8) +- 字符间距:标题 -50~-100,正文 0 +- 每行字数:中文 ≤ 25 字 / 英文 ≤ 60 字符 + +--- + +## 3.5 图像使用规范 + +1. **来源**:Unsplash / Pexels / Pixabay / 学科专业图库 +2. **处理**:统一圆角(4-8px)+ 统一阴影(柔和投影) +3. **不匹配宁可不用**:装饰性图片如果与内容无关反而产生认知负担 +4. **对比法则**:图片若为背景 — 加渐变遮罩 + 文字加投影 +5. **人物照片**:避免凝视镜头(抓拍更有真实感) + +### AI 图像生成提示词框架 + +``` +[风格] academic illustration / watercolor / minimalist line art / isometric +[主体] 页面核心概念具象化 +[构图] close-up / wide shot / diagram style +[调性] warm and engaging / serious and professional / playful and creative +[文字] no text, clean background +``` + +--- + +## 3.6 动画与过渡 + +### 推荐原则(少即是精) + +- 进入动画:统一使用"淡入"或"从下向上滑动" +- 强调动画:仅用于关键结论/数据(脉冲/放大) +- 页面过渡:统一"平滑"或"推入" +- 禁用:旋转、回旋、弹跳等花哨动画 + +### 节奏控制 + +- 每页动画 ≤ 3 个元素 +- 连续动画间隔 0.5-0.8 秒 +- 关键结论停留 ≥ 3 秒再进入下一页 + +--- + +## 3.7 实战加分技巧 + +### 3.7.1 无PPT教学策略 + +- **黑板板书设计**:核心概念 + 思维导图 + 关键问题 +- **实物投影**:学生作品实时展示+点评 +- **思维可视化**:用大白纸+便利贴协作生成知识地图 + +### 3.7.2 互动增强技巧 + +- **2 分钟规则**:每 2 分钟切换一次教学行为(讲→问→看→做→讨论) +- **PMC 节奏**:Present 呈现 → Mini-task 微任务 → Check 快速检测 +- **随机点名器**:课堂专用 APP / 小程序 +- **即时反馈系统**:举牌(A/B/C/D)/ 手势投票(1-5 指) + +### 3.7.3 课件细节加分项 + +- **页码**:每页右下角显示"X / Y"(让学生知道进度) +- **过渡页**:每个大环节之间加一个"过渡页"(大标题+目标回顾) +- **备用页**:准备 2-3 页拓展内容(应对超前完成的小组) +- **应急方案**:每节课准备 2-3 个微活动备用 + +--- + +## 3.8 AI 辅助 PPT 制作 + +### AI 工具协作流程 + +``` +Prompt 设计需求 → AI 生成大纲 → 人工筛选内容 → AI 配图建议 → 人工排版定稿 +``` + +### 推荐工具组合 + +- **大纲/文案**:ChatGPT / Claude(结构先行) +- **配图**:Midjourney / DALL·E / 文心一格(生成学科定制图) +- **PPT 生成**:Gamma / 讯飞智文 / 百度文库 AI(快速出初稿) +- **智能美化**:iSlide / 美化大师(一键统一风格) + +--- + +## 3.9 逐页大纲记录表 + +| 页序 | 类别 | 核心内容 | 呈现形式 | 配图建议 | 互动设计 | 时长 | +|------|------|----------|----------|----------|----------|------| +| 1 | 封面 | | | | | — | +| 2 | 导入 | | | | | 3min | +| 3 | 目标 | | | | | 1min | +| ... | ... | ... | ... | ... | ... | ... | + +--- + +## 3.14 视觉升级(高阶设计) + +### 3.14.1 设计风格 + +- **扁平化**:纯色+几何图形,适用于数据展示 +- **新拟态**:柔软阴影+浅色背景,适用于概念讲解 +- **手绘风**:SVG 手绘线条+不规则边框 +- **杂志风**:大图+大字+留白,适用于导入环节 + +### 3.14.2 封面视觉设计 + +``` +驱动性问题(大字号居中) + +[学科名称] · [年级] | [授课教师] +``` + +- 背景使用全幅与课题相关的场景照片 + 渐变蒙层 +- 驱动性问题在正中央,字号 > 36pt,一句话引发思考 + +### 3.14.3 分节视觉方案 + +- **故事叙述型**:每节以"幕/场景"命名,配合时间线进度条 +- **探索任务型**:每节以"关卡/任务"命名,配合经验值进度条 +- **问题驱动型**:每节以"子问题"命名,配合问题树结构 + +--- + +## 3.15 课本锚点内容设计 + +### 锚点系统(每课三锚) + +课本中的知识点需要在 PPT 中有明确的落脚点。 + +1. **锚点①情境锚**:用真实情境连接课本概念 + - 例:物理"摩擦力"→ 为什么冰壶比赛要擦冰面?(真实运动场景) +2. **锚点②问题锚**:一个核心问题贯穿全课 + - 例:数学"比例"→ 如何用一杯浓缩液调配出 500ml 完美橙汁? +3. **锚点③产出锚**:可带走的产出物 + - 例:语文"说明文"→ 每人带一张"校园物品说明书" + +### 课本锚点 × 创意形式交叉表 + +| 课本内容类型 | 推荐创意形式 | 锚点选择 | +|-------------|-------------|---------| +| 抽象概念 | 角色扮演、关系类比 | 情境锚 | +| 事实性知识 | 知识竞赛、记忆游戏 | 问题锚 | +| 技能操作 | 模拟工坊、师徒制 | 产出锚 | +| 情感态度 | 辩论、戏剧、画廊漫步 | 情境锚 | +| 综合实践 | PBL、翻转课堂 | 问题锚+产出锚 | + +--- + +## 逐份检查清单(Phase 3 结束前自检) + +- [ ] 是否每个知识点都有视觉锚点? +- [ ] 是否避免了纯文字页面? +- [ ] 配色是否符合学科特性? +- [ ] 是否有至少一处互动设计? +- [ ] 是否准备了备用页/应急活动? +- [ ] 整体风格是否统一? +- [ ] 是否满足 3E 原则(Easy to explain → Easy to start → Easy to show result)? + +--- + +## 文件引用索引 + +本文件被核心 `SKILL.md` 在工作流程 Phase 3 中引用。 +关联文件:`references/pptx-codegen.md`(代码生成)、`references/presentation-guide.md`(演讲指导) diff --git a/skills/classroom-inspiration/references/pptx-codegen.md b/skills/classroom-inspiration/references/pptx-codegen.md new file mode 100644 index 00000000..9f003c6e --- /dev/null +++ b/skills/classroom-inspiration/references/pptx-codegen.md @@ -0,0 +1,332 @@ +# PPT 代码生成指南 + +> **加载条件**:进入 Phase 3.13(代码生成阶段),或用户明确要求生成可运行的 PPT 代码时加载。 +> **预计加载量**:约 350 行 + +--- + +## 3.13 python-pptx 代码生成 + +### 代码生成核心规则 + +1. **始终先输出完整 Python 脚本文件**,再解释核心步骤 +2. **使用 python-pptx 库**(官方文档:python-pptx.readthedocs.io) +3. **Output 文件路径规则**:生成 `output/` 目录,文件名 = `{课题}_{学科}_{日期}.pptx` +4. 日期格式:YYYYMMDD +5. 确保脚本可直接运行(含必要的 import、main() 入口) + +### 运行前准备 + +- `pip install python-pptx` +- 字体相关:Win/Mac 字体路径不同,需根据平台适配 +- 图片资源:使用占位符路径或随机占位图 API(picsum.photos) + +### 常见字体路径 + +```python +# Windows 字体路径 +FONT_PATH = "C:/Windows/Fonts/" + +# macOS 字体路径 +FONT_PATH = "/System/Library/Fonts/" + +# 常用备选 +font_names = { + "title": "微软雅黑" if is_windows else "PingFang SC", + "body": "微软雅黑" if is_windows else "PingFang SC", + "english": "Arial" if is_windows else "Helvetica", +} +``` + +### 代码生成模板 + +#### 基础框架 + +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +import datetime + +# --- 配置参数 --- +SUBJECT = "学科" +TOPIC = "课题" +TEACHER = "教师姓名" +GRADE = "年级" +COLOR_PRIMARY = RGBColor(0x2D, 0x5A, 0x27) # 主色 +COLOR_SECONDARY = RGBColor(0xF5, 0xF0, 0xE8) # 辅色 +COLOR_ACCENT = RGBColor(0xC2, 0x3B, 0x22) # 强调色 + +prs = Presentation() +prs.slide_width = Inches(13.333) +prs.slide_height = Inches(7.5) + +today = datetime.date.today().strftime("%Y%m%d") +output_path = f"output/{TOPIC}_{SUBJECT}_{today}.pptx" +``` + +#### 辅助函数库 + +```python +def add_textbox(slide, left, top, width, height, text, font_size=18, + font_name=None, bold=False, color=RGBColor(0,0,0), + alignment=PP_ALIGN.LEFT): + """添加文本框的通用函数""" + txBox = slide.shapes.add_textbox(Inches(left), Inches(top), + Inches(width), Inches(height)) + tf = txBox.text_frame + tf.word_wrap = True + p = tf.paragraphs[0] + p.text = text + p.font.size = Pt(font_size) + if font_name: + p.font.name = font_name + p.font.bold = bold + p.font.color.rgb = color + p.alignment = alignment + return txBox + +def add_shape_with_text(slide, left, top, width, height, text, shape_type=MSO_SHAPE.ROUNDED_RECTANGLE, + fill_color=RGBColor(0xE8, 0xE8, 0xE8), font_size=14, + font_color=RGBColor(0,0,0)): + """添加带填充色的形状+文字""" + shape = slide.shapes.add_shape(shape_type, Inches(left), Inches(top), + Inches(width), Inches(height)) + shape.fill.solid() + shape.fill.fore_color.rgb = fill_color + shape.line.fill.background() + tf = shape.text_frame + tf.word_wrap = True + p = tf.paragraphs[0] + p.text = text + p.font.size = Pt(font_size) + p.font.color.rgb = font_color + p.alignment = PP_ALIGN.CENTER + return shape +``` + +### 页面生成规格 + +#### 封面页 A + +```python +def create_cover(prs, subject, topic, teacher, grade): + slide = prs.slides.add_slide(prs.slide_layouts[6]) # 空白布局 + # 背景色填充 + background = slide.background + fill = background.fill + fill.solid() + fill.fore_color.rgb = COLOR_PRIMARY + + # 标题(居中对齐) + add_textbox(slide, 1, 2.5, 11.333, 2, topic, + font_size=44, bold=True, color=COLOR_SECONDARY, + alignment=PP_ALIGN.CENTER) + # 副标题行 + add_textbox(slide, 1, 5, 11.333, 1, f"{subject} · {grade} | {teacher}", + font_size=18, color=COLOR_SECONDARY, alignment=PP_ALIGN.CENTER) + return slide +``` + +#### 其他页面(快速参考) + +| 页面类型 | 创建函数 | 关键元素 | 配色 | +|---------|---------|---------|------| +| 封面 A | `create_cover()` | 标题 + 副标题 | 主色背景 | +| 导入 B | `create_intro()` | 左侧图片占位 + 右侧问题 | 辅色背景 | +| 目标 C | `create_objectives()` | 三栏卡片 | 白色背景 + 色块区分 | +| 知识 D | `create_knowledge()` | 图文混排 | 按层级递进上色 | +| 活动 E | `create_activity()` | 步骤框 + 计时器 | 强调色点缀 | +| 总结 F | `create_summary()` | 知识地图 + 分层作业 | 全色系汇总 | + +各函数签名: + +```python +def create_intro(prs, question, image_path="", keywords=[]): ... +def create_objectives(prs, objectives_by_level): ... +def create_knowledge(prs, layers): ... +def create_activity(prs, name, steps, duration): ... +def create_summary(prs, concept_map, homework_levels): ... +``` + +### 完整脚本模板 + +```python +def main(): + # 1. 初始化 + # 2. 创建各页面(按顺序) + # 3. 保存 + prs.save(output_path) + print(f"✅ PPT 已生成: {output_path}") + +if __name__ == "__main__": + main() +``` + +### Slide Master 编号参考 + +```python +# prs.slide_layouts[0] — 标题幻灯片 +# prs.slide_layouts[1] — 标题和内容 +# prs.slide_layouts[2] — 节标题 +# prs.slide_layouts[3] — 两栏内容 +# prs.slide_layouts[4] — 空白(有占位符) +# prs.slide_layouts[5] — 标题和竖排文字 +# prs.slide_layouts[6] — 完全空白(推荐) +``` + +### 典型布局尺寸(宽屏 16:9) + +| 区域 | 位置 (inches) | 尺寸 | +|------|-------------|------| +| 标题栏 | top=0.5 | height=1.0 | +| 正文区 | top=1.5 | height=5.0 | +| 底部栏 | top=6.5 | height=0.8 | +| 左侧边距 | left=0.5 | width=12.333 | +| 三栏左 | left=0.5 | width=3.7 | +| 三栏中 | left=4.8 | width=3.7 | +| 三栏右 | left=9.1 | width=3.7 | + +--- + +## 3.14 视觉升级代码(扩展) + +### 渐变色背景(替代纯色) + +```python +# python-pptx 不支持渐变直接设置,用形状覆盖实现: +def add_gradient_bg(slide, color_top, color_bottom): + """用两个矩形模拟渐变背景""" + from pptx.util import Inches + # 上半部分 + shape1 = slide.shapes.add_shape( + MSO_SHAPE.RECTANGLE, Inches(0), Inches(0), + Inches(13.333), Inches(3.75)) + shape1.fill.solid() + shape1.fill.fore_color.rgb = color_top + shape1.line.fill.background() + # 下半部分 + shape2 = slide.shapes.add_shape( + MSO_SHAPE.RECTANGLE, Inches(0), Inches(3.75), + Inches(13.333), Inches(3.75)) + shape2.fill.solid() + shape2.fill.fore_color.rgb = color_bottom + shape2.line.fill.background() +``` + +### 时间线进度条 + +```python +def add_timeline(slide, current_section, total_sections): + """在底部添加进度条""" + bar_width = 12.333 + section_width = bar_width / total_sections + for i in range(total_sections): + x = 0.5 + i * section_width + color = COLOR_ACCENT if i < current_section else RGBColor(0xE0, 0xE0, 0xE0) + shape = slide.shapes.add_shape( + MSO_SHAPE.RECTANGLE, Inches(x), Inches(7.0), + Inches(section_width - 0.1), Inches(0.15)) + shape.fill.solid() + shape.fill.fore_color.rgb = color + shape.line.fill.background() +``` + +### 图表集成 + +```python +# 用 add_shape + text 模拟柱状图 +def add_bar_chart(slide, data, left, top, width, height): + """data: [(label, value, color), ...], value 0-100""" + max_val = max(v for _, v, _ in data) + bar_count = len(data) + bar_width = width / (bar_count * 2) + + for i, (label, value, color) in enumerate(data): + bar_h = (value / max_val) * height + x = left + i * (bar_width * 2) + bar_width / 2 + y = top + height - bar_h + bar = slide.shapes.add_shape( + MSO_SHAPE.RECTANGLE, Inches(x), Inches(y), + Inches(bar_width), Inches(bar_h)) + bar.fill.solid() + bar.fill.fore_color.rgb = color + bar.line.fill.background() +``` + +--- + +## 3.16 故事化叙事结构 + +### 三幕式叙事结构 + +``` +第一幕(建立)→ 第二幕(对抗)→ 第三幕(解决) + +第一幕:建立情境 + - 问题:你知道__吗? + - 冲突:但__不是表面那么简单 + - 驱动:让我们一起来揭开__的秘密 + +第二幕:探索过程 + - 尝试:如果是你,你会怎么做?→ 活动1 + - 发现:通过活动1我们发现__ → 还缺什么? + - 深入:那如果再加入__会怎样?→ 活动2 + - 突破:终于发现__的规律! + +第三幕:应用升华 + - 应用:现在用这个规律来解决一个问题 + - 反思:回顾今天的学习旅程,你最大的收获是? + - 延伸:这个问题在真实世界中还出现在哪里? +``` + +### 叙事节奏格 + +| 时间点 | 叙事要素 | 情感曲线 | +|--------|---------|---------| +| 0-3min | 导入惊喜/认知冲突 | ↗ 上升 | +| 3-8min | 基础概念建立 | → 平稳 | +| 8-15min | 第一次挑战/活动 | ↗↘ 小高潮 | +| 15-25min | 深入探究 | → 平稳 | +| 25-35min | 创造力释放/展示 | ↗ 大高潮 | +| 35-40min | 总结升华/情感共鸣 | ↘ 温暖收尾 | + +### 故事化过渡句 + +- "经过刚才的探索,我们拿到了第一把'钥匙'——但真正的宝藏还在后面。" +- "现在暂停一下,想想看——如果故事在这里结束,你会满意吗?不会,因为最精彩的部分才刚刚开始。" +- "这是爱因斯坦小时候也问过的问题——他用了十年才找到答案,而今天,你们只用一节课。" + +--- + +## 课后分层作业模板(代码生成) + +```python +def create_homework_slide(prs, basic, challenge, creative): + """基础/挑战/创意三层作业""" + slide = prs.slides.add_slide(prs.slide_layouts[6]) + # 标题 + add_textbox(slide, 0.5, 0.3, 12, 0.8, "📋 课后探索任务", + font_size=32, bold=True, color=COLOR_PRIMARY, + alignment=PP_ALIGN.CENTER) + columns = [ + ("⭐ 基础任务", basic, COLOR_PRIMARY), + ("🚀 挑战任务", challenge, COLOR_ACCENT), + ("🎨 创意任务", creative, RGBColor(0x7B, 0x1F, 0xA2)), + ] + for i, (title, content, color) in enumerate(columns): + x = 0.5 + i * 4.2 + add_shape_with_text(slide, x, 1.5, 3.8, 0.6, title, + fill_color=color, font_size=18, font_color=RGBColor(0xFF,0xFF,0xFF)) + add_textbox(slide, x, 2.3, 3.8, 4, content, font_size=14) + return slide +``` + +--- + +## 文件引用索引 + +本文件被核心 `SKILL.md` 在工作流程 Phase 3.13-3.14 中引用。 +关联文件:`references/ppt-design-guide.md`(设计规范)、`scripts/ppt_generator.py`(已有脚本) diff --git a/skills/classroom-inspiration/references/presentation-guide.md b/skills/classroom-inspiration/references/presentation-guide.md new file mode 100644 index 00000000..16cf786e --- /dev/null +++ b/skills/classroom-inspiration/references/presentation-guide.md @@ -0,0 +1,146 @@ +# 演讲与逐字稿指导 + +> **加载条件**:当进入 Phase 3 的逐字稿撰写阶段(3.11),或用户要求撰写说课稿、演讲逐字稿时加载。 +> **预计加载量**:约 150 行 + +--- + +## 3.10 演讲技巧 + +### 3.10.1 教师语言设计对比 + +| 场景 | 说课 | 模拟授课 | 实际授课 | +|------|------|----------|----------| +| 对象 | 评委/教研员 | 评委(无学生) | 真实学生 | +| 口吻 | 专业、自信、展示设计 | 模拟对学生说话 | 自然、互动、灵活 | +| 内容要点 | 理论依据+设计意图 | 精简版真实课堂 | 完整课堂流程 | +| 时间 | 10-15min | 10-15min | 40-45min | +| 板书 | 配合展示板书设计 | 现场写板书 | 常态化板书 | + +### 3.10.2 过渡语设计 + +| 环节 | 过渡语示例 | +|------|-----------| +| 导入→新授 | "刚才的视频引发了大家的思考,那么到底__背后的原理是什么呢?让我们一起来探究。" | +| 新授→活动 | "理论我们已经了解了,现在轮到你们来当小小科学家——" | +| 活动→展示 | "我看到各小组都有了精彩的发现,哪个小组愿意第一个来分享?" | +| 展示→总结 | "同学们的发现让老师眼前一亮,现在我们一起来梳理一下今天的关键收获。" | +| 总结→作业 | "课上的时间有限,课后还有更多有趣的问题等着大家去探索——" | + +### 3.10.3 互动语言技巧 + +- **候答时间**(提问后等待 3-5 秒):让学生有机会思考,不要急着重复问题 +- **追问链**:答案 → "你是怎么想到的?" → "还有不同的看法吗?" +- **反馈分类**: + +| 学生回答 | 教师反馈 | +|----------|----------| +| 正确 | "非常准确,而且你用了__这个词/方法,说明你已经掌握了__。" | +| 部分正确 | "你的方向是对的,特别提到了__,但如果从__的角度再看呢?" | +| 错误 | "很有趣的想法,这个角度很多人第一次也会想到,让我们看看实际/数据是怎么说的——" | +| 创意 | "这个思路太棒了!老师都没想到,能再给大家详细说说你的推理吗?" | +| 不答 | "没关系,这个问题确实有挑战性,你先听听其他同学的想法——" | + +--- + +## 3.11 逐字稿撰写规范 + +### 逐字稿结构模板 + +``` +【环节一:导入】(预计 3 分钟) + +教师:【引入语】(情境/问题/故事...) +预设学生反应:【...】 +教师:【追问/衔接】 +过渡:【课件翻页/板书】 + +【环节二:新授】(预计 12 分钟) + +... +``` + +### 好逐字稿的特征 + +- **口语化**:把"综上所述"改为"所以",把"由此可见"改为"你看" +- **有留白**:标注 (停顿 3 秒)、(等待学生回答)、(巡视指导) +- **备预案**:每个问题都写一种"预设回答"和对应反馈 +- **有感情**:标注语气提示(用惊叹、轻声、强调的方式读) + +### 逐字稿模板(可复制使用) + +``` +┌─────────────────────────────────────────────┐ +│ 课题:________________ 时长:____分钟 │ +│ 环节:□导入 □新授 □活动 □展示 □总结 │ +│ │ +│ 教师: │ +│ ________________________________________ │ +│ 学生预设反应: │ +│ ________________________________________ │ +│ 教师反馈/追问: │ +│ ________________________________________ │ +│ 过渡指令(翻页/板书/换活动): │ +│ ________________________________________ │ +│ 时间记录:____:____ 实际用时:____ │ +└─────────────────────────────────────────────┘ +``` + +### 时间节奏卡(公开课标准版) + +| 环节 | 时间 | 占比 | +|------|------|------| +| 导入 | 3-5 min | 8-12% | +| 新授+互动 | 15-20 min | 38-50% | +| 活动+展示 | 10-15 min | 25-38% | +| 总结+作业 | 3-5 min | 8-12% | +| 弹性 | 2-3 min | 5% | + +--- + +## 3.12 学科案例示范 + +### A 语文·《背影》——"情感细节实验室" + +``` +驱动问题:父爱是否一定要"说出来"? +创意形式:细节证据墙 + 角色朗读录音棚 + 情感曲线图 +逐字稿片段: + "同学们,朱自清看到父亲的背影流了四次眼泪。现在请你们化身'情感侦探', + 在课文中找出每个流泪场景的'触发词'——是什么具体细节让他落泪?" +``` + +- 分层任务:基础—找出四次流泪的位置;进阶—分析每次流泪的情感层次;挑战—对比你生活中类似的"背影时刻" + +### B 数学·《黄金分割》——"美学研究所" + +``` +驱动问题:为什么有些东西看起来特别"顺眼"? +创意形式:审美实验投票 + 人体黄金比例测量 + 名画构图分析 +逐字稿片段: + "让我们来做一个小实验——老师这里有三个不同比例的长方形, + 请大家凭直觉投票选出最'舒服'的一个。(停顿,收集投票) + 结果几乎全部选择了中间这个,它的长宽比正好是 1:1.618——这就是黄金分割。" +``` + +- 分层任务:基础—计算黄金分割比;进阶—在 3 张世界名画中标注黄金分割线;挑战—用黄金分割设计一份海报 + +### C 英语·《Travel》——"环球旅行策划师" + +``` +驱动问题:如何为国际友人设计一天的中国城市体验? +创意形式:旅行策划工作坊 + 情景对话视频拍摄 + 城市文化竞标会 +逐字稿片段: + "Your mission today: design a one-day cultural experience in our city for a + foreign friend. You have a budget of 500 yuan and must include at least one + historical site and one local food experience. Go!" +``` + +- 分层任务:基础—制作行程清单;进阶—撰写景点介绍文案;挑战—录制 2 分钟英文导览视频 + +--- + +## 文件引用索引 + +本文件被核心 `SKILL.md` 在工作流程 Phase 3(3.10-3.12 演讲/逐字稿/学科案例)中引用。 +关联文件:`references/ppt-design-guide.md`(PPT 设计)、`references/pptx-codegen.md`(PPT 代码生成) diff --git a/skills/classroom-inspiration/references/supplementary.md b/skills/classroom-inspiration/references/supplementary.md new file mode 100644 index 00000000..247e4a5a --- /dev/null +++ b/skills/classroom-inspiration/references/supplementary.md @@ -0,0 +1,389 @@ +# 补充教学资源 + +> **加载条件**:当用户需求涉及以下领域之一时,按需加载对应章节: +> - 作业设计 → 加载"作业设计工具箱" +> - 差异化/特殊教育 → 加载"差异化教学与融合教育" +> - 课堂管理 → 加载"创意课堂管理" +> - 说课/评课 → 加载"说课与评课指导" +> - 前沿趋势 → 加载"前沿趋势与工具" +> - 多元评价 → 加载"多元评价体系" +> **预计总加载量**:约 350 行(可逐节独立加载) + +--- + +## 一、作业设计工具箱 + +### 作业的 3×3 矩阵 + +| 维度 | 基础层 | 挑战层 | 创意层 | +|------|--------|--------|--------| +| 知识维度 | 复述/识记类 | 应用/分析类 | 评价/创造类 | +| 形式维度 | 书面作业 | 实践作业 | 跨媒体作业 | +| 交互维度 | 独立完成 | 同伴合作 | 家长/社区参与 | + +### 创意作业类型 + +1. **可视化作业**:思维导图、知识海报、信息图、概念卡通 +2. **表达类作业**:3 分钟演讲、播客录制、短视频、小报 +3. **实践类作业**:家庭小实验、社区调查、模型制作、种植记录 +4. **创作类作业**:续写故事、原创剧本、作词作曲、设计游戏 +5. **反思类作业**:学习日志、KWL 反思表、错误分析报告、自我评价 + +### 作业设计检查清单 + +- [ ] 是否有选择权(学生可以选择不同难度/形式)? +- [ ] 是否有真实性(与现实生活产生连接)? +- [ ] 是否有创造性(不仅仅是复述/重复)? +- [ ] 是否有反馈机制(评价量规/同伴互评/教师反馈)? +- [ ] 是否有适当挑战性(在最近发展区内)? +- [ ] 时间是否合理(基础层 ≤ 15min,挑战层 ≤ 25min)? + +--- + +## 二、差异化教学与融合教育 + +### 差异化策略矩阵 + +| 维度 | 差异化方式 | 实施策略 | +|------|-----------|---------| +| **内容** | 不同难度/复杂度 | 分层阅读材料、多模态输入(文字/音频/视频/图形) | +| **过程** | 不同学习方式 | 学习站/任务卡、灵活分组(异质/同质/兴趣) | +| **产出** | 不同表达形式 | 选择板(口头/书面/画图/表演/模型) | +| **环境** | 不同学习空间 | 安静角/协作区/独立工作区调整 | + +### 分层教学具体操作 + +**任务卡分层模式(推荐)**: + +> **青铜卡**(全班必达)——基础知识和基本技能 +> **白银卡**(大部分选做)——应用和分析 +> **黄金卡**(拓展挑战)——评价和创造 + +**例:英语阅读课**: +- 青铜:找出文中 5 个关键词并写出中文意思 +- 白银:用关键词复述文章大意(口头/书面均可) +- 黄金:续写文章结局,至少用 3 个新学的句式 + +### 课堂话术(不贴标签版) + +``` +❌ "第一组是基础组,做简单任务;第二组是提高组..." +✅ "每个组都有三个任务卡:铜卡、银卡、金卡。先完成铜卡,时间充裕再挑战后面的。" +❌ "小明你基础差,做这道题就好。" +✅ "小明,这道题先试试,有困难随时举手,我们一起来看看。" +``` + +### 特殊教育需求支持速查 + +| 需求类型 | 课堂支持策略 | +|---------|-------------| +| 阅读障碍 | 音频版材料 + 大字排版 + 阅读搭档 | +| 注意力缺陷 | 分段任务(每段≤10min)+ 视觉计时器 + 正强化 | +| 自闭谱系 | 明确规则 + 视觉日程卡 + 提前告知变化 | +| 学习迟缓 | 同伴辅导 + 简化步骤 + 多感官教学 | +| 情绪行为障碍 | 冷静角 + 情绪识别训练 + 正向行为支持 | + +--- + +## 三、多元评价体系 + +### 评价类型 + +``` +形成性评价(课堂中) +├── 提问与候答 +├── 课堂观察记录 +├── 学习日志/反思卡 +├── 一分钟论文(下课前一分钟写"今天学到最重要的内容是...") +├── Exit Ticket(出门条:3-2-1 回顾) +└── 同伴互评 + +总结性评价(单元末/期末) +├── 传统测试 +├── 项目作品评价 +├── 档案袋评价 +└── 表现性任务评价 +``` + +### 表现性评价设计模板 + +| 要素 | 说明 | +|------|------| +| 任务情境 | 真实或有意义的场景描述 | +| 角色 | 学生扮演什么角色 | +| 受众 | 产出面对的对象 | +| 产出 | 具体要交付什么 | +| 标准 | 什么算做得好的明确描述 | + +### 评价量规示例(4 级) + +``` +4 - 卓越:超越要求,展现出创新或深刻的见解 +3 - 达标:完整满足所有要求,无明显缺陷 +2 - 发展中:满足部分要求,存在明显改进空间 +1 - 初阶:未能满足基本要求,需要显著提升 +``` + +--- + +## 四、设计原则与认知科学 + +### 认知负荷管理 + +| 原则 | 课堂操作 | +|------|---------| +| 分段呈现 | 复杂内容拆分为 ≤3 个步骤,逐步呈现 | +| 双重编码 | 文字+图像同步呈现(不是先后) | +| 消除冗余 | 删除任何非必要的装饰性内容 | +| 示例效应 | 先给完整示例,再让学生独立尝试 | +| 变式练习 | 同一概念用 3 种不同情境操练 | + +### 记忆曲线应用 + +``` +首次学习 → 24h 内第一次复习 → 7天内第二次复习 → 30天内第三次复习 + +课堂嵌入方法: + 每节课前 3 分钟:快速回顾上节课核心 + 每节课最后 3 分钟:总结了本节课接着预告下次连接 + 单元开始前:激活前备知识("你还记得我们学过___吗?") +``` + +### 学习动机设计(ARCS 模型) + +| 要素 | 课堂策略 | +|------|---------| +| A - Attention | 认知冲突、神秘事件、真实情境、幽默引入 | +| R - Relevance | 与生活连接、与个人兴趣连接、展示实用价值 | +| C - Confidence | 设置可达成目标、提供脚手架、归因引导 | +| S - Satisfaction | 即时反馈、展示进步、庆祝成就 | + +--- + +## 五、创意课堂管理(积分系统与规则设计) + +### 分组策略 + +| 分组方式 | 适用场景 | 操作方式 | +|---------|---------|---------| +| 异质分组 | 日常探究活动 | 按成绩、性别、性格混合搭配 | +| 同质分组 | 分层教学 | 按能力水平分组,不同组不同任务 | +| 兴趣分组 | 项目式学习 | 学生按主题兴趣自由选择 | +| 随机分组 | 活跃气氛 | 抽签/颜色/数字/拼图碎片配对 | +| 固定小组 | 长期合作 | 学期初分组,贯穿整学期 | + +### 小组积分系统 + +``` +基础规则: + ✓ 合作加分:全员参与 +2 + ✓ 优质发言:+3 + ✓ 帮助他人:+1 + ✓ 创新点子:+5 + ✗ 课堂干扰:-1 + +每周结算: + 冠军组:免一次作业 / 选座位权 + 进步组:一次"求助卡"(可向老师求助一次) +``` + +### 课堂口令与节奏 + +| 教师 | 学生 | +|------|------| +| "Attention" | "Eyes on me" | +| "Class class" | "Yes yes" | +| "三二一" | "木头人" | +| "最高品质" | "静悄悄" | +| "时间到" | "坐坐好" | + +### 混龄课堂策略 + +- **伙伴阅读**:高年级读给低年级听 / 低年级提问高年级回答 +- **跨龄项目组**:大带小完成项目,大孩子锻炼领导力,小孩子获得帮助 +- **兄弟班制**:两个年级配对,定期一起活动 + +--- + +## 六、说课与评课指导 + +### 说课评分标准 + +| 维度 | 权重 | 优秀(9-10) | 达标(7-8) | 待提升(≤6) | +|------|------|-------------|------------|-------------| +| 教材分析 | 15% | 定位准确+创新解读 | 定位准确 | 分析肤浅 | +| 学情分析 | 15% | 精准+有数据支撑 | 基本准确 | 模糊/公式化 | +| 目标设定 | 20% | 三维目标具体可评 | 目标清晰 | 空泛/笼统 | +| 教学过程 | 30% | 环环相扣+有亮点 | 流程完整 | 平铺直叙 | +| 板书设计 | 10% | 结构美观+知识可视化 | 清晰完整 | 混乱或缺失 | +| 教学反思 | 10% | 真诚+有深度+有改进 | 有一定反思 | 敷衍/缺席 | + +### 说课稿结构模板 + +``` +一、说教材(2分钟) + 1. 本课在单元/学段中的定位 + 2. 核心素养指向 + 3. 教学重难点 + +二、说学情(1-2分钟) + 1. 学生已有知识和经验 + 2. 可能遇到的困难 + 3. 对应策略 + +三、说目标(1分钟) + 1. 三维/核心素养目标 + 2. 目标间的逻辑关系 + +四、说教法学法(1-2分钟) + 1. 主要教学方法及依据 + 2. 学生学法指导 + +五、说教学过程(3-5分钟) + 1. 各环节设计意图 + 2. 重点环节详述(为什么这样设计?学生会有何反应?) + 3. 板书生成过程 + +六、说反思与亮点(1-2分钟) + 1. 本课最大创新点 + 2. 预设与生成的应对 + 3. 改进方向 +``` + +### 观课评课框架 + +**LICC 范式**: + +| 维度 | 观察点示例 | +|------|-----------| +| L-学生学习 | 参与度、目标达成度、思维深度 | +| I-教师教学 | 环节设计、提问质量、反馈方式 | +| C-课程性质 | 目标适切性、内容科学性、资源运用 | +| C-课堂文化 | 思考、民主、创新、关爱 | + +--- + +## 七、实战案例研究 + +### 案例一:阅读课"反套路"设计 + +**常规**:讲课文→分析段落→总结中心思想→做练习 +**反套路**: + +``` +悬念引入 → 角色朗读(每人一个角色,带感情) → 情节预测(读到一半暂停,猜测结局) +→ 原文对照 → 改写结局(创意写作) → 投票选出最佳改编 +``` + +**效果**:学生参与度从 60%→95%,期末阅读兴趣调查提升 40% + +### 案例二:数学复习课"超市大采购" + +**常规**:发卷子→做题→对答案→讲错题 +**创新**: + +``` +教室布置成"超市",每个"货架"一个知识点 +每个"商品"上贴一道题,分"特价"(基础)"新品"(中等)"进口"(挑战)三个价位 +学生有"购物基金"100 元,用买题做对挣"积分" +期末"积分"兑换奖励 +``` + +**效果**:全班主动完成 3 倍于平时的练习量 + +### 案例三:新课标核心素养落地 + +以"数据意识"培养为例: + +``` +传统:给数据→算平均数→做习题 +新课标:提出问题→收集数据(全班调查)→整理数据(制作统计表/图) +→分析数据(发现了什么?为什么?)→基于数据的决策建议 +→反思数据采集过程是否有偏差 +``` + +**关键转变**:从"计算"转向"全流程数据素养" + +--- + +## 八、适用对象与使用说明 + +| 用户群体 | 使用方式 | 预期效果 | +|---------|---------|---------| +| 新手教师(1-3 年) | 按标准流程设计 | 完整教案+PPT+逐字稿 | +| 骨干教师(4-10 年) | 选择性使用创意形式 | 突破设计瓶颈 | +| 教研组长 | 参考评课框架 | 提升教研质量 | +| 师范生 | 按完整流程练习 | 掌握设计方法论 | + +--- + +## 九、前沿趋势 + +### 生成式 AI 教学应用 + +- **备课辅助**:AI 生成差异化材料、改编难度 +- **课堂互动**:AI 角色扮演历史人物/科学概念 +- **作业批改**:AI 辅助初筛+人工复核 +- **个性化学习**:AI 自适应练习系统 +- **注意**:AI 是工具不是替代,教师专业判断始终是核心 + +### 游戏化教学进阶 + +- **叙事型**:完整故事线贯穿学期(如"魔法学院"一年制课程) +- **积分型**:经验值+技能树+成就徽章 +- **社交型**:排行榜+协作任务+公会系统 +- **元游戏型**:学生参与设计游戏规则 + +### 大单元教学 / 跨学科 + +- 打破 45 分钟单课,设计 2-4 周主题单元 +- 以核心概念(如"系统""模式""变化")统领 +- 各学科围绕主题贡献学科视角 +- 评价方式:档案袋+表现性任务+传统测试的组合 + +--- + +## 十、参考资料索引 + +### 教学理论 + +- 《追求理解的教学设计》(UbD) - Grant Wiggins & Jay McTighe +- 《首要教学原理》- M. David Merrill +- 《教学设计原理》- Gagné +- 《学习、教学和评估的分类学》- Anderson & Krathwohl +- 《可见的学习》- John Hattie + +### 课堂实践 + +- 《如何成为高效能教师》- Harry Wong +- 《第 56 号教室的奇迹》- Rafe Esquith +- 《追求理解的教学设计》案例集 +- PBL Works (pblworks.org) — 项目式学习资源 + +### 技术参考 + +- python-pptx 官方文档:python-pptx.readthedocs.io +- Canva 教育版:canva.com +- Gamma AI 演示:gamma.app +- iSlide PPT 插件:islide.cc + +### 课程标准 + +- 《义务教育课程标准(2022 年版)》 +- 《普通高中课程标准(2020 年修订版)》 +- 《中国学生发展核心素养》 + +### 在线教研平台 + +- 一师一优课:nationalclassroom.edu.cn +- 教研网:zj.zgjiaoyan.com +- 学科网:zxxk.com +- Bilibili 教学区:搜索"公开课""说课" +- 小红书教师社区:搜索"公开课""教学设计" + +--- + +## 文件引用索引 + +本文件被核心 `SKILL.md` 在工作流程的各阶段按需引用(作业设计、课堂管理、说课评课、趋势参考等)。 +关联文件:`references/case-library.md`(创意案例库)、`references/ppt-design-guide.md`(PPT 设计规范) diff --git a/skills/classroom-inspiration/scripts/coverage-checker.py b/skills/classroom-inspiration/scripts/coverage-checker.py new file mode 100644 index 00000000..d9b09b4d --- /dev/null +++ b/skills/classroom-inspiration/scripts/coverage-checker.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +知识点覆盖完整性检测工具 +输入知识点清单和教学活动,检查每项知识点是否有对应活动覆盖 +用法: python coverage-checker.py --file coverage.json +""" +import sys, json + +def check_coverage(knowledge_points, activities): + """ + knowledge_points: [{"id":"K01","name":"...","level":"must/should/optional"}] + activities: [{"name":"环节名","covers":["K01","K02"]}] + """ + must_points = [kp for kp in knowledge_points if kp.get("level") == "must"] + all_points = {kp["id"]: kp for kp in knowledge_points} + + covered = set() + activity_map = {} + for act in activities: + for kid in act.get("covers", []): + covered.add(kid) + if kid not in activity_map: + activity_map[kid] = [] + activity_map[kid].append(act["name"]) + + missing_must = [kp for kp in must_points if kp["id"] not in covered] + uncovered = [kp for kp in knowledge_points if kp["id"] not in covered] + + coverage_rate = round(len(covered) / len(knowledge_points) * 100) if knowledge_points else 0 + must_coverage = round((len(must_points) - len(missing_must)) / len(must_points) * 100) if must_points else 100 + + issues = [] + if missing_must: + issues.append(f"必备知识点未覆盖:{', '.join(k['name'] for k in missing_must)}") + if coverage_rate < 100: + issues.append("存在知识点未被任何活动环节覆盖") + + return { + "summary": { + "total_points": len(knowledge_points), + "covered": len(covered), + "coverage_rate": coverage_rate, + "must_coverage_rate": must_coverage, + "score": min(100, must_coverage) + }, + "missing_must": [k["name"] for k in missing_must], + "uncovered_all": [k["name"] for k in uncovered], + "activity_map": activity_map, + "issues": issues, + "assessment": "覆盖完整" if not issues else "覆盖不全,请补充" + } + + +def main(): + if len(sys.argv) > 1 and sys.argv[1] == '--file': + data = json.load(open(sys.argv[2], 'r', encoding='utf-8')) + else: + data = json.load(sys.stdin) + report = check_coverage(data.get("knowledge_points", []), data.get("activities", [])) + print(json.dumps(report, ensure_ascii=False, indent=2)) + +if __name__ == '__main__': + main() diff --git a/skills/classroom-inspiration/scripts/objective-validator.py b/skills/classroom-inspiration/scripts/objective-validator.py new file mode 100644 index 00000000..c8bdca92 --- /dev/null +++ b/skills/classroom-inspiration/scripts/objective-validator.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +教学目标可观测性检测工具 +输入一组教学目标,检测动词可观测性 + ABCD结构完整性 + 层级分布 +用法: python objective-validator.py --file objectives.json +""" +import sys, json, re + +# 可观测动词词库 +OBSERVABLE_VERBS = { + # 识记层 + "说出": "识记", "写出": "识记", "列举": "识记", "复述": "识记", + "背诵": "识记", "回忆": "识记", "辨认": "识记", "指出": "识记", + "标注": "识记", "画出": "识记", "圈画": "识记", "标出": "识记", + "填写": "识记", "连线": "识记", "排序": "识记", + # 理解层 + "解释": "理解", "说明": "理解", "描述": "理解", "概述": "理解", + "归纳": "理解", "总结": "理解", "比较": "理解", "区分": "理解", + "举例": "理解", "翻译": "理解", "表达": "理解", "梳理": "理解", + "概括": "理解", "推断": "理解", "转化": "理解", + # 应用层 + "运用": "应用", "解决": "应用", "计算": "应用", "操作": "应用", + "演示": "应用", "制作": "应用", "设计": "应用", "使用": "应用", + "修改": "应用", "策划": "应用", + # 分析层 + "分析": "分析", "分解": "分析", "对比": "分析", "论证": "分析", + "探究": "分析", "挖掘": "分析", "梳理": "分析", "剖析": "分析", + "鉴赏": "分析", "赏析": "分析", + # 评价层 + "评价": "评价", "评判": "评价", "鉴定": "评价", "辩护": "评价", + "批判": "评价", "论证": "评价", "判断": "评价", + # 创造层 + "创作": "创造", "编写": "创造", "设计": "创造", "构建": "创造", + "提出": "创造", "规划": "创造", "开发": "创造", + # 行为/活动类(不适用布鲁姆但有可观测性) + "朗读": "识记", "默读": "识记", "查阅": "识记", "收集": "识记", + "讨论": "理解", "交流": "理解", "分享": "理解", "表演": "应用", + "角色扮演": "应用", "调查": "分析", +} + +# 模糊动词(不可观测) +FUZZY_VERBS = ["理解", "了解", "掌握", "熟悉", "认识", "体会", "感受", + "感悟", "领会", "懂得", "知道", "明白", "学会", "意识到"] + +BLOOM_LEVEL = { + "识记": 1, "理解": 2, "应用": 3, "分析": 4, "评价": 5, "创造": 6 +} + +def analyze_objectives(objectives): + results = [] + pass_count = 0 + for obj in objectives: + verbs_found = [] + bloom_levels = [] + for v, level in OBSERVABLE_VERBS.items(): + if v in obj: + verbs_found.append((v, level)) + bloom_levels.append(BLOOM_LEVEL.get(level, 0)) + + fuzzy_found = [v for v in FUZZY_VERBS if v in obj] + + # ABCD检查 + has_condition = bool(re.search(r'通过|借助|利用|根据|结合|在.*?后|阅读|观察', obj)) + has_degree = bool(re.search(r'\d+%|至少|不少于|以内|以上|左右|正确|完整|清晰', obj)) + abcd_count = sum([1, has_condition, has_degree]) + + if verbs_found: + best_verb = max(verbs_found, key=lambda x: BLOOM_LEVEL.get(x[1], 0)) + pass_count += 1 + status = "pass" + suggestion_parts = [] + if not has_condition: + suggestion_parts.append("建议补充行为条件(通过什么方式/借助什么工具来完成)") + if not has_degree: + suggestion_parts.append("建议补充表现程度(做到什么程度算达标)") + suggestion = ";".join(suggestion_parts) if suggestion_parts else "合格" + else: + best_verb = (None, None) + status = "fail" + suggestion = "请为教学目标添加明确的行为动词,如「说出」「列举」「解释」「运用」等" + if not has_condition: + suggestion += ";建议补充行为条件" + if not has_degree: + suggestion += ";建议补充表现程度" + + results.append({ + "objective": obj, + "status": status, + "verbs_found": [v[0] for v in verbs_found], + "bloom_level": best_verb[1] if best_verb[1] else "未识别", + "fuzzy_verbs": fuzzy_found, + "abcd": {"condition": has_condition, "degree": has_degree, "complete": abcd_count}, + "suggestion": suggestion + }) + + # 层级分布推断 + bloom_counts = {"识记": 0, "理解": 0, "应用": 0, "分析": 0, "评价": 0, "创造": 0} + for r in results: + if r["bloom_level"] in bloom_counts: + bloom_counts[r["bloom_level"]] += 1 + + quality = int(pass_count / len(objectives) * 100) if objectives else 0 + return { + "summary": {"total": len(objectives), "pass": pass_count, "quality_score": quality}, + "objectives": results, + "bloom_distribution": bloom_counts, + "assessment": "优秀" if quality >= 80 else "良好" if quality >= 60 else "需修改" + } + + +def main(): + if len(sys.argv) > 1 and sys.argv[1] == '--file': + data = json.load(open(sys.argv[2], 'r', encoding='utf-8')) + else: + data = json.load(sys.stdin) + report = analyze_objectives(data.get('objectives', [])) + print(json.dumps(report, ensure_ascii=False, indent=2)) + +if __name__ == '__main__': + main() diff --git a/skills/classroom-inspiration/scripts/ppt_generator.py b/skills/classroom-inspiration/scripts/ppt_generator.py new file mode 100644 index 00000000..74db9610 --- /dev/null +++ b/skills/classroom-inspiration/scripts/ppt_generator.py @@ -0,0 +1,502 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +课堂灵感生成器 · PPT 生成模块 +================================= +使用 python-pptx 生成教学课件。 +基于 SKILL.md 第 3.13~3.14 节的规范实现。 + +用法: + from ppt_generator import PPTBuilder + builder = PPTBuilder() + builder.add_cover("闯关三连 · 直线与圆", "高二数学 · 选择性必修第一册") + builder.add_slide(...) + builder.save("C:\\Users\\...\\课件.pptx") +""" + +import os +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +from pptx.oxml.ns import qn + +# ───────────────────────────────────────────── +# 配色方案(学科预设) +# ───────────────────────────────────────────── +SCHEMES = { + "math": { # 数学 + "primary": RGBColor(0x1A, 0x3C, 0x6E), + "secondary": RGBColor(0x5B, 0x9B, 0xD5), + "accent": RGBColor(0xF0, 0x8C, 0x00), + "bg": RGBColor(0xFF, 0xFF, 0xFF), + "light_bg": RGBColor(0xF0, 0xF2, 0xF5), + "text": RGBColor(0x2C, 0x2C, 0x2C), + "muted": RGBColor(0x99, 0x99, 0x99), + "white": RGBColor(0xFF, 0xFF, 0xFF), + "success": RGBColor(0x2E, 0x9E, 0x8F), + "warning": RGBColor(0xE8, 0x85, 0x2E), + "purple": RGBColor(0x7B, 0x4E, 0xA3), + }, + "chinese": { # 语文 + "primary": RGBColor(0x8B, 0x45, 0x13), + "secondary": RGBColor(0xD2, 0x69, 0x1E), + "accent": RGBColor(0xFF, 0xD7, 0x00), + "bg": RGBColor(0xFF, 0xFF, 0xFF), + "light_bg": RGBColor(0xF9, 0xF5, 0xF0), + "text": RGBColor(0x2C, 0x2C, 0x2C), + "muted": RGBColor(0x99, 0x99, 0x99), + "white": RGBColor(0xFF, 0xFF, 0xFF), + }, + "default": { + "primary": RGBColor(0x2B, 0x57, 0x9A), + "secondary": RGBColor(0x5B, 0x9B, 0xD5), + "accent": RGBColor(0xE8, 0x6C, 0x00), + "bg": RGBColor(0xFF, 0xFF, 0xFF), + "light_bg": RGBColor(0xF5, 0xF5, 0xF5), + "text": RGBColor(0x2C, 0x2C, 0x2C), + "muted": RGBColor(0x99, 0x99, 0x99), + "white": RGBColor(0xFF, 0xFF, 0xFF), + }, +} + +def _set_font(run, name="微软雅黑", size=None, bold=False, color=None): + """设置字体(含东亚字体回退)""" + run.font.name = name + if size: + run.font.size = Pt(size) + run.font.bold = bold + if color: + run.font.color.rgb = color + rPr = run._r.get_or_add_rPr() + rPr.set(qn('a:ea'), name) + rPr.set(qn('a:latin'), name) + +def _add_textbox(slide, left, top, width, height): + return slide.shapes.add_textbox(left, top, width, height) + +def _set_para(p, text, size=14, color=None, bold=False, align=PP_ALIGN.LEFT, spacing=None): + p.text = text + _set_font(p.runs[0] if p.runs else p.add_run(), size=size, bold=bold, color=color) + p.alignment = align + if spacing: + p.line_spacing = Pt(spacing) + return p + +def _add_shape(slide, left, top, width, height, fill_color=None, line_color=None, line_width=None): + shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height) + shape.line.fill.background() + if fill_color: + shape.fill.solid() + shape.fill.fore_color.rgb = fill_color + if line_color: + shape.line.color.rgb = line_color + if line_width: + shape.line.width = Pt(line_width) + return shape + +def _add_para(tf, text, size=14, color=None, bold=False, align=PP_ALIGN.LEFT, space_before=Pt(2)): + p = tf.add_paragraph() + p.text = text + _set_font(p.runs[0] if p.runs else p.add_run(), size=size, bold=bold, color=color) + p.alignment = align + p.space_before = space_before + return p + +class PPTBuilder: + """PPT 课件构建器""" + + SLIDE_W = Inches(13.333) + SLIDE_H = Inches(7.5) + + def __init__(self, scheme="default"): + self.prs = Presentation() + self.prs.slide_width = self.SLIDE_W + self.prs.slide_height = self.SLIDE_H + self.c = SCHEMES.get(scheme, SCHEMES["default"]) + self._page_num = 0 + + # ── 基础幻灯片类型 ────────────────────── + + def add_blank_slide(self): + self._page_num += 1 + return self.prs.slides.add_slide(self.prs.slide_layouts[6]) + + # ── 1. 封面 ────────────────────────────── + + def add_cover(self, title, subtitle="", teacher="", extra_info="", + bg_color=None, accent_color=None): + """全幅深色背景 + 标题 + 装饰色条""" + slide = self.add_blank_slide() + bg = bg_color or self.c["primary"] + _add_shape(slide, Inches(0), Inches(0), self.SLIDE_W, self.SLIDE_H, fill_color=bg) + + # 装饰性色块 + ac = accent_color or self.c["accent"] + _add_shape(slide, Inches(0), Inches(0), Inches(0.3), self.SLIDE_H, fill_color=ac) + + # 主标题 + txb = _add_textbox(slide, Inches(1.5), Inches(1.8), Inches(10), Inches(1.5)) + _set_para(txb.text_frame.paragraphs[0], title, size=44, color=self.c["white"], bold=True) + + # 副标题 + if subtitle: + txb = _add_textbox(slide, Inches(1.5), Inches(3.3), Inches(10), Inches(0.8)) + _set_para(txb.text_frame.paragraphs[0], subtitle, size=22, color=RGBColor(0xBB, 0xCC, 0xDD)) + + # 分隔线 + _add_shape(slide, Inches(1.5), Inches(4.3), Inches(3), Inches(0.05), fill_color=ac) + + # 教师/课时信息 + if teacher: + txb = _add_textbox(slide, Inches(1.5), Inches(4.8), Inches(8), Inches(0.5)) + _set_para(txb.text_frame.paragraphs[0], teacher, size=18, color=RGBColor(0xCC, 0xDD, 0xEE)) + + if extra_info: + txb = _add_textbox(slide, Inches(1.5), Inches(5.4), Inches(8), Inches(0.5)) + _set_para(txb.text_frame.paragraphs[0], extra_info, size=16, color=RGBColor(0xAA, 0xBB, 0xCC)) + + # 底部装饰条 + _add_shape(slide, Inches(0), Inches(7.0), self.SLIDE_W, Inches(0.5), fill_color=ac) + + return slide + + # ── 2. 内容页(标题栏 + 白色内容区) ──── + + def add_content_slide(self, title, subtitle="", body_func=None): + """标准内容页:深蓝标题栏 + 白色正文区""" + slide = self.add_blank_slide() + # 标题栏 + _add_shape(slide, Inches(0), Inches(0), self.SLIDE_W, Inches(1.1), fill_color=self.c["primary"]) + txb = _add_textbox(slide, Inches(0.6), Inches(0.15), Inches(12), Inches(0.7)) + _set_para(txb.text_frame.paragraphs[0], title, size=28, color=self.c["white"], bold=True) + if subtitle: + txb = _add_textbox(slide, Inches(0.6), Inches(0.7), Inches(12), Inches(0.4)) + _set_para(txb.text_frame.paragraphs[0], subtitle, size=14, color=RGBColor(0xBB, 0xCC, 0xDD)) + # 底部装饰线 + _add_shape(slide, Inches(0), Inches(7.3), self.SLIDE_W, Inches(0.2), fill_color=self.c["primary"]) + if body_func: + body_func(slide) + return slide + + # ── 3. 过渡页 ──────────────────────────── + + def add_transition_slide(self, section_num, section_title, subtitle="", + accent_color=None): + """章节过渡页:纯色块 + 大号编号 + 标题""" + slide = self.add_blank_slide() + ac = accent_color or self.c["accent"] + _add_shape(slide, Inches(0), Inches(0), Inches(5.5), self.SLIDE_H, fill_color=ac) + + # 大号编号 + txb = _add_textbox(slide, Inches(0.5), Inches(2.0), Inches(4.5), Inches(1.5)) + _set_para(txb.text_frame.paragraphs[0], str(section_num), + size=72, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + + # 标题 + txb = _add_textbox(slide, Inches(0.5), Inches(3.5), Inches(4.5), Inches(1.0)) + _set_para(txb.text_frame.paragraphs[0], section_title, + size=36, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + + if subtitle: + txb = _add_textbox(slide, Inches(0.5), Inches(4.5), Inches(4.5), Inches(1.5)) + _set_para(txb.text_frame.paragraphs[0], subtitle, + size=16, color=self.c["white"], align=PP_ALIGN.CENTER) + + # 右侧说明区 + return slide + + # ── 4. 纯文本内容 ──────────────────────── + + def add_text_slide(self, title, items, font_size=15, col_count=1, accent=None): + """多行文本页(支持分栏)""" + ac = accent or self.c["primary"] + def body(slide): + left = Inches(0.8) + top = Inches(1.5) + w = Inches(11.5) if col_count == 1 else Inches(5.5) + gap = Inches(0.5) + line_h = Inches(0.45) + + for col in range(col_count): + x = left + col * (w + gap) + for i, item in enumerate(items if col_count == 1 else items[col]): + y = top + i * line_h + txb = _add_textbox(slide, x, y, w, line_h) + p = txb.text_frame.paragraphs[0] + prefix = "" + text = item + if isinstance(item, tuple): + prefix, text = item + final = f"{prefix} {text}" if prefix else text + _set_para(p, final, size=font_size, color=self.c["text"]) + + return self.add_content_slide(title, body_func=body) + + # ── 5. 提醒/强调框 ─────────────────────── + + def add_callout_box(self, slide, text, top, left=None, width=None, height=None, + bg_color=None, border_color=None, font_size=13): + l = left or Inches(0.5) + w = width or Inches(12.3) + h = height or Inches(0.6) + bg = bg_color or RGBColor(0xFF, 0xF3, 0xE0) + bc = border_color or self.c["accent"] + _add_shape(slide, l, top, w, h, fill_color=bg, line_color=bc, line_width=1) + txb = _add_textbox(slide, l + Inches(0.3), top + Inches(0.05), w - Inches(0.6), h - Inches(0.1)) + _set_para(txb.text_frame.paragraphs[0], text, size=font_size, color=self.c["text"]) + return slide + + # ── 6. 对比双栏页 ──────────────────────── + + def add_comparison_slide(self, title, left_heading, right_heading, + left_items, right_items, accent_color=None): + """左右对比双栏页""" + ac = accent_color or self.c["primary"] + def body(slide): + # 左栏 + _add_shape(slide, Inches(0.5), Inches(1.4), Inches(5.8), Inches(5.5), + fill_color=self.c["light_bg"]) + _add_shape(slide, Inches(0.5), Inches(1.4), Inches(5.8), Inches(0.7), + fill_color=accent_color or self.c["accent"]) + txb = _add_textbox(slide, Inches(0.5), Inches(1.4), Inches(5.8), Inches(0.7)) + _set_para(txb.text_frame.paragraphs[0], left_heading, + size=20, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + for i, item in enumerate(left_items): + txb = _add_textbox(slide, Inches(0.8), Inches(2.3 + i * 0.7), Inches(5.2), Inches(0.6)) + _set_para(txb.text_frame.paragraphs[0], item, size=14, color=self.c["text"]) + + # 右栏 + _add_shape(slide, Inches(6.8), Inches(1.4), Inches(5.8), Inches(5.5), + fill_color=self.c["light_bg"]) + _add_shape(slide, Inches(6.8), Inches(1.4), Inches(5.8), Inches(0.7), + fill_color=ac) + txb = _add_textbox(slide, Inches(6.8), Inches(1.4), Inches(5.8), Inches(0.7)) + _set_para(txb.text_frame.paragraphs[0], right_heading, + size=20, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + for i, item in enumerate(right_items): + txb = _add_textbox(slide, Inches(7.1), Inches(2.3 + i * 0.7), Inches(5.2), Inches(0.6)) + _set_para(txb.text_frame.paragraphs[0], item, size=14, color=self.c["text"]) + + return self.add_content_slide(title, body_func=body) + + # ── 7. 表格页 ──────────────────────────── + + def add_table_slide(self, title, headers, rows, col_widths=None, accent_color=None): + """表格数据页""" + ac = accent_color or self.c["primary"] + def body(slide): + n_rows = len(rows) + 1 + n_cols = len(headers) + left = Inches(0.8) + top = Inches(1.4) + width = Inches(11.5) + row_h = Inches(0.45) + height = row_h * n_rows + tbl_shape = slide.shapes.add_table(n_rows, n_cols, left, top, width, height) + tbl = tbl_shape.table + + # 表头 + for j, h in enumerate(headers): + cell = tbl.cell(0, j) + cell.text = h + for p in cell.text_frame.paragraphs: + _set_font(p.runs[0] if p.runs else p.add_run(), size=13, bold=True, color=self.c["white"]) + p.alignment = PP_ALIGN.CENTER + cell.fill.solid() + cell.fill.fore_color.rgb = ac + + # 数据行 + for i, row in enumerate(rows): + for j, val in enumerate(row): + cell = tbl.cell(i + 1, j) + cell.text = str(val) + for p in cell.text_frame.paragraphs: + _set_font(p.runs[0] if p.runs else p.add_run(), size=12, color=self.c["text"]) + if i % 2 == 1: + cell.fill.solid() + cell.fill.fore_color.rgb = RGBColor(0xF5, 0xF5, 0xF5) + + return self.add_content_slide(title, body_func=body) + + # ── 8. 全图背景视觉页 ──────────────────── + + def add_visual_slide(self, title, body_text=None, overlay_alpha=0.45, + title_color=None, title_pos="center"): + """全图背景 + 半透明遮罩 + 前景文字(适合封面/过渡/结尾) + 注意:本函数生成纯色背景版本,如需实际图片需传入 img_path/img_url""" + slide = self.add_blank_slide() + + # 纯色背景(替代图片) + _add_shape(slide, Inches(0), Inches(0), self.SLIDE_W, self.SLIDE_H, + fill_color=self.c["primary"]) + + # 装饰几何元素(用略浅的同色系) + def _lighten(c, amt): + r = min(255, c[0] + amt) + g = min(255, c[1] + amt) + b = min(255, c[2] + amt) + return RGBColor(r, g, b) + prim_tuple = self.c["primary"] # tuple-like: [0]=R, [1]=G, [2]=B + _add_shape(slide, Inches(10), Inches(5), Inches(3.5), Inches(3.5), + fill_color=_lighten(prim_tuple, 20)) + _add_shape(slide, Inches(8.5), Inches(-1), Inches(3), Inches(3), + fill_color=_lighten(prim_tuple, 15)) + + tc = title_color or self.c["white"] + if title_pos == "center": + txb = _add_textbox(slide, Inches(1.5), Inches(2.5), Inches(10), Inches(2)) + _set_para(txb.text_frame.paragraphs[0], title, size=44, color=tc, bold=True, align=PP_ALIGN.CENTER) + if body_text: + txb2 = _add_textbox(slide, Inches(2), Inches(4.5), Inches(9), Inches(2)) + _set_para(txb2.text_frame.paragraphs[0], body_text, size=22, color=RGBColor(0xDD, 0xDD, 0xDD), + align=PP_ALIGN.CENTER) + else: + txb = _add_textbox(slide, Inches(1.5), Inches(2.0), Inches(6), Inches(1.5)) + _set_para(txb.text_frame.paragraphs[0], title, size=44, color=tc, bold=True, align=PP_ALIGN.LEFT) + if body_text: + txb2 = _add_textbox(slide, Inches(1.5), Inches(4.0), Inches(8), Inches(2)) + _set_para(txb2.text_frame.paragraphs[0], body_text, size=22, color=RGBColor(0xDD, 0xDD, 0xDD), + align=PP_ALIGN.LEFT) + + return slide + + # ── 9. 卡片网格型 ──────────────────────── + + def add_card_grid(self, title, cards, accent_color=None): + """卡片网格:2-4张卡片并排,每张含小图+标题+描述""" + ac = accent_color or self.c["primary"] + def body(slide): + n = len(cards) + card_w = Inches(3.5) + card_h = Inches(3.8) + gap = Inches(0.4) + total_w = n * card_w + (n - 1) * gap + start_x = Inches(0.8) + + for i, card in enumerate(cards): + x = start_x + i * (card_w + gap) + y = Inches(1.4) + bg = _add_shape(slide, x, y, card_w, card_h, fill_color=self.c["light_bg"]) + bg.line.color.rgb = ac + bg.line.width = Pt(1.5) + + # 编号标记 + num_shape = _add_shape(slide, x + Inches(0.15), y + Inches(0.2), + Inches(0.6), Inches(0.6), fill_color=ac) + txb = _add_textbox(slide, x + Inches(0.15), y + Inches(0.2), + Inches(0.6), Inches(0.6)) + _set_para(txb.text_frame.paragraphs[0], str(i + 1), + size=18, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + + # 标题 + txb = _add_textbox(slide, x + Inches(0.9), y + Inches(0.25), + card_w - Inches(1.2), Inches(0.5)) + _set_para(txb.text_frame.paragraphs[0], card.get("title", ""), + size=18, color=ac, bold=True) + + # 描述行 + for j, line in enumerate(card.get("items", [])): + txb = _add_textbox(slide, x + Inches(0.2), y + Inches(1.1 + j * 0.5), + card_w - Inches(0.4), Inches(0.5)) + _set_para(txb.text_frame.paragraphs[0], line, + size=13, color=self.c["text"]) + + return self.add_content_slide(title, body_func=body) + + # ── 10. 活动步骤页 ─────────────────────── + + def add_activity_slide(self, title, steps, accent_color=None, duration=""): + """步骤式活动页:编号步骤 + 说明""" + ac = accent_color or self.c["accent"] + def body(slide): + for i, (step, desc) in enumerate(steps): + y = Inches(1.5) + i * Inches(1.5) + badge = _add_shape(slide, Inches(0.5), y, Inches(1.0), Inches(0.5), + fill_color=ac) + txb = _add_textbox(slide, Inches(0.5), y, Inches(1.0), Inches(0.5)) + _set_para(txb.text_frame.paragraphs[0], step, + size=12, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + txb = _add_textbox(slide, Inches(1.8), y + Inches(0.0), Inches(10.5), Inches(1.0)) + _set_para(txb.text_frame.paragraphs[0], desc, size=14, color=self.c["text"]) + + if duration: + txb = _add_textbox(slide, Inches(0.5), Inches(6.5), Inches(4), Inches(0.4)) + _set_para(txb.text_frame.paragraphs[0], f"⏱ {duration}", + size=14, color=self.c["muted"], bold=True) + + return self.add_content_slide(title, body_func=body) + + # ── 11. 引用/名言页 ────────────────────── + + def add_quote_slide(self, quote, author="", accent_color=None): + """大字号引用居中页""" + slide = self.add_blank_slide() + ac = accent_color or self.c["accent"] + txb = _add_textbox(slide, Inches(1.5), Inches(2.0), Inches(10), Inches(3.0)) + tf = txb.text_frame + tf.word_wrap = True + p = tf.paragraphs[0] + _set_para(p, f"「{quote}」", size=36, color=ac, bold=False, align=PP_ALIGN.CENTER) + if author: + txb2 = _add_textbox(slide, Inches(1.5), Inches(5.2), Inches(10), Inches(1.0)) + _set_para(txb2.text_frame.paragraphs[0], f"—— {author}", + size=20, color=self.c["muted"], align=PP_ALIGN.RIGHT) + return slide + + # ── 12. 结尾页 ─────────────────────────── + + def add_closing_slide(self, main_text, sub_text="", accent_color=None): + """结尾总结页""" + slide = self.add_blank_slide() + _add_shape(slide, Inches(0), Inches(0), self.SLIDE_W, self.SLIDE_H, + fill_color=self.c["primary"]) + ac = accent_color or self.c["accent"] + _add_shape(slide, Inches(0), Inches(6.8), self.SLIDE_W, Inches(0.7), + fill_color=ac) + + txb = _add_textbox(slide, Inches(1.5), Inches(2.0), Inches(10), Inches(2.0)) + _set_para(txb.text_frame.paragraphs[0], main_text, + size=36, color=self.c["white"], bold=True, align=PP_ALIGN.CENTER) + + if sub_text: + txb2 = _add_textbox(slide, Inches(1.5), Inches(4.0), Inches(10), Inches(1.5)) + _set_para(txb2.text_frame.paragraphs[0], sub_text, + size=20, color=RGBColor(0xCC, 0xDD, 0xEE), align=PP_ALIGN.CENTER) + + return slide + + # ── 辅助:添加课本追溯标签 ────────────── + + def add_textbook_label(self, slide, label_text, color=None): + """右下角课本页码追溯标签""" + txb = _add_textbox(slide, Inches(11.3), Inches(7.0), Inches(1.8), Inches(0.4)) + _set_para(txb.text_frame.paragraphs[0], label_text, + size=10, color=color or self.c["muted"], align=PP_ALIGN.RIGHT) + + # ── 辅助:添加演讲备注 ─────────────────── + + def add_notes(self, slide, text): + """为当前幻灯片添加演讲者备注""" + try: + notes_slide = slide.notes_slide + notes_slide.notes_text_frame.text = text + except: + pass + + # ── 辅助:设置页面背景色 ──────────────── + + def set_slide_bg(self, slide, color): + bg = slide.background + fill = bg.fill + fill.solid() + fill.fore_color.rgb = color + + # ── 保存 ───────────────────────────────── + + def save(self, output_path): + """保存为 .pptx 文件""" + os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True) + self.prs.save(output_path) + return output_path diff --git a/skills/classroom-inspiration/scripts/requirements.txt b/skills/classroom-inspiration/scripts/requirements.txt new file mode 100644 index 00000000..82cb4740 --- /dev/null +++ b/skills/classroom-inspiration/scripts/requirements.txt @@ -0,0 +1 @@ +python-pptx>=1.0.0 diff --git a/skills/classroom-inspiration/scripts/time-checker.py b/skills/classroom-inspiration/scripts/time-checker.py new file mode 100644 index 00000000..cd2e9b14 --- /dev/null +++ b/skills/classroom-inspiration/scripts/time-checker.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +创意课堂时间可行性检测工具 +输入教学环节列表,检测时间分配是否合理 +用法: python time-checker.py --file segments.json +""" +import sys, json + +# 各环节类型建议占比 +BENCHMARK = { + "导入": (0.05, 0.10), + "新授": (0.25, 0.40), + "活动": (0.20, 0.35), + "练习": (0.10, 0.20), + "总结": (0.05, 0.10), + "过渡": (0.02, 0.05), +} + +def check_time(total_minutes, segments): + used = sum(s.get("minutes", 0) for s in segments) + issues = [] + details = [] + rhythm = [] + + for s in segments: + name = s.get("name", "") + mins = s.get("minutes", 0) + ratio = round(mins / total_minutes * 100, 1) if total_minutes else 0 + + matched = False + for cat, (lo, hi) in BENCHMARK.items(): + if cat in name: + expected_lo = round(lo * total_minutes) + expected_hi = round(hi * total_minutes) + status = "ok" if lo * total_minutes <= mins <= hi * total_minutes else "warn" + if status == "warn": + msg = f"「{name}」{mins}分(基准{expected_lo}-{expected_hi}分)" + if mins < lo * total_minutes: + msg += ",偏短,建议增加" + issues.append(msg) + else: + msg += ",偏长,建议压缩" + issues.append(msg) + matched = True + details.append({"name": name, "minutes": mins, "ratio": ratio, "status": status}) + break + + if not matched: + details.append({"name": name, "minutes": mins, "ratio": ratio, "status": "ok"}) + + # 节奏标记 + if ratio >= 25: + rhythm.append("SLOW") + elif ratio >= 10: + rhythm.append("MID") + else: + rhythm.append("FAST") + + remaining = total_minutes - used + score = 100 - len(issues) * 15 + score = max(0, score) + + return { + "summary": { + "total_minutes": total_minutes, + "used_minutes": used, + "remaining": remaining, + "usage_rate": round(used / total_minutes * 100) if total_minutes else 0 + }, + "rhythm": " → ".join(rhythm), + "details": details, + "score": score, + "issues": issues, + "suggestions": [ + "导入3-5分钟为宜,过长会影响核心环节" if any("导入" in d["name"] and d["minutes"] > 6 for d in details) else "", + "核心新授/活动环节总占比建议≥60%" if sum(d["minutes"] for d in details if "活动" in d["name"] or "新授" in d["name"] or "精讲" in d["name"]) / total_minutes < 0.6 else "", + ] if issues else [] + } + + +def main(): + if len(sys.argv) > 1 and sys.argv[1] == '--file': + data = json.load(open(sys.argv[2], 'r', encoding='utf-8')) + else: + data = json.load(sys.stdin) + report = check_time(data.get("total_minutes", 40), data.get("segments", [])) + print(json.dumps(report, ensure_ascii=False, indent=2)) + +if __name__ == '__main__': + main()