#!/usr/bin/env python3 """ K12C 教师岗位胜任力数字化管理方案 - PPT 生成器 将 presentation.html 转换为精美专业的 PPT """ 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 nsmap from pptx.oxml import parse_xml import os import re # 路径设置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) OUTPUT_PATH = os.path.join(BASE_DIR, 'K12C-教师胜任力管理方案.pptx') # 配色方案 COLORS = { 'primary': RGBColor(0x25, 0x63, 0xeb), # 蓝色 #2563eb 'secondary': RGBColor(0x05, 0x96, 0x69), # 绿色 #059669 'accent': RGBColor(0x7c, 0x3a, 0xed), # 紫色 #7c3aed 'warning': RGBColor(0xf5, 0x9e, 0x0b), # 橙色 #f59e0b 'danger': RGBColor(0xef, 0x44, 0x44), # 红色 #ef4444 'text': RGBColor(0x0f, 0x17, 0x2a), # 深色文字 'muted': RGBColor(0x64, 0x74, 0x8b), # 灰色文字 'white': RGBColor(0xff, 0xff, 0xff), 'light_bg': RGBColor(0xf8, 0xfa, 0xfc), 'border': RGBColor(0xe2, 0xe8, 0xf0), 'dark_bg': RGBColor(0x0f, 0x17, 0x2a), # 封面背景 } def hex_to_rgb(hex_str): """将 hex 颜色字符串转换为 RGBColor""" hex_str = hex_str.lstrip('#') return RGBColor(int(hex_str[0:2], 16), int(hex_str[2:4], 16), int(hex_str[4:6], 16)) def create_presentation(): """创建演示文稿""" prs = Presentation() prs.slide_width = Inches(13.333) # 16:9 宽屏 prs.slide_height = Inches(7.5) return prs def add_cover_slide(prs): """添加封面页""" slide_layout = prs.slide_layouts[6] # 空白布局 slide = prs.slides.add_slide(slide_layout) # 背景渐变(用深色矩形模拟) bg = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height ) bg.fill.solid() bg.fill.fore_color.rgb = COLORS['dark_bg'] bg.line.fill.background() # 顶部装饰线 top_line = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(0.06) ) top_line.fill.solid() top_line.fill.fore_color.rgb = COLORS['primary'] top_line.line.fill.background() # Logo 区域 logo_box = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(6.0), Inches(1.5), Inches(1.2), Inches(1.2) ) logo_box.fill.solid() logo_box.fill.fore_color.rgb = RGBColor(0x1e, 0x3a, 0x5f) logo_box.line.color.rgb = COLORS['border'] # Logo 文字 logo_text = slide.shapes.add_textbox(Inches(6.0), Inches(1.8), Inches(1.2), Inches(0.6)) tf = logo_text.text_frame tf.paragraphs[0].text = "K12C" tf.paragraphs[0].font.size = Pt(24) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 主标题 title = slide.shapes.add_textbox(Inches(0.8), Inches(3.0), Inches(11.7), Inches(1.0)) tf = title.text_frame tf.paragraphs[0].text = "教师岗位胜任力数字化管理方案" tf.paragraphs[0].font.size = Pt(44) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 副标题 subtitle = slide.shapes.add_textbox(Inches(0.8), Inches(4.0), Inches(11.7), Inches(0.6)) tf = subtitle.text_frame tf.paragraphs[0].text = "深圳民办 K12 学校解决方案" tf.paragraphs[0].font.size = Pt(24) tf.paragraphs[0].font.color.rgb = RGBColor(0xa5, 0xb4, 0xfc) tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 分隔线 divider = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, Inches(5.8), Inches(4.8), Inches(1.6), Pt(3) ) divider.fill.solid() divider.fill.fore_color.rgb = COLORS['primary'] divider.line.fill.background() # 底部信息 footer = slide.shapes.add_textbox(Inches(0.8), Inches(5.5), Inches(11.7), Inches(0.4)) tf = footer.text_frame tf.paragraphs[0].text = "科学评估 · 精准发展 · 持续成长" tf.paragraphs[0].font.size = Pt(16) tf.paragraphs[0].font.color.rgb = RGBColor(0x8b, 0x95, 0xa5) tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 日期 date_box = slide.shapes.add_textbox(Inches(0.8), Inches(6.2), Inches(11.7), Inches(0.4)) tf = date_box.text_frame tf.paragraphs[0].text = "2024" tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.color.rgb = RGBColor(0x6b, 0x72, 0x80) tf.paragraphs[0].alignment = PP_ALIGN.CENTER return slide def add_section_slide(prs, num, title, subtitle=""): """添加章节分隔页""" slide_layout = prs.slide_layouts[6] slide = prs.slides.add_slide(slide_layout) # 深色背景 bg = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height ) bg.fill.solid() bg.fill.fore_color.rgb = COLORS['dark_bg'] bg.line.fill.background() # 左侧装饰条 left_bar = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, Inches(0.08), prs.slide_height ) left_bar.fill.solid() left_bar.fill.fore_color.rgb = COLORS['primary'] left_bar.line.fill.background() # 章节编号(大字背景) num_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.8), Inches(4.0), Inches(3.0)) tf = num_box.text_frame tf.paragraphs[0].text = f"0{num}" if num < 10 else str(num) tf.paragraphs[0].font.size = Pt(180) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = RGBColor(0x30, 0x41, 0x59) # 章节标题 title_box = slide.shapes.add_textbox(Inches(1.0), Inches(3.2), Inches(11.0), Inches(1.2)) tf = title_box.text_frame tf.paragraphs[0].text = title tf.paragraphs[0].font.size = Pt(48) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] # 副标题 if subtitle: sub_box = slide.shapes.add_textbox(Inches(1.0), Inches(4.5), Inches(11.0), Inches(0.6)) tf = sub_box.text_frame tf.paragraphs[0].text = subtitle tf.paragraphs[0].font.size = Pt(20) tf.paragraphs[0].font.color.rgb = RGBColor(0x94, 0xa3, 0xb8) return slide def add_content_slide(prs, title, icon_char="●", icon_color=None): """添加内容页(通用标题栏)""" slide_layout = prs.slide_layouts[6] slide = prs.slides.add_slide(slide_layout) # 白色背景 bg = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height ) bg.fill.solid() bg.fill.fore_color.rgb = COLORS['white'] bg.line.fill.background() # 顶部渐变条 top_bar = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(0.06) ) top_bar.fill.solid() top_bar.fill.fore_color.rgb = COLORS['primary'] top_bar.line.fill.background() # 标题图标背景 if icon_color is None: icon_color = COLORS['primary'] icon_bg = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(0.4), Inches(0.35), Inches(0.5), Inches(0.5) ) icon_bg.fill.solid() icon_bg.fill.fore_color.rgb = icon_color icon_bg.line.fill.background() # 标题文字 title_box = slide.shapes.add_textbox(Inches(1.0), Inches(0.35), Inches(11.0), Inches(0.5)) tf = title_box.text_frame tf.paragraphs[0].text = title tf.paragraphs[0].font.size = Pt(28) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['text'] # 分隔线 line = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, Inches(0.4), Inches(1.0), Inches(12.5), Pt(2) ) line.fill.solid() line.fill.fore_color.rgb = COLORS['border'] line.line.fill.background() return slide def add_bullet_list(slide, items, left, top, width, height, font_size=16, color=None): """添加项目符号列表""" if color is None: color = COLORS['muted'] content_box = slide.shapes.add_textbox( Inches(left), Inches(top), Inches(width), Inches(height) ) tf = content_box.text_frame tf.word_wrap = True for i, item in enumerate(items): if i == 0: p = tf.paragraphs[0] else: p = tf.add_paragraph() p.text = f"• {item}" p.font.size = Pt(font_size) p.font.color.rgb = color p.space_after = Pt(8) return content_box def add_card(slide, left, top, width, height, title, content=None, color=None): """添加卡片元素""" if color is None: color = COLORS['primary'] # 卡片背景 card_bg = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(left), Inches(top), Inches(width), Inches(height) ) card_bg.fill.solid() card_bg.fill.fore_color.rgb = COLORS['white'] card_bg.line.color.rgb = COLORS['border'] # 顶部色条 accent_bar = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, Inches(left), Inches(top), Inches(width), Inches(0.06) ) accent_bar.fill.solid() accent_bar.fill.fore_color.rgb = color accent_bar.line.fill.background() # 标题 title_box = slide.shapes.add_textbox( Inches(left + 0.15), Inches(top + 0.2), Inches(width - 0.3), Inches(0.4) ) tf = title_box.text_frame tf.paragraphs[0].text = title tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['text'] if content: content_box = slide.shapes.add_textbox( Inches(left + 0.15), Inches(top + 0.6), Inches(width - 0.3), Inches(height - 0.8) ) tf = content_box.text_frame tf.word_wrap = True tf.paragraphs[0].text = content tf.paragraphs[0].font.size = Pt(11) tf.paragraphs[0].font.color.rgb = COLORS['muted'] return card_bg def add_image_slide(prs, title, image_path, caption="", icon_color=None): """添加图片展示页""" slide = add_content_slide(prs, title, icon_color=icon_color) if os.path.exists(image_path): # 计算图片位置(居中,高度限制) img_height = Inches(5.0) img_left = Inches(1.5) slide.shapes.add_picture( image_path, img_left, Inches(1.2), height=img_height ) if caption: cap_box = slide.shapes.add_textbox( Inches(0.5), Inches(6.5), Inches(12.0), Inches(0.5) ) tf = cap_box.text_frame tf.paragraphs[0].text = caption tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.color.rgb = COLORS['muted'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER return slide def add_cta_slide(prs): """添加行动召唤页""" slide_layout = prs.slide_layouts[6] slide = prs.slides.add_slide(slide_layout) # 渐变背景 bg = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height ) bg.fill.solid() bg.fill.fore_color.rgb = COLORS['dark_bg'] bg.line.fill.background() # 顶部装饰 top_line = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(0.06) ) top_line.fill.solid() top_line.fill.fore_color.rgb = COLORS['primary'] top_line.line.fill.background() # 主标题 title = slide.shapes.add_textbox(Inches(0.8), Inches(2.2), Inches(11.7), Inches(1.0)) tf = title.text_frame tf.paragraphs[0].text = "开启教师能力管理新篇章" tf.paragraphs[0].font.size = Pt(44) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 副标题 sub = slide.shapes.add_textbox(Inches(0.8), Inches(3.3), Inches(11.7), Inches(0.6)) tf = sub.text_frame tf.paragraphs[0].text = "科学评估 · 精准发展 · 持续成长" tf.paragraphs[0].font.size = Pt(20) tf.paragraphs[0].font.color.rgb = RGBColor(0xa5, 0xb4, 0xfc) tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 按钮区域 btn1 = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(4.5), Inches(4.3), Inches(2.0), Inches(0.6) ) btn1.fill.solid() btn1.fill.fore_color.rgb = COLORS['primary'] btn1.line.fill.background() btn1_text = slide.shapes.add_textbox(Inches(4.5), Inches(4.4), Inches(2.0), Inches(0.4)) tf = btn1_text.text_frame tf.paragraphs[0].text = "预约 Demo 演示" tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER btn2 = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(6.8), Inches(4.3), Inches(1.6), Inches(0.6) ) btn2.fill.solid() btn2.fill.fore_color.rgb = RGBColor(0x1e, 0x3a, 0x5f) btn2.line.color.rgb = COLORS['border'] btn2_text = slide.shapes.add_textbox(Inches(6.8), Inches(4.4), Inches(1.6), Inches(0.4)) tf = btn2_text.text_frame tf.paragraphs[0].text = "了解更多" tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 联系信息 contact = slide.shapes.add_textbox(Inches(0.8), Inches(5.5), Inches(11.7), Inches(0.4)) tf = contact.text_frame tf.paragraphs[0].text = "contact@example.com | 400-xxx-xxxx" tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.color.rgb = RGBColor(0x8b, 0x95, 0xa5) tf.paragraphs[0].alignment = PP_ALIGN.CENTER return slide def add_thanks_slide(prs): """添加感谢页""" slide_layout = prs.slide_layouts[6] slide = prs.slides.add_slide(slide_layout) # 深色背景 bg = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height ) bg.fill.solid() bg.fill.fore_color.rgb = COLORS['dark_bg'] bg.line.fill.background() # 装饰圆 circle = slide.shapes.add_shape( MSO_SHAPE.OVAL, Inches(5.9), Inches(1.5), Inches(1.5), Inches(1.5) ) circle.fill.solid() circle.fill.fore_color.rgb = RGBColor(0x1e, 0x3a, 0x5f) circle.line.fill.background() # 感谢文字 title = slide.shapes.add_textbox(Inches(0.8), Inches(3.3), Inches(11.7), Inches(1.0)) tf = title.text_frame tf.paragraphs[0].text = "感谢聆听" tf.paragraphs[0].font.size = Pt(56) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['white'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 副标题 sub = slide.shapes.add_textbox(Inches(0.8), Inches(4.3), Inches(11.7), Inches(0.6)) tf = sub.text_frame tf.paragraphs[0].text = "期待与贵校携手,共建教师发展新生态" tf.paragraphs[0].font.size = Pt(20) tf.paragraphs[0].font.color.rgb = RGBColor(0xa5, 0xb4, 0xfc) tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 联系信息 contact = slide.shapes.add_textbox(Inches(0.8), Inches(5.3), Inches(11.7), Inches(1.0)) tf = contact.text_frame tf.paragraphs[0].text = "contact@example.com" tf.paragraphs[0].font.size = Pt(16) tf.paragraphs[0].font.color.rgb = RGBColor(0x8b, 0x95, 0xa5) tf.paragraphs[0].alignment = PP_ALIGN.CENTER p2 = tf.add_paragraph() p2.text = "400-xxx-xxxx" p2.font.size = Pt(16) p2.font.color.rgb = RGBColor(0x8b, 0x95, 0xa5) p2.alignment = PP_ALIGN.CENTER return slide def build_presentation(): """构建完整演示文稿""" prs = create_presentation() # 1. 封面 add_cover_slide(prs) # 2. 目录页 slide = add_content_slide(prs, "目录", icon_color=COLORS['primary']) toc_items = [ "01 项目背景与痛点分析", "02 解决方案概述", "03 核心框架:五维胜任力模型", "04 数据采集体系", "05 AI 赋能:智能分析与个性化推荐", "06 实施路径与预期成果" ] add_bullet_list(slide, toc_items, 1.0, 1.5, 11.0, 5.0, font_size=22, color=COLORS['text']) # ===== 第一章:项目背景 ===== add_section_slide(prs, 1, "项目背景与痛点分析", "行业现状与核心挑战") # 痛点分析 slide = add_content_slide(prs, "行业痛点分析", icon_color=COLORS['danger']) pain_points = [ ("评估主观化", "缺乏客观数据支撑,评价结果公信力不足"), ("数据孤岛", "教学数据、评估数据、成长数据分散在多个系统"), ("培训低效", "培训资源投入大但效果难以量化,提升针对性弱"), ("人才流失", "优秀教师识别困难,缺乏有效激励与发展通道"), ] for i, (title, desc) in enumerate(pain_points): col = i % 2 row = i // 2 add_card(slide, 0.5 + col * 6.3, 1.3 + row * 2.8, 5.8, 2.4, title, desc, COLORS['danger']) # 解决方案概述 slide = add_content_slide(prs, "解决方案概述", icon_color=COLORS['primary']) solutions = [ ("五维胜任力模型", "科学的教师能力评估标准体系", COLORS['primary']), ("数字化管理平台", "教师端 + 管理者端双端联动", COLORS['secondary']), ("AI 智能分析", "自动化评估、个性化发展建议", COLORS['accent']), ("数据驱动决策", "管理驾驶舱、人才四象限热力图", COLORS['warning']), ] for i, (title, desc, color) in enumerate(solutions): add_card(slide, 0.5 + i * 3.1, 1.3, 2.9, 1.8, title, desc, color) # 核心价值 slide = add_content_slide(prs, "核心价值主张", icon_color=COLORS['secondary']) values = [ ("科学化", "基于胜任力模型的标准化评估体系", COLORS['primary']), ("智能化", "AI 赋能评估、分析、推荐全流程", COLORS['secondary']), ("可视化", "数据看板驱动管理决策", COLORS['warning']), ("个性化", "差异化岗位配置与成长路径", COLORS['accent']), ] for i, (title, desc, color) in enumerate(values): add_card(slide, 0.5 + i * 3.1, 1.3, 2.9, 2.0, title, desc, color) # 产品截图页 add_image_slide( prs, "管理者端:管理驾驶舱", os.path.join(BASE_DIR, "管理驾驶舱.png"), "实时掌握全校教师能力分布、胜任力热力图、人才四象限", COLORS['primary'] ) # ===== 第二章:核心框架 ===== add_section_slide(prs, 2, "核心框架", "五维胜任力 + 教学成果模型") # 五维胜任力 slide = add_content_slide(prs, "五维胜任力模型", icon_color=COLORS['primary']) competencies = [ ("1", "专业知识的深度与广度", "学科知识体系、跨学科整合、前沿动态关注", COLORS['primary']), ("2", "教学设计与实施能力", "教案设计、课堂管理、教学方法、反思改进", COLORS['secondary']), ("3", "协作沟通与家校共育", "同事协作、师生关系、家校沟通、团队贡献", COLORS['accent']), ("4", "数字技术应用能力", "信息化工具、多媒体制作、学情分析、线上教学", COLORS['warning']), ("5", "持续发展与自我成长", "职业规划、学习培训、教研成果、经验总结", COLORS['danger']), ] for i, (num, title, desc, color) in enumerate(competencies): col = i % 5 add_card(slide, 0.3 + col * 2.5, 1.3, 2.3, 2.2, f"维度{num}: {title}", desc, color) # 能力画像 add_image_slide( prs, "教师端:讲师能力画像", os.path.join(BASE_DIR, "讲师能力画像.png"), "五维胜任力雷达图,直观展示个人能力分布与成长方向", COLORS['accent'] ) # 教学成果颗粒化管理 slide = add_content_slide(prs, "教学成果颗粒化管理", icon_color=COLORS['danger']) # 左侧:成果数据分层 add_card(slide, 0.5, 1.3, 5.8, 5.5, "成果数据分层", "• 数量维度:课时量 | 任务量 | 产出量\n" "• 质量维度:学业成果 | 课堂质量 | 教研质量\n" "• 效率维度:进步幅度 | 投入产出比", COLORS['primary']) # 右侧:教学流程 add_card(slide, 6.8, 1.3, 5.8, 5.5, "全链路数据采集", "• 备课:课件时长、原创度\n" "• 授课:出勤率、互动频次\n" "• 作业:布置量、难度系数\n" "• 批改:及时率、评语率\n" "• 反馈:满意度、督课分\n" "• 考核:区分度、信效度", COLORS['secondary']) # 量化公式 slide = add_content_slide(prs, "教学成果量化公式", icon_color=COLORS['accent']) formula_box = slide.shapes.add_textbox(Inches(1.0), Inches(2.0), Inches(11.0), Inches(1.5)) tf = formula_box.text_frame tf.paragraphs[0].text = "综合分 = Σ(颗粒指标 × 权重) × 岗位系数" tf.paragraphs[0].font.size = Pt(32) tf.paragraphs[0].font.bold = True tf.paragraphs[0].font.color.rgb = COLORS['primary'] tf.paragraphs[0].alignment = PP_ALIGN.CENTER # 权重示例 weights = [ ("学业进步率", "35%", COLORS['primary']), ("课堂满意度", "25%", COLORS['secondary']), ("作业批改质量", "20%", COLORS['accent']), ("教研产出", "10%", COLORS['warning']), ("数字工具使用", "10%", COLORS['danger']), ] for i, (name, pct, color) in enumerate(weights): add_card(slide, 0.5 + i * 2.5, 3.5, 2.3, 1.5, name, pct, color) # 岗位差异化配置 slide = add_content_slide(prs, "岗位差异化配置", icon_color=COLORS['warning']) roles = [ ("学科教师", "教学力 60%", "学科专业发展路径", "所教班级成绩进步率", COLORS['primary']), ("班主任", "协作力 50%", "家校沟通看板", "班级学生满意度", COLORS['secondary']), ("年级组长", "发展力 40%", "团队数据分析", "年级整体进步率", COLORS['accent']), ("教务主任", "五维均衡", "全校胜任力热力图", "学校教学成果汇总", COLORS['warning']), ] for i, (role, weight, feature, metric, color) in enumerate(roles): add_card(slide, 0.4 + i * 3.15, 1.3, 3.0, 5.0, role, f"胜任力权重: {weight}\n\n特色功能: {feature}\n\n核心成果指标: {metric}", color) # ===== 第三章:数据采集 ===== add_section_slide(prs, 3, "数据采集", "多维度数据来源设计") # 数据采集体系 slide = add_content_slide(prs, "数据采集体系", icon_color=COLORS['warning']) # 数据源权重 weights_data = [ ("自评", "30%", COLORS['primary']), ("上级评价", "30%", COLORS['secondary']), ("同僚互评", "20%", COLORS['accent']), ("学生反馈", "20%", COLORS['warning']), ] for i, (name, pct, color) in enumerate(weights_data): add_card(slide, 0.5 + i * 3.1, 1.3, 2.9, 1.5, name, pct, color) # 采集流程 flow_items = [ ("自评", "10-15分钟", COLORS['primary']), ("互评", "5-8分钟/人", COLORS['secondary']), ("上级", "8-10分钟", COLORS['accent']), ("学生", "3-5分钟", COLORS['warning']), ] for i, (name, time, color) in enumerate(flow_items): add_card(slide, 0.5 + i * 3.1, 3.2, 2.9, 1.5, name, time, color) # ===== 第四章:AI赋能 ===== add_section_slide(prs, 4, "AI 赋能", "智能分析与个性化推荐") # AI智能分析 slide = add_content_slide(prs, "AI 智能分析", icon_color=COLORS['accent']) ai_features = [ ("权重计算", COLORS['primary']), ("离群检测", COLORS['secondary']), ("趋势分析", COLORS['accent']), ("个性化推荐", COLORS['warning']), ] for i, (name, color) in enumerate(ai_features): add_card(slide, 0.5 + i * 3.1, 1.3, 2.9, 1.5, name, "", color) # 个性化建议 add_card(slide, 0.5, 3.2, 12.3, 3.0, "个性化发展建议", "短板识别:协作沟通 -15% | 家校互动不足\n" "推荐方案:高效家校沟通课 + 跨学科教研小组\n" "学习资源:3个视频课程 + 2篇案例", COLORS['secondary']) # 能力-成果关联 slide = add_content_slide(prs, "能力-成果关联矩阵", icon_color=COLORS['primary']) matrix = [ ("能力强+成果好", "高潜教师 · 标杆培养", COLORS['primary']), ("能力强+成果差", "待挖掘 · 潜力未发", COLORS['warning']), ("能力弱+成果好", "经验型 · 补强理论", COLORS['secondary']), ("能力弱+成果差", "待提升 · 重点帮扶", COLORS['danger']), ] for i, (quadrant, desc, color) in enumerate(matrix): add_card(slide, 0.5 + (i % 2) * 6.3, 1.3 + (i // 2) * 2.8, 5.8, 2.4, quadrant, desc, color) # AI智能建议截图 add_image_slide( prs, "教师端:AI 智能建议", os.path.join(BASE_DIR, "教师AI建议.png"), "AI 个性化发展建议,智能识别短板并推荐学习资源", COLORS['accent'] ) # 个人发展计划截图 add_image_slide( prs, "教师端:个人发展计划", os.path.join(BASE_DIR, "教师个人发展.png"), "PDP 个人发展计划,可视化成长轨迹与阶段性目标", COLORS['secondary'] ) # ===== 第五章:实施路径 ===== add_section_slide(prs, 5, "实施路径与预期成果", "落地步骤与价值实现") # 实施时间表 slide = add_content_slide(prs, "实施时间表", icon_color=COLORS['secondary']) phases = [ ("第一阶段(第1-2周)", "启动准备", "需求调研、岗位梳理、胜任力模型定制", COLORS['primary']), ("第二阶段(第3-4周)", "系统部署", "平台搭建、数据迁移、权限配置", COLORS['secondary']), ("第三阶段(第5-6周)", "培训推广", "管理员培训、教师培训、试运行", COLORS['accent']), ("第四阶段(第7-8周)", "正式上线", "学期初评估、持续追踪、效果优化", COLORS['warning']), ] for i, (phase, title, desc, color) in enumerate(phases): add_card(slide, 0.4 + i * 3.15, 1.3, 3.0, 2.5, f"{phase}\n{title}", desc, color) # 持续运营 add_card(slide, 0.4, 4.2, 12.5, 1.8, "持续运营", "数据积累:每学期评估、年度分析、持续改进", COLORS['secondary']) # 预期成果 slide = add_content_slide(prs, "预期成果", icon_color=COLORS['primary']) results = [ ("85%", "评估覆盖率", "全校教师能力评估全覆盖", COLORS['primary']), ("30%", "培训效率提升", "精准培训减少无效投入", COLORS['secondary']), ("50%", "人才识别率", "更精准发现高潜教师", COLORS['accent']), ] for i, (num, title, desc, color) in enumerate(results): add_card(slide, 0.5 + i * 4.1, 1.3, 3.8, 2.5, f"{num}\n{title}", desc, color) # 产品功能 slide = add_content_slide(prs, "产品功能", icon_color=COLORS['accent']) add_card(slide, 0.5, 1.3, 5.8, 2.5, "教师端", "• 五维能力雷达图\n• AI 个性化建议\n• 个人发展计划(PDP)", COLORS['primary']) add_card(slide, 6.8, 1.3, 5.8, 2.5, "管理者端", "• 管理驾驶舱\n• 胜任力热力图\n• 人才四象限", COLORS['secondary']) # 合作方式 add_card(slide, 0.5, 4.2, 12.3, 2.0, "合作方式", "Demo演示(免费) | 试点项目(定制报价) | 全校部署(年度授权)", COLORS['accent']) # CTA add_cta_slide(prs) # 感谢页 add_thanks_slide(prs) # 保存 prs.save(OUTPUT_PATH) print(f"PPT 已生成: {OUTPUT_PATH}") return OUTPUT_PATH if __name__ == '__main__': build_presentation()