From 2ad2c130acb2368c605a7d45c96c12d1c5c89782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Wed, 18 Mar 2026 15:06:58 +0800 Subject: [PATCH] add ppt-outline --- skills_developing/ppt-outline/SKILL.md | 56 + skills_developing/ppt-outline/_meta.json | 11 + skills_developing/ppt-outline/examples.md | 325 +++++ skills_developing/ppt-outline/scripts/ppt.sh | 1139 ++++++++++++++++++ 4 files changed, 1531 insertions(+) create mode 100644 skills_developing/ppt-outline/SKILL.md create mode 100644 skills_developing/ppt-outline/_meta.json create mode 100644 skills_developing/ppt-outline/examples.md create mode 100644 skills_developing/ppt-outline/scripts/ppt.sh diff --git a/skills_developing/ppt-outline/SKILL.md b/skills_developing/ppt-outline/SKILL.md new file mode 100644 index 0000000..7ad3537 --- /dev/null +++ b/skills_developing/ppt-outline/SKILL.md @@ -0,0 +1,56 @@ +--- +name: ppt-outline +description: "PPT outline and HTML presentation generator. PPT大纲、PPT模板、演示文稿、presentation、PowerPoint、幻灯片、slides、HTML演示文稿、HTML slides、浏览器演示、商业路演、pitch deck、BP商业计划书、business plan、工作汇报PPT、培训课件、课件大纲、产品介绍PPT、产品发布、keynote、演讲稿、述职PPT、答辩PPT、竞品分析PPT、毕业答辩、论文答辩、项目复盘、迭代复盘。Generate PPT outlines and standalone HTML presentations (open directly in browser, no dependencies). Use when: (1) creating PPT/presentation outlines, (2) building pitch deck/BP structures, (3) preparing work report slides, (4) designing training course outlines, (5) creating thesis defense PPT outlines, (6) building project review/retrospective PPTs, (7) generating HTML slide decks for browser-based presentations, (8) any PowerPoint/Keynote/Google Slides planning. 适用场景:做PPT大纲、写路演BP、汇报PPT结构、培训课件大纲、毕业答辩PPT、项目复盘PPT、述职答辩PPT、生成HTML演示文稿(浏览器直接打开,支持dark/light/tech/minimal四种风格)。" +--- + +# ppt-outline + +PPT大纲和演示文稿结构生成器。商业路演、工作汇报、产品介绍、培训课件。 + +## 为什么用这个 Skill? / Why This Skill? + +- **场景化大纲**:路演BP有固定结构(痛点→方案→市场→团队→融资),汇报有汇报的逻辑,不是万能模板 +- **每页要点**:不只给标题,每页都有2-4个要点提示,拿来直接填内容 +- **页数控制**:`--slides 10` 控制总页数,按需伸缩 +- Compared to asking AI directly: scenario-specific slide structures (pitch vs report vs training), per-slide talking points, and slide count control + +## Usage + +Run the script at `scripts/ppt.sh`: + +| Command | Description | +|---------|-------------| +| `scripts/ppt.sh outline "主题" [--slides 10]` | 生成PPT大纲(每页标题+要点) | +| `scripts/ppt.sh pitch "项目名"` | 商业路演BP大纲 | +| `scripts/ppt.sh report "汇报主题"` | 工作汇报PPT大纲 | +| `scripts/ppt.sh training "课程主题"` | 培训课件大纲 | +| `scripts/ppt.sh defense "论文题目"` | 毕业答辩PPT大纲 | +| `scripts/ppt.sh review "项目名"` | 项目复盘PPT大纲 | +| `scripts/ppt.sh html "主题" [--style S]` | 生成HTML演示文稿(浏览器直接打开) | +| `scripts/ppt.sh help` | 显示帮助信息 | + +## Examples + +```bash +# 通用PPT大纲(指定页数) +bash scripts/ppt.sh outline "人工智能在医疗领域的应用" --slides 12 + +# 商业路演 +bash scripts/ppt.sh pitch "智能客服SaaS平台" + +# 工作汇报 +bash scripts/ppt.sh report "2024年Q4部门工作总结" + +# 培训课件 +bash scripts/ppt.sh training "新员工入职培训-公司文化" + +# 毕业答辩 +bash scripts/ppt.sh defense "社交媒体对消费行为的影响研究" + +# 项目复盘 +bash scripts/ppt.sh review "双十一大促活动" + +# 生成HTML演示文稿(浏览器直接打开) +bash scripts/ppt.sh html "AI在医疗的应用" --style tech +# 支持风格:dark(默认深色科技) | light(白色商务) | tech(渐变科技) | minimal(极简) +``` diff --git a/skills_developing/ppt-outline/_meta.json b/skills_developing/ppt-outline/_meta.json new file mode 100644 index 0000000..a04bd86 --- /dev/null +++ b/skills_developing/ppt-outline/_meta.json @@ -0,0 +1,11 @@ +{ + "owner": "ckchzh2022", + "slug": "ppt-outline", + "displayName": "PPT Outline", + "latest": { + "version": "1.4.1", + "publishedAt": 1773140850358, + "commit": "https://github.com/openclaw/skills/commit/fb6dca894727e0b75770a716cd809422ba1278f2" + }, + "history": [] +} diff --git a/skills_developing/ppt-outline/examples.md b/skills_developing/ppt-outline/examples.md new file mode 100644 index 0000000..73263da --- /dev/null +++ b/skills_developing/ppt-outline/examples.md @@ -0,0 +1,325 @@ +# PPT大纲完整示例 + +> 8种常见场景的PPT大纲范例,直接参考使用。 + +--- + +## 示例1:商业路演BP — "智能仓储机器人" + +``` +第1页 | 封面 + - 项目名:SmartWare 智能仓储机器人 + - Slogan:让仓库管理效率提升300% + - 融资:Pre-A轮,目标500万美元 + +第2页 | 痛点与机会 + - 电商仓储人力成本年增15% + - 高峰期招不到人,错误率高达5% + - 3.2万亿物流市场,仓储自动化渗透率仅8% + +第3页 | 解决方案 + - 自主导航拣货机器人 + - 视觉+激光雷达融合定位 + - 即插即用,无需改造仓库 + +第4页 | 商业模式 + - 硬件销售 + SaaS订阅 + - 单台售价12万,月费3000元 + - LTV/CAC = 8.5 + +第5页 | 市场规模 + - TAM: 800亿(全球仓储自动化) + - SAM: 120亿(中国中小仓储) + - SOM: 5亿(首年目标) + +第6页 | 竞争分析 + - 极智嘉、快仓(大型仓库)vs 我们(中小仓库) + - 我们的优势:成本低50%、部署快10倍 + +第7页 | Traction + - 已签约3家客户,MRR 9万元 + - 试用客户拣货效率提升280% + +第8页 | 团队 + - CTO:前大疆算法专家 + - CEO:10年物流行业经验 + +第9页 | 融资方案 + - Pre-A轮500万美元 + - 60%研发,25%市场,15%运营 +``` + +--- + +## 示例2:工作汇报 — "2024年Q4产品部总结" + +``` +第1页 | 封面 + - Q4产品部工作总结与2025规划 + - 汇报人:产品总监 张明 + +第2页 | 核心成果 + - DAU突破100万(环比+35%) + - 用户满意度4.6分(+0.3) + - 完成12个需求迭代 + +第3页 | 重点项目回顾 + - 项目A:会员体系改版 → 付费率+22% + - 项目B:搜索优化 → 搜索CTR+18% + - 项目C:新用户引导 → 次日留存+5pp + +第4页 | 数据分析 + - 用户增长趋势图 + - 功能使用热力图 + - 转化漏斗分析 + +第5页 | 问题与挑战 + - 需求堆积:排期已满到Q2 + - 技术债务:核心模块需重构 + - 竞品威胁:竞品X上线类似功能 + +第6页 | Q1计划 + - 目标:DAU 130万,留存+3pp + - 重点:AI推荐引擎上线 + - 资源:申请2名前端开发 +``` + +--- + +## 示例3:培训课件 — "数据分析入门" + +``` +第1页 | 封面 + - 《数据分析入门——从Excel到Python》 + - 讲师:数据团队 李薇 + +第2页 | 学习目标 + - 理解数据分析的基本流程 + - 掌握Excel数据透视表 + - 能用Python做简单的数据清洗 + - 学会用图表讲数据故事 + +第3页 | 为什么需要数据分析 + - 案例:"拍脑袋"决策 vs 数据驱动决策 + - 数据分析师的一天 + +第4-6页 | 核心知识 + - 数据分析五步法:提问→收集→清洗→分析→展示 + - Excel实操:VLOOKUP、数据透视表、条件格式 + - Python入门:pandas读取/清洗数据 + +第7页 | 案例实操 + - 用真实销售数据做分析 + - 从"销售额下降了"到"华东区某品类在周末下降" + +第8页 | 练习与总结 + - 课后作业:分析一份电商数据 + - 推荐工具:Excel/Google Sheets/Jupyter +``` + +--- + +## 示例4:毕业答辩 — "社交媒体对青年消费行为的影响研究" + +``` +第1页 | 封面 + - 论文题目+学生信息+导师+日期 + +第2页 | 研究背景 + - 中国社交媒体用户10.7亿 + - Z世代年消费力超4万亿 + - 社交媒体如何重塑消费决策? + +第3页 | 文献综述 + - 国外:Smith(2020)社交影响力模型 + - 国内:李明(2022)种草经济研究 + - 研究空白:缺乏跨平台对比研究 + +第4页 | 研究方法 + - 问卷调查(N=500)+ 深度访谈(N=20) + - 结构方程模型(SEM)分析 + - 小红书 vs 抖音 vs 微博 三平台对比 + +第5页 | 核心发现 + - H1:社交媒体信任度与购买意向正相关(β=0.45***) + - H2:小红书的种草效果显著高于微博 + - 意外发现:年龄对信任度有调节效应 + +第6页 | 创新点 + - 首次构建"社交种草-消费决策"跨平台模型 + - 引入"平台信任度"作为调节变量 + +第7页 | 结论与展望 + - 核心结论3条 + - 局限:样本偏年轻、仅限一线城市 + - 未来研究:纵向追踪、加入直播场景 +``` + +--- + +## 示例5:项目复盘 — "双十一大促活动复盘" + +``` +第1页 | 封面 + - 2024双十一大促活动复盘 + +第2页 | 目标 vs 结果 + - GMV目标5000万 → 实际4800万(达成率96%) + - UV目标200万 → 实际230万(+15%) + - 客单价目标120元 → 实际95元(-21%)⚠️ + +第3页 | 关键数据 + - 转化率3.2%(去年2.8%) + - 退货率12%(去年8%)⚠️ + - 客服响应时间平均45秒 + +第4页 | Keep(做得好) + - 预热期社群运营效果突出 + - 直播间流量超预期2倍 + - 库存管理零缺货 + +第5页 | Problem(问题) + - 客单价低:优惠券力度过大 + - 退货率高:预售期过长导致冲动消费 + - 页面加载慢:高峰期技术瓶颈 + +第6页 | Try(下次改进) + - 优惠策略:满减>直降,提升客单价 + - 缩短预售期至3天 + - 技术扩容:CDN+弹性计算 +``` + +--- + +## 示例6:产品介绍 — "企业级协作工具TeamFlow" + +``` +第1页 | 封面 + - TeamFlow — 让团队协作效率翻倍 + +第2页 | 痛点 + - 信息分散在10+工具中 + - 会议多、效率低 + - 远程协作难以管理 + +第3页 | 产品概览 + - 一站式协作平台(任务+文档+会议+知识库) + - 核心截图/Demo演示 + +第4-6页 | 核心功能 + - 智能任务管理(甘特图+看板+时间线) + - AI会议纪要(自动转文字+提取行动项) + - 知识库(Wiki+全文搜索) + +第7页 | 竞品对比 + - vs 飞书/钉钉/Notion 对比表格 + - 我们的差异化:AI原生、更轻量 + +第8页 | 定价方案 + - 免费版/专业版/企业版 + +第9页 | 客户案例 + - 3家标杆客户+数据效果 + +第10页 | 联系我们 + - 立即试用 / 预约Demo +``` + +--- + +## 示例7:述职报告 — "高级工程师述职" + +``` +第1页 | 封面 + - 2024年度述职报告 + - 高级后端工程师 王大力 + +第2页 | 年度成果概要 + - 主导3个核心项目 + - 系统性能提升40% + - 带教2名初级工程师 + +第3-5页 | 重点项目 + - 项目1:支付系统重构(响应时间从800ms→200ms) + - 项目2:微服务拆分(单体应用→12个微服务) + - 项目3:监控告警体系搭建 + +第6页 | 技术成长 + - 技术分享3次 + - 产出技术文档15篇 + - 获得 AWS SA 认证 + +第7页 | 不足与改进 + - 跨团队沟通可以更主动 + - 需要提升系统设计能力 + +第8页 | 明年规划 + - 目标:晋升技术专家 + - 计划:主导架构演进+带团队 +``` + +--- + +## 示例8:竞品分析 — "外卖平台竞品分析" + +``` +第1页 | 封面 + - 外卖平台竞品分析报告 + +第2页 | 分析目标 + - 对象:美团外卖 vs 饿了么 vs 抖音外卖 + - 维度:产品功能、用户体验、商业模式、增长策略 + +第3页 | 市场概况 + - 市场规模1.2万亿 + - 美团份额65%、饿了么30%、其他5% + - 增长趋势图 + +第4页 | 产品功能对比 + - 功能矩阵对比表 + - 各家独有功能标注 + +第5页 | 用户体验对比 + - 下单流程步骤数对比 + - 配送时间对比 + - 用户评价对比 + +第6页 | 商业模式对比 + - 佣金率、配送费、会员体系 + - 盈利能力分析 + +第7页 | SWOT分析 + - 我方产品的优势/劣势/机会/威胁 + +第8页 | 策略建议 + - 短期:3个可快速落地的优化 + - 长期:差异化竞争策略 +``` + +--- + +## 使用命令 + +```bash +# 商业路演 +ppt.sh pitch "智能仓储机器人" + +# 毕业答辩 +ppt.sh defense "社交媒体对青年消费行为的影响研究" + +# 项目复盘 +ppt.sh review "双十一大促" + +# 培训课件 +ppt.sh training "数据分析入门" + +# 工作汇报 +ppt.sh report "Q4产品部总结" + +# 通用大纲 +ppt.sh outline "竞品分析" --slides 8 +``` + +--- + +*好的PPT不是写出来的,是讲出来的。先想清楚你要讲什么故事。* diff --git a/skills_developing/ppt-outline/scripts/ppt.sh b/skills_developing/ppt-outline/scripts/ppt.sh new file mode 100644 index 0000000..dfd10d9 --- /dev/null +++ b/skills_developing/ppt-outline/scripts/ppt.sh @@ -0,0 +1,1139 @@ +#!/usr/bin/env bash +# ppt.sh — PPT大纲和演示文稿结构生成器 +set -euo pipefail + +DATE=$(date '+%Y-%m-%d') + +show_help() { + cat <<'EOF' +PPT大纲生成器 - ppt.sh + +用法: + ppt.sh outline "主题" [--slides 10] 生成PPT大纲(每页标题+要点) + ppt.sh pitch "项目名" 商业路演BP大纲 + ppt.sh report "汇报主题" 工作汇报PPT大纲 + ppt.sh training "课程主题" 培训课件大纲 + ppt.sh defense "论文题目" 毕业答辩PPT大纲 + ppt.sh review "项目名" 项目复盘PPT大纲 + ppt.sh html "主题" [--style S] 生成HTML演示文稿(浏览器打开) + ppt.sh help 显示本帮助 + +风格(html命令):dark(默认) | light | tech | minimal + +示例: + ppt.sh outline "AI在医疗的应用" --slides 12 + ppt.sh pitch "智能客服SaaS" + ppt.sh report "Q4部门总结" + ppt.sh training "新员工入职" + ppt.sh html "AI在医疗的应用" --style tech +EOF +} + +cmd_outline() { + local topic="$1" + shift + local slides=10 + while [ $# -gt 0 ]; do + case "$1" in + --slides) slides="${2:-10}"; shift 2 ;; + *) shift ;; + esac + done + python3 -c " +import sys + +date = '${DATE}' +topic = sys.argv[1] +slides = int(sys.argv[2]) + +print('=' * 60) +print('PPT 大 纲'.center(60)) +print('=' * 60) +print('') +print('主题:{}'.format(topic)) +print('页数:{} 页'.format(slides)) +print('日期:{}'.format(date)) +print('') +print('-' * 60) + +# Generate slide structure +default_structure = [ + ('封面', ['标题:{}'.format(topic), '副标题:______', '演讲者:______', '日期:{}'.format(date)]), + ('目录', ['本次演示包含以下内容:', '(根据实际页数自动生成)']), + ('背景与现状', ['行业/项目背景', '当前面临的问题/挑战', '数据支撑']), + ('核心观点/方案', ['核心论点', '关键数据', '逻辑框架']), + ('详细分析 (一)', ['分析维度1', '数据/图表', '小结']), + ('详细分析 (二)', ['分析维度2', '案例/证据', '小结']), + ('详细分析 (三)', ['分析维度3', '对比/趋势', '小结']), + ('实施方案/路径', ['阶段划分', '时间节点', '资源需求']), + ('预期效果/收益', ['量化指标', '里程碑', '风险控制']), + ('总结与展望', ['核心回顾', '下一步计划', '呼吁行动(CTA)']), +] + +# Adjust to requested slide count +if slides <= len(default_structure): + structure = default_structure[:slides] +else: + structure = list(default_structure) + for i in range(len(default_structure), slides): + structure.append(('补充内容 ({})'.format(i - len(default_structure) + 1), + ['要点1', '要点2', '要点3'])) + +for i, (title, points) in enumerate(structure, 1): + print('') + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + +print('') +print('-' * 60) +print('【演讲备注】') +print(' - 总时长建议:{} 分钟(每页约 {} 分钟)'.format(slides * 2, 2)) +print(' - 重点页面:第3-4页(核心观点,多花时间)') +print(' - 建议配图:数据页用图表,案例页用照片') +print('=' * 60) +" "$topic" "$slides" +} + +cmd_pitch() { + local project="$1" + python3 -c " +import sys + +date = '${DATE}' +project = sys.argv[1] + +print('=' * 60) +print('商 业 路 演 BP 大 纲'.center(60)) +print('=' * 60) +print('') +print('项目:{}'.format(project)) +print('日期:{}'.format(date)) +print('') + +slides = [ + ('封面', [ + '项目名称:{}'.format(project), + 'Slogan:一句话说清价值', + '团队/公司名', + '融资轮次与金额', + ]), + ('痛点与机会', [ + '目标用户是谁?', + '他们面临什么问题?(具体场景)', + '现有解决方案的不足', + '市场机会有多大?', + ]), + ('解决方案', [ + '我们的产品/服务是什么', + '如何解决上述痛点', + '核心功能展示(截图/Demo)', + '用户体验亮点', + ]), + ('商业模式', [ + '怎么赚钱?', + '定价策略', + '收入来源(订阅/交易/广告…)', + '单位经济模型(LTV / CAC)', + ]), + ('市场分析', [ + 'TAM / SAM / SOM', + '市场增长率', + '目标客群画像', + '市场趋势', + ]), + ('竞争分析', [ + '主要竞争对手(2-4个)', + '竞争矩阵对比', + '我们的差异化壁垒', + '护城河', + ]), + ('产品进展 / Traction', [ + '当前阶段(概念/MVP/增长)', + '关键数据指标', + '用户/客户/收入数据', + '里程碑事件', + ]), + ('团队介绍', [ + '核心团队成员(3-5人)', + '各自背景与分工', + '顾问/投资人', + '团队优势', + ]), + ('财务规划', [ + '收入预测(3年)', + '成本结构', + '盈亏平衡点', + '关键假设', + ]), + ('融资方案', [ + '本轮融资金额', + '估值', + '资金用途分配', + '未来融资计划', + ]), + ('愿景与路线图', [ + '6个月目标', + '12个月目标', + '长期愿景', + 'Call to Action', + ]), +] + +for i, (title, points) in enumerate(slides, 1): + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + print('') + +print('-' * 60) +print('【路演建议】') +print(' - 总时长:10-15分钟(留5分钟Q&A)') +print(' - 前3页定生死:30秒内抓住注意力') +print(' - 数据说话:每页至少一个数据支撑') +print(' - 讲故事:用户案例 > 功能罗列') +print('=' * 60) +" "$project" +} + +cmd_report() { + local topic="$1" + python3 -c " +import sys + +date = '${DATE}' +topic = sys.argv[1] + +print('=' * 60) +print('工 作 汇 报 PPT 大 纲'.center(60)) +print('=' * 60) +print('') +print('汇报主题:{}'.format(topic)) +print('日期:{}'.format(date)) +print('') + +slides = [ + ('封面', [ + '标题:{}'.format(topic), + '汇报人:______', + '部门:______', + '日期:{}'.format(date), + ]), + ('目录', [ + '一、工作回顾', + '二、核心成果', + '三、问题与挑战', + '四、下阶段计划', + ]), + ('工作概览', [ + '汇报周期:______ 至 ______', + '主要工作方向', + '团队概况', + '资源投入', + ]), + ('核心成果 (一)', [ + '成果描述', + '关键数据指标(同比/环比)', + '超额/达标/未达标', + '图表展示', + ]), + ('核心成果 (二)', [ + '成果描述', + '亮点项目/案例', + '客户/用户反馈', + '团队贡献', + ]), + ('数据分析', [ + 'KPI完成情况一览表', + '趋势图/对比图', + '关键发现', + '数据洞察', + ]), + ('问题与挑战', [ + '遇到的主要问题(2-3个)', + '原因分析', + '已采取的措施', + '需要的支持', + ]), + ('经验与反思', [ + '做得好的方面', + '需要改进的方面', + '学到的经验', + '团队成长', + ]), + ('下阶段计划', [ + '目标设定(SMART原则)', + '重点工作安排', + '时间节点', + '资源需求', + ]), + ('总结', [ + '一句话总结', + '请求支持事项', + '感谢', + 'Q&A', + ]), +] + +for i, (title, points) in enumerate(slides, 1): + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + print('') + +print('-' * 60) +print('【汇报建议】') +print(' - 结论先行:先说结果,再讲过程') +print(' - 数据优先:用数据说话,少用形容词') +print(' - 简洁有力:每页不超过6个要点') +print(' - 时间控制:15-20分钟内完成') +print('=' * 60) +" "$topic" +} + +cmd_training() { + local course="$1" + python3 -c " +import sys + +date = '${DATE}' +course = sys.argv[1] + +print('=' * 60) +print('培 训 课 件 大 纲'.center(60)) +print('=' * 60) +print('') +print('课程:{}'.format(course)) +print('日期:{}'.format(date)) +print('') + +slides = [ + ('封面', [ + '课程名称:{}'.format(course), + '讲师:______', + '时长:______ 小时', + '日期:{}'.format(date), + ]), + ('课程导入', [ + '为什么要学这个?(痛点/场景)', + '学完你能获得什么?(学习目标)', + '课程大纲概览', + '互动规则', + ]), + ('基础概念', [ + '核心定义', + '关键术语解释', + '历史/背景', + '为什么重要', + ]), + ('核心知识 (一)', [ + '知识点1详解', + '原理/框架', + '图解说明', + '要点小结', + ]), + ('核心知识 (二)', [ + '知识点2详解', + '方法/步骤', + '注意事项', + '要点小结', + ]), + ('核心知识 (三)', [ + '知识点3详解', + '进阶内容', + '常见误区', + '要点小结', + ]), + ('案例分析', [ + '真实案例展示', + '成功案例 vs 失败案例', + '关键分析', + '经验教训', + ]), + ('实操练习', [ + '练习题目/任务', + '操作步骤指引', + '小组讨论(如适用)', + '预期产出', + ]), + ('常见问题 Q&A', [ + 'FAQ 1', + 'FAQ 2', + 'FAQ 3', + '互动答疑', + ]), + ('课程总结', [ + '核心要点回顾(3-5条)', + '推荐学习资源', + '课后作业/实践任务', + '反馈与评价', + ]), +] + +for i, (title, points) in enumerate(slides, 1): + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + print('') + +print('-' * 60) +print('【授课建议】') +print(' - 每20分钟穿插一次互动/提问') +print(' - 理论:案例:练习 = 4:3:3') +print(' - 开头用故事/问题引入,不要直接讲理论') +print(' - 每个知识点用「是什么-为什么-怎么做」结构') +print(' - 结尾留课后任务,巩固学习效果') +print('=' * 60) +" "$course" +} + +# Main dispatch +case "${1:-help}" in + outline) + [ $# -lt 2 ] && { echo "用法: ppt.sh outline \"主题\" [--slides 10]"; exit 1; } + topic="$2" + shift 2 + cmd_outline "$topic" "$@" + ;; + pitch) + [ $# -lt 2 ] && { echo "用法: ppt.sh pitch \"项目名\""; exit 1; } + cmd_pitch "$2" + ;; + report) + [ $# -lt 2 ] && { echo "用法: ppt.sh report \"汇报主题\""; exit 1; } + cmd_report "$2" + ;; + training) + [ $# -lt 2 ] && { echo "用法: ppt.sh training \"课程主题\""; exit 1; } + cmd_training "$2" + ;; + defense) + [ $# -lt 2 ] && { echo "用法: ppt.sh defense \"论文题目\""; exit 1; } + export PPT_THESIS="$2" + export PPT_DATE="$DATE" + python3 <<'PYEOF' +import os + +thesis = os.environ.get('PPT_THESIS', '') +date = os.environ.get('PPT_DATE', '') + +print('=' * 60) +print('毕 业 答 辩 PPT 大 纲'.center(60)) +print('=' * 60) +print('') +print('论文题目:{}'.format(thesis)) +print('答辩日期:{}'.format(date)) +print('') + +slides = [ + ('封面', [ + '论文题目:{}'.format(thesis), + '学生姓名:______', + '学号:______', + '指导教师:______教授', + '学院/专业:______', + '答辩日期:{}'.format(date), + ]), + ('目录', [ + '一、研究背景与意义', + '二、文献综述', + '三、研究方法与设计', + '四、数据分析与结果', + '五、讨论与创新点', + '六、结论与展望', + ]), + ('研究背景与意义', [ + '研究领域的宏观背景', + '现实问题/痛点是什么', + '为什么选择这个课题', + '研究的理论意义', + '研究的实践价值', + ]), + ('文献综述', [ + '国内外研究现状概述', + '已有研究的主要成果(2-3个关键学者/团队)', + '现有研究的不足/空白', + '本研究的切入点', + ]), + ('研究问题与假设', [ + '核心研究问题(1-2个)', + '研究假设(如适用)', + '研究框架/理论模型', + '变量定义与关系图', + ]), + ('研究方法', [ + '研究方法选择及理由(定性/定量/混合)', + '数据来源与样本', + '研究工具/量表/问卷', + '数据收集过程', + '分析方法(统计工具/编码方法)', + ]), + ('数据分析与结果(一)', [ + '描述性统计/基本分析', + '图表展示关键数据', + '结果一:______(与假设H1对应)', + '数据可视化(图表、对比图)', + ]), + ('数据分析与结果(二)', [ + '结果二:______(与假设H2对应)', + '结果三:______(补充发现)', + '数据图表(柱状图/折线图/热力图)', + '显著性检验结果', + ]), + ('讨论', [ + '结果与已有研究的对比', + '意外发现的解释', + '理论贡献', + '实践启示', + ]), + ('创新点', [ + '创新点一:理论/模型创新', + '创新点二:方法创新', + '创新点三:应用/视角创新', + '(每个创新点用一句话概括+简要说明)', + ]), + ('研究局限与展望', [ + '本研究的局限性(2-3点,坦诚但不自贬)', + '未来研究方向', + '数据/方法的改进空间', + ]), + ('结论', [ + '核心发现总结(3-5条)', + '回答研究问题', + '研究贡献概述', + '一句话总结', + ]), + ('致谢', [ + '感谢导师的指导', + '感谢评审老师', + '感谢同学/实验室/家人', + '请各位老师批评指正', + ]), + ('参考文献(部分)', [ + '列出10-15篇核心参考文献', + '按APA/GB/T 7714格式排列', + '(全部文献见论文正文)', + ]), +] + +for i, (title, points) in enumerate(slides, 1): + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + print('') + +print('-' * 60) +print('【答辩建议】') +print(' - 总时长:15-20分钟陈述 + 5-10分钟提问') +print(' - 前3页决定第一印象:背景要简洁,快速进入核心内容') +print(' - 数据页多用图表,少用表格(评委看不清小字)') +print(' - 创新点是重中之重,一定要讲清楚"新在哪里"') +print(' - 局限性主动提,但同时给出改进方向(表现学术素养)') +print(' - 每页不超过6行文字,字号不小于24pt') +print(' - 准备好常见问题的回答(为什么选这个方法、样本量够不够等)') +print('=' * 60) +PYEOF + ;; + review) + [ $# -lt 2 ] && { echo "用法: ppt.sh review \"项目名\""; exit 1; } + export PPT_PROJECT="$2" + export PPT_DATE="$DATE" + python3 <<'PYEOF' +import os + +project = os.environ.get('PPT_PROJECT', '') +date = os.environ.get('PPT_DATE', '') + +print('=' * 60) +print('项 目 复 盘 PPT 大 纲'.center(60)) +print('=' * 60) +print('') +print('项目:{}'.format(project)) +print('复盘日期:{}'.format(date)) +print('') + +slides = [ + ('封面', [ + '项目名称:{}'.format(project), + '复盘类型:□项目复盘 □迭代复盘 □年度复盘', + '复盘负责人:______', + '日期:{}'.format(date), + ]), + ('目录', [ + '一、项目概述', + '二、目标 vs 结果', + '三、关键里程碑回顾', + '四、数据分析', + '五、经验总结(Keep/Problem/Try)', + '六、改进计划', + ]), + ('项目概述', [ + '项目背景与目标', + '项目周期:______至______', + '团队规模:______人', + '投入资源:______', + ]), + ('目标 vs 结果', [ + '| 维度 | 原定目标 | 实际结果 | 达成率 |', + '|------|---------|---------|--------|', + '| 目标1 | | | % |', + '| 目标2 | | | % |', + '| 目标3 | | | % |', + '超额完成的部分标绿,未达标的标红', + ]), + ('关键里程碑回顾', [ + '里程碑时间线(可视化)', + ' M1: ______ ✅/❌', + ' M2: ______ ✅/❌', + ' M3: ______ ✅/❌', + '计划 vs 实际的偏差分析', + '延期/变更的原因', + ]), + ('数据分析 — 核心指标', [ + '核心业务数据(用图表展示)', + ' 指标1:______ → ______(变化 ___%)', + ' 指标2:______ → ______(变化 ___%)', + '趋势图/对比图', + '数据洞察(为什么涨/跌)', + ]), + ('数据分析 — 过程指标', [ + '效率指标:需求交付周期、Bug修复速度等', + '质量指标:缺陷率、返工率、客户满意度', + '成本指标:预算 vs 实际支出', + '与历史项目/行业标准对比', + ]), + ('经验总结 — Keep(继续保持)', [ + '做得好的方面(3-5条)', + ' ✅ ______', + ' ✅ ______', + ' ✅ ______', + '为什么做得好?关键成功因素', + '如何制度化/标准化这些做法', + ]), + ('经验总结 — Problem(问题教训)', [ + '出现的主要问题(3-5条)', + ' ❌ ______', + ' ❌ ______', + ' ❌ ______', + '根因分析(5 Whys / 鱼骨图)', + '这些问题造成了什么影响', + ]), + ('经验总结 — Try(尝试改进)', [ + '下次项目要尝试的新做法(3-5条)', + ' 🔄 ______', + ' 🔄 ______', + ' 🔄 ______', + '改进的预期效果', + '需要的资源/支持', + ]), + ('改进行动计划', [ + '| 改进项 | 负责人 | 截止日期 | 验证方式 |', + '|--------|--------|---------|---------|', + '| 改进1 | | | |', + '| 改进2 | | | |', + '| 改进3 | | | |', + '每个改进项有明确的Owner和验收标准', + ]), + ('总结与致谢', [ + '一句话总结本次项目最大的收获', + '感谢团队成员的付出', + '对后续项目的展望', + 'Q&A', + ]), +] + +for i, (title, points) in enumerate(slides, 1): + print('第 {} 页 | {}'.format(i, title)) + print('~' * 40) + for p in points: + print(' - {}'.format(p)) + print('') + +print('-' * 60) +print('【复盘建议】') +print(' - 复盘不是追责会,营造安全的讨论氛围') +print(' - 用数据说话,避免主观臆断') +print(' - Keep:Problem:Try 的比例建议 3:4:3') +print(' - 每个Problem必须对应至少一个Try') +print(' - 改进行动项必须有明确的Owner和截止日期') +print(' - 最重要的:复盘的价值在于执行改进,不在于写报告') +print('=' * 60) +PYEOF + ;; + html) + [ $# -lt 2 ] && { echo "用法: ppt.sh html \"主题\" [--style dark|light|tech|minimal]"; exit 1; } + TOPIC="$2" + shift 2 + STYLE="dark" + while [ $# -gt 0 ]; do + case "$1" in + --style) STYLE="${2:-dark}"; shift 2 ;; + dark|light|tech|minimal) STYLE="$1"; shift ;; + *) shift ;; + esac + done + export _PPT_TOPIC="$TOPIC" _PPT_STYLE="$STYLE" _PPT_DATE="$DATE" + python3 << 'PYEOF' +# -*- coding: utf-8 -*- +import os, datetime, re + +topic = os.environ.get("_PPT_TOPIC", "Presentation") +style = os.environ.get("_PPT_STYLE", "dark") +date_str = os.environ.get("_PPT_DATE", datetime.date.today().strftime("%Y-%m-%d")) + +styles = { + "dark": {"bg": "#0d1117", "bg2": "#161b22", "text": "#e6edf3", "accent": "#58a6ff", "accent2": "#3fb950", "border": "#30363d", "muted": "#8b949e", "card": "#0d1117"}, + "light": {"bg": "#ffffff", "bg2": "#f6f8fa", "text": "#1f2328", "accent": "#0969da", "accent2": "#1a7f37", "border": "#d0d7de", "muted": "#656d76", "card": "#ffffff"}, + "tech": {"bg": "#0a0a2e", "bg2": "#12123e", "text": "#e0e0ff", "accent": "#00ff88", "accent2": "#00ccff", "border": "#2a2a5e", "muted": "#8888bb", "card": "#0f0f35"}, + "minimal": {"bg": "#fafafa", "bg2": "#f0f0f0", "text": "#222222", "accent": "#e63946", "accent2": "#457b9d", "border": "#dddddd", "muted": "#888888", "card": "#ffffff"}, +} + +s = styles.get(style, styles["dark"]) + +is_gradient = style == "tech" +bg_css = "background: linear-gradient(135deg, #0a0a2e, #1a1a4e);" if is_gradient else "background: {};".format(s["bg"]) + +# Build slides content based on topic +slides_data = [] + +# Slide 1: Cover +slides_data.append({ + "type": "cover", + "title": topic, + "subtitle": "Professional Presentation", + "date": date_str, +}) + +# Slide 2: Table of Contents +toc_items = ["Background & Context", "Core Analysis", "Key Insights", "Data Overview", "Implementation Strategy", "Summary & Outlook"] +slides_data.append({ + "type": "toc", + "title": "Contents", + "items": toc_items, +}) + +# Slide 3-7: Content slides +content_slides = [ + { + "title": "Background & Context", + "point": "Understanding the Current Landscape", + "items": [ + "Industry trends and driving forces behind {}".format(topic), + "Key challenges and pain points in the current environment", + "Opportunities for innovation and strategic growth", + ], + }, + { + "title": "Core Analysis", + "point": "Deep Dive into Key Factors", + "items": [ + "Multi-dimensional analysis framework and methodology", + "Critical success factors and risk assessment", + "Comparative study with industry benchmarks", + ], + }, + { + "title": "Key Insights", + "point": "Findings That Matter", + "items": [ + "Data-driven insights reveal significant patterns", + "User behavior and market dynamics analysis", + "Competitive advantages and differentiation strategy", + ], + }, + { + "title": "Implementation Strategy", + "point": "From Vision to Action", + "items": [ + "Phased rollout plan with clear milestones", + "Resource allocation and team structure", + "Risk mitigation and contingency planning", + ], + }, + { + "title": "Future Outlook", + "point": "Next Steps and Long-term Vision", + "items": [ + "Short-term goals: Q1-Q2 execution roadmap", + "Medium-term targets: scaling and optimization", + "Long-term vision: sustainable growth model", + ], + }, +] + +for cs in content_slides: + slides_data.append({"type": "content", **cs}) + +# Slide 8: Data visualization page +slides_data.append({ + "type": "data", + "title": "Data Overview", + "bars": [ + {"label": "Market Share", "value": 78, "color": s["accent"]}, + {"label": "User Growth", "value": 92, "color": s["accent2"]}, + {"label": "Revenue", "value": 65, "color": s["accent"]}, + {"label": "Satisfaction", "value": 88, "color": s["accent2"]}, + {"label": "Efficiency", "value": 71, "color": s["accent"]}, + ], +}) + +# Slide 9: Summary +slides_data.append({ + "type": "summary", + "title": "Summary", + "items": [ + "Comprehensive analysis of {} reveals strong potential".format(topic), + "Data-backed strategy with clear implementation roadmap", + "Phased approach minimizes risk while maximizing impact", + "Cross-functional collaboration drives sustainable results", + "Next step: Kick off Phase 1 execution immediately", + ], +}) + +# Slide 10: Thank you +slides_data.append({ + "type": "thankyou", + "title": "Thank You", + "subtitle": "Questions & Discussion", +}) + +total = len(slides_data) + +# Build slide HTML +def build_slide_html(idx, slide): + display = "flex" if idx == 0 else "none" + html_parts = [] + html_parts.append('
'.format(idx, display)) + + if slide["type"] == "cover": + html_parts.append('
') + html_parts.append('
PRESENTATION
') + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('

{}

'.format(slide["subtitle"])) + html_parts.append('
') + html_parts.append('

{}

'.format(slide["date"])) + html_parts.append('

Press to start

') + html_parts.append('
') + + elif slide["type"] == "toc": + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('
') + for i, item in enumerate(slide["items"]): + html_parts.append('
{:02d}{}
'.format(i + 1, item)) + html_parts.append('
') + + elif slide["type"] == "content": + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('

{}

'.format(slide["point"])) + html_parts.append('
') + for i, item in enumerate(slide["items"]): + html_parts.append('
{}
'.format(item)) + html_parts.append('
') + + elif slide["type"] == "data": + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('
') + for bar in slide["bars"]: + html_parts.append('
') + html_parts.append(' {}'.format(bar["label"])) + html_parts.append('
{}
'.format(bar["value"], bar["color"], "{}%".format(bar["value"]))) + html_parts.append('
') + html_parts.append('
') + + elif slide["type"] == "summary": + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('
') + for i, item in enumerate(slide["items"]): + icon = ["✓", "★", "▶", "◆", "➤"][i % 5] + html_parts.append('
{}{}
'.format(icon, item)) + html_parts.append('
') + + elif slide["type"] == "thankyou": + html_parts.append('
') + html_parts.append('

{}

'.format(slide["title"])) + html_parts.append('
') + html_parts.append('

{}

'.format(slide["subtitle"])) + html_parts.append('

{}

'.format(topic)) + html_parts.append('
') + + html_parts.append('
') + return "\n".join(html_parts) + +all_slides_html = "\n".join(build_slide_html(i, sd) for i, sd in enumerate(slides_data)) + +# Build page indicator dots +dots_html = " ".join(''.format(" active" if i == 0 else "", i) for i in range(total)) + +html = """ + + + + +{topic} - Presentation + + + + +
+ +{slides} + + + + +
{dots}
+
1 / {total}
+ + + +""".format( + topic=topic, + bg_css=bg_css, + text=s["text"], + accent=s["accent"], + accent2=s["accent2"], + bg2=s["bg2"], + border=s["border"], + muted=s["muted"], + card=s["card"], + slides=all_slides_html, + dots=dots_html, + total=total, + progress_init=round(100.0 / total, 1), +) + +# Clean filename +safe_name = re.sub(r'[^\w\u4e00-\u9fff-]', '_', topic) +filename = safe_name + "_presentation.html" +with open(filename, "w", encoding="utf-8") as f: + f.write(html) + +print("") +print("=" * 50) +print(" Presentation Generated Successfully!") +print("=" * 50) +print("") +print(" File : {}".format(filename)) +print(" Topic: {}".format(topic)) +print(" Style: {}".format(style)) +print(" Slides: {} pages".format(total)) +print("") +print(" Open in browser to present") +print(" Keyboard: <- -> to navigate") +print(" Touch: swipe left/right") +print("") +PYEOF + ;; + quick) + TOPIC="${2:?请输入演示主题(一句话描述)}" + export _PPT_TOPIC="$TOPIC" + python3 << 'PYEOF' +import os, datetime, re, math + +topic = os.environ.get("_PPT_TOPIC", "Presentation") +date = datetime.datetime.now().strftime("%Y-%m-%d") + +# Auto-detect scenario +scenarios = { + "work": ["汇报","总结","进展","完成","工作","项目","季度","月度","年度","Q1","Q2","Q3","Q4"], + "product": ["产品","功能","发布","上线","特性","介绍","展示","demo"], + "pitch": ["融资","投资","商业","计划","创业","方案","竞标","BP"], + "edu": ["培训","学习","教程","课程","分享","教学","讲座"], +} +scene = "work" +for k, words in scenarios.items(): + for w in words: + if w in topic: + scene = k + break + +colors = {"bg":"#0d1117","text":"#e6edf3","accent":"#58a6ff","card":"#161b22"} + +slides_html = [] +# Slide 1: Cover +slides_html.append('

{}

{}

{}

'.format(topic, colors["accent"], {"work":"Work Report","product":"Product Launch","pitch":"Business Pitch","edu":"Training Session"}.get(scene,"Presentation"), date)) + +# Slide 2: Agenda +items = {"work":["Goals & Progress","Key Achievements","Challenges","Next Steps"], + "product":["Background","Core Features","Demo","Roadmap"], + "pitch":["Problem","Solution","Market","Ask"], + "edu":["Objectives","Core Concepts","Practice","Summary"]} +agenda = items.get(scene, items["work"]) +agenda_html = "".join(["
  • {}
  • ".format(a) for a in agenda]) +slides_html.append('

    Agenda

      {}
    '.format(agenda_html)) + +# Slides 3-6: Content +for i, title in enumerate(agenda): + points = ["Key point {} for {}".format(j+1, title) for j in range(3)] + pts = "".join(["
  • {}
  • ".format(p) for p in points]) + slides_html.append('

    {}

    '.format(title, pts)) + +# Slide 7: Data +slides_html.append('

    Key Metrics

    85%
    Target
    +23%
    Growth
    4.8/5
    Rating
    '.format(bg=colors["card"], accent=colors["accent"])) + +# Slide 8: Thank you +slides_html.append('

    Thank You

    {}

    bytesagain.com

    '.format(topic, colors["accent"])) + +all_slides = "\n".join(slides_html) +html = """ + +{title} +{slides} + +""".format( + title=topic, bg=colors["bg"], text=colors["text"], accent=colors["accent"], + slides=all_slides, + dots="".join([''.format(' class="active"' if j==0 else "") for j in range(len(slides_html))]) +) + +fn = topic.replace(" ","_").replace("/","_") + "_quick.html" +with open(fn, "w") as f: + f.write(html) +print("=" * 50) +print(" Quick Presentation Generated!") +print("=" * 50) +print() +print(" File : {}".format(fn)) +print(" Topic: {}".format(topic)) +print(" Slides: {} pages".format(len(slides_html))) +print(" Scene: {}".format(scene)) +print() +print(" Open in browser to present") +print(" <- -> to navigate") +print() +print(" Powered by BytesAgain | bytesagain.com | hello@bytesagain.com") +PYEOF + ;; + help|--help|-h) + show_help + ;; + *) + echo "未知命令: $1" + show_help + exit 1 + ;; +esac