首页 我的主页 / 工具

会议发言提纲工具

关于会议发言提纲

清晰的发言提纲能帮助您在会议中逻辑清晰、重点突出地表达观点。本工具提供多种预设的发言结构模板, 您只需填写会议主题和具体要点,即可生成专业的发言提纲,让您的会议发言更有影响力。

使用提示:选择适合您会议类型的模板,按结构填写要点,完成后可导出或打印提纲。

会议信息

选择发言模板 *

基础表达型

推荐新手

适合简短发言,清晰表达观点和建议

核心观点
支持案例/数据
具体建议
总结

问题解决型

常用

适合问题讨论,结构化呈现解决方案

问题描述
原因分析
解决方案
实施计划

工作汇报型

正式场合

适合工作汇报,全面展示工作进展

工作进展
成果与数据
存在问题
下一步计划

决策建议型

管理层

适合提供决策参考,分析多种方案

背景与目标
可选方案
利弊分析
推荐方案

观点说服型

谈判

适合需要说服他人接受观点的场合

现状与痛点
核心主张
支持论据
行动呼吁

创新提案型

头脑风暴

适合提出新想法、新项目或创新方案

创新点
价值与优势
实施思路
资源需求
`); printWindow.document.close(); printWindow.print(); }); // 导出PDF按钮(模拟,实际项目中需使用jsPDF等库) downloadBtn.addEventListener('click', () => { showInfo('PDF导出功能已触发(实际项目中需集成PDF库)', 'info'); // 实际实现中可使用jsPDF或html2pdf等库 }); // 保存提纲按钮 saveBtn.addEventListener('click', saveOutline); mobileSaveBtn.addEventListener('click', () => { mobileMenu.classList.add('hidden'); saveOutline(); }); // 移动端菜单切换 mobileMenuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); // 保存成功模态框关闭按钮 closeSaveModal.addEventListener('click', closeSaveSuccessModal); // 我的提纲模态框相关 saveBtn.addEventListener('click', openMyOutlinesModal); mobileSaveBtn.addEventListener('click', openMyOutlinesModal); closeMyOutlinesBtn.addEventListener('click', closeMyOutlinesModal); clearSavedOutlinesBtn.addEventListener('click', clearAllSavedOutlines); // 帮助模态框相关 helpBtn.addEventListener('click', openHelpModal); mobileHelpBtn.addEventListener('click', () => { mobileMenu.classList.add('hidden'); openHelpModal(); }); closeHelpBtn.addEventListener('click', closeHelpModal); // 点击模态框外部关闭 saveSuccessModal.addEventListener('click', (e) => { if (e.target === saveSuccessModal) { closeSaveSuccessModal(); } }); myOutlinesModal.addEventListener('click', (e) => { if (e.target === myOutlinesModal) { closeMyOutlinesModal(); } }); helpModal.addEventListener('click', (e) => { if (e.target === helpModal) { closeHelpModal(); } }); // 键盘ESC关闭模态框 document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { closeSaveSuccessModal(); closeMyOutlinesModal(); closeHelpModal(); } }); } // 生成提纲表单 function generateOutlineForm() { if (!selectedTemplate || !templates[selectedTemplate]) return; const template = templates[selectedTemplate]; outlineForm.innerHTML = ''; // 添加模板说明 const templateDesc = document.createElement('div'); templateDesc.className = 'bg-gray-50 p-3 rounded-lg text-sm text-gray-600 mb-4'; templateDesc.innerHTML = ` 请根据${template.name}的结构,填写以下发言要点`; outlineForm.appendChild(templateDesc); // 添加各部分输入框 template.sections.forEach(section => { const sectionGroup = document.createElement('div'); sectionGroup.className = 'section-group'; sectionGroup.innerHTML = `
0 字符
`; outlineForm.appendChild(sectionGroup); // 添加字符计数 const textarea = document.getElementById(section.id); const charCountEl = document.querySelector(`.${section.id}-char-count`); textarea.addEventListener('input', () => { charCountEl.textContent = `${textarea.value.length} 字符`; updateGenerateButtonState(); }); }); } // 更新生成按钮状态 function updateGenerateButtonState() { // 检查是否选择了模板 if (!selectedTemplate) { generateBtn.disabled = true; generateBtn.classList.remove('bg-primary', 'text-white', 'hover:bg-primary/90'); generateBtn.classList.add('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); return; } // 检查会议主题是否填写 if (!meetingTitle.value.trim()) { generateBtn.disabled = true; generateBtn.classList.remove('bg-primary', 'text-white', 'hover:bg-primary/90'); generateBtn.classList.add('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); return; } // 检查模板各部分是否填写 const template = templates[selectedTemplate]; let allFilled = true; template.sections.forEach(section => { const textarea = document.getElementById(section.id); if (!textarea || !textarea.value.trim()) { allFilled = false; } }); // 更新按钮状态 generateBtn.disabled = !allFilled; if (allFilled) { generateBtn.classList.remove('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); generateBtn.classList.add('bg-primary', 'text-white', 'hover:bg-primary/90'); } else { generateBtn.classList.remove('bg-primary', 'text-white', 'hover:bg-primary/90'); generateBtn.classList.add('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); } // 更新保存按钮状态 const canSave = outlinePreview.classList.contains('hidden') === false; saveBtn.disabled = !canSave; mobileSaveBtn.disabled = !canSave; if (canSave) { saveBtn.classList.remove('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); saveBtn.classList.add('hover:bg-white/20'); mobileSaveBtn.classList.remove('text-gray-500', 'cursor-not-allowed'); mobileSaveBtn.classList.add('text-gray-800', 'hover:bg-gray-100'); } else { saveBtn.classList.add('bg-gray-300', 'text-gray-500', 'cursor-not-allowed'); saveBtn.classList.remove('hover:bg-white/20'); mobileSaveBtn.classList.add('text-gray-500', 'cursor-not-allowed'); mobileSaveBtn.classList.remove('text-gray-800', 'hover:bg-gray-100'); } } // 生成提纲预览 function generateOutlinePreview() { if (!selectedTemplate || !templates[selectedTemplate]) return; const template = templates[selectedTemplate]; // 构建会议信息HTML let meetingInfoHtml = `

${meetingTitle.value}

`; if (meetingDate.value) { const date = new Date(meetingDate.value); const formattedDate = date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' }); meetingInfoHtml += `
日期:${formattedDate}
`; } if (meetingDuration.value) { meetingInfoHtml += `
发言时长:${meetingDuration.value} 分钟
`; } if (meetingParticipants.value) { meetingInfoHtml += `
参会人员:${meetingParticipants.value}
`; } meetingInfoHtml += `
`; // 构建提纲内容HTML let outlineContentHtml = '
'; template.sections.forEach((section, index) => { const textarea = document.getElementById(section.id); const content = textarea ? textarea.value.trim() : ''; // 将换行符转换为
const formattedContent = content.replace(/\n/g, '
'); outlineContentHtml += `

${index + 1} ${section.title}

${formattedContent}
`; }); outlineContentHtml += '
'; // 添加页脚提示 const footerHtml = `

使用会议发言提纲工具生成 | 发言时可根据实际情况灵活调整内容

`; // 更新预览内容 previewContent.innerHTML = meetingInfoHtml + outlineContentHtml + footerHtml; // 显示预览区,隐藏编辑区 outlineEditor.classList.add('hidden'); outlinePreview.classList.remove('hidden'); // 更新保存按钮状态 updateGenerateButtonState(); } // 保存提纲 function saveOutline() { if (!selectedTemplate || !templates[selectedTemplate]) return; // 收集提纲数据 const outlineData = { id: Date.now(), dateCreated: new Date().toISOString(), meetingTitle: meetingTitle.value.trim(), meetingDate: meetingDate.value, meetingDuration: meetingDuration.value, meetingParticipants: meetingParticipants.value.trim(), template: selectedTemplate, templateName: templates[selectedTemplate].name, content: {} }; // 收集各部分内容 templates[selectedTemplate].sections.forEach(section => { const textarea = document.getElementById(section.id); if (textarea) { outlineData.content[section.id] = textarea.value.trim(); } }); // 添加到保存的提纲列表 savedOutlines.unshift(outlineData); // 限制保存的提纲数量为10条 if (savedOutlines.length > 10) { savedOutlines = savedOutlines.slice(0, 10); } // 保存到本地存储 localStorage.setItem('meetingOutlines', JSON.stringify(savedOutlines)); // 更新保存的提纲列表 updateSavedOutlinesList(); // 显示保存成功提示 openSaveSuccessModal(); } // 更新保存的提纲列表 function updateSavedOutlinesList() { // 清空列表 savedOutlinesList.innerHTML = ''; if (savedOutlines.length === 0) { // 显示空状态 savedOutlinesList.appendChild(noSavedOutlinesMessage); clearSavedOutlinesBtn.disabled = true; return; } // 隐藏空状态 noSavedOutlinesMessage.remove(); clearSavedOutlinesBtn.disabled = false; // 添加保存的提纲 savedOutlines.forEach(outline => { const date = new Date(outline.dateCreated); const formattedDate = date.toLocaleString('zh-CN'); const outlineItem = document.createElement('div'); outlineItem.className = 'border border-gray-200 rounded-lg p-3 hover:bg-gray-50 transition-colors cursor-pointer'; outlineItem.innerHTML = `
${outline.meetingTitle}
${formattedDate}
${outline.templateName} ${outline.meetingDate ? `${new Date(outline.meetingDate).toLocaleDateString()}` : ''}
`; savedOutlinesList.appendChild(outlineItem); }); // 为加载按钮添加事件 document.querySelectorAll('.load-outline').forEach(btn => { btn.addEventListener('click', function(e) { e.stopPropagation(); const outlineId = parseInt(this.getAttribute('data-id')); loadSavedOutline(outlineId); closeMyOutlinesModal(); }); }); // 为删除按钮添加事件 document.querySelectorAll('.delete-outline').forEach(btn => { btn.addEventListener('click', function(e) { e.stopPropagation(); const outlineId = parseInt(this.getAttribute('data-id')); deleteSavedOutline(outlineId); }); }); } // 加载保存的提纲 function loadSavedOutline(outlineId) { const outline = savedOutlines.find(o => o.id === outlineId); if (!outline) return; // 填充会议信息 meetingTitle.value = outline.meetingTitle; meetingDate.value = outline.meetingDate; meetingDuration.value = outline.meetingDuration || ''; meetingParticipants.value = outline.meetingParticipants || ''; // 选择对应的模板 selectedTemplate = outline.template; templateCards.forEach(card => { if (card.getAttribute('data-template') === selectedTemplate) { card.classList.add('template-active'); } else { card.classList.remove('template-active'); } }); // 生成表单并填充内容 generateOutlineForm(); // 填充各部分内容 if (outline.content && templates[selectedTemplate]) { templates[selectedTemplate].sections.forEach(section => { const textarea = document.getElementById(section.id); if (textarea && outline.content[section.id]) { textarea.value = outline.content[section.id]; // 更新字符计数 const charCountEl = document.querySelector(`.${section.id}-char-count`); charCountEl.textContent = `${textarea.value.length} 字符`; } }); } // 显示编辑区 outlineEditor.classList.remove('hidden'); outlinePreview.classList.add('hidden'); // 滚动到编辑区 outlineEditor.scrollIntoView({ behavior: 'smooth', block: 'start' }); // 更新生成按钮状态 updateGenerateButtonState(); } // 删除保存的提纲 function deleteSavedOutline(outlineId) { if (confirm('确定要删除这个发言提纲吗?')) { savedOutlines = savedOutlines.filter(o => o.id !== outlineId); localStorage.setItem('meetingOutlines', JSON.stringify(savedOutlines)); updateSavedOutlinesList(); showInfo('发言提纲已删除', 'info'); } } // 清空所有保存的提纲 function clearAllSavedOutlines() { if (savedOutlines.length === 0) return; if (confirm('确定要清空所有保存的发言提纲吗?此操作不可恢复。')) { savedOutlines = []; localStorage.setItem('meetingOutlines', JSON.stringify(savedOutlines)); updateSavedOutlinesList(); showInfo('所有发言提纲已清空', 'info'); } } // 打开保存成功模态框 function openSaveSuccessModal() { saveSuccessModal.classList.remove('hidden'); // 触发动画 setTimeout(() => { saveSuccessModalContent.classList.remove('scale-95', 'opacity-0'); saveSuccessModalContent.classList.add('scale-100', 'opacity-100'); }, 10); } // 关闭保存成功模态框 function closeSaveSuccessModal() { saveSuccessModalContent.classList.remove('scale-100', 'opacity-100'); saveSuccessModalContent.classList.add('scale-95', 'opacity-0'); // 隐藏模态框 setTimeout(() => { saveSuccessModal.classList.add('hidden'); }, 300); } // 打开我的提纲模态框 function openMyOutlinesModal() { myOutlinesModal.classList.remove('hidden'); // 触发动画 setTimeout(() => { myOutlinesModalContent.classList.remove('scale-95', 'opacity-0'); myOutlinesModalContent.classList.add('scale-100', 'opacity-100'); }, 10); } // 关闭我的提纲模态框 function closeMyOutlinesModal() { myOutlinesModalContent.classList.remove('scale-100', 'opacity-100'); myOutlinesModalContent.classList.add('scale-95', 'opacity-0'); // 隐藏模态框 setTimeout(() => { myOutlinesModal.classList.add('hidden'); }, 300); } // 打开帮助模态框 function openHelpModal() { helpModal.classList.remove('hidden'); // 触发动画 setTimeout(() => { helpModalContent.classList.remove('scale-95', 'opacity-0'); helpModalContent.classList.add('scale-100', 'opacity-100'); }, 10); } // 关闭帮助模态框 function closeHelpModal() { helpModalContent.classList.remove('scale-100', 'opacity-100'); helpModalContent.classList.add('scale-95', 'opacity-0'); // 隐藏模态框 setTimeout(() => { helpModal.classList.add('hidden'); }, 300); } // 显示提示信息 function showInfo(message, type = 'info') { infoMessage.textContent = message; // 设置信息类型样式 if (type === 'success') { infoIcon.className = 'fa fa-check-circle mr-2 text-green-400'; } else if (type === 'error') { infoIcon.className = 'fa fa-exclamation-circle mr-2 text-red-400'; } else { infoIcon.className = 'fa fa-info-circle mr-2'; } // 显示信息 infoSection.classList.remove('hidden'); setTimeout(() => { infoSection.classList.remove('translate-y-10', 'opacity-0'); }, 10); // 3秒后自动隐藏 setTimeout(() => { infoSection.classList.add('translate-y-10', 'opacity-0'); setTimeout(() => { infoSection.classList.add('hidden'); }, 300); }, 3000); }