/
www
/
wwwroot
/
shgd123.com
/
Upload File
HOME
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GEO软文智能生成器 - 上海冠顶工业设备有限公司</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; } body { background-color: #f5f7fa; padding: 20px; line-height: 1.6; } .container { max-width: 1200px; margin: 0 auto; background: #fff; border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); padding: 30px; } /* 标题+电话网站同行排版 */ .header-top { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 20px; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid #e5e7eb; } .main-title { font-size: 26px; color: #1f2937; font-weight: 600; margin: 0; flex: 1; text-align: left; } .company-contact-row { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; } .contact-item { display: flex; align-items: center; gap: 8px; } .contact-item label { font-size: 14px; color: #374151; font-weight: 500; white-space: nowrap; } .contact-item input { padding: 8px 12px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 14px; width: 180px; } .contact-item input:focus { outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } /* 原有样式保留并适配 */ .form-section { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 30px; align-items: start; } @media (max-width: 768px) { .form-section { grid-template-columns: 1fr; } .header-top { flex-direction: column; align-items: flex-start; } .main-title { text-align: center; width: 100%; } .company-contact-row { width: 100%; justify-content: center; } .contact-item input { width: 100%; } } .form-column { display: flex; flex-direction: column; gap: 20px; } .form-group { margin-bottom: 0; } .form-label { display: block; font-size: 15px; color: #374151; margin-bottom: 8px; font-weight: 500; } .form-control { width: 100%; padding: 12px 16px; border: 1px solid #d1d5db; border-radius: 8px; font-size: 14px; transition: border-color 0.2s, box-shadow 0.2s; } .form-control:focus { outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } #requirements.form-control { min-height: 80px; max-height: 100px; resize: vertical; line-height: 1.5; } select.form-control { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%234b5563' viewBox='0 0 16 16'%3E%3Cpath d='M8 11.5l-6-6 1.5-1.5L8 8.5l4.5-4.5L14 5.5l-6 6z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 40px; } .article-type-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; margin-top: 8px; } .type-item { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; background: #f9fafb; border-radius: 6px; cursor: pointer; transition: background 0.2s, border-color 0.2s; border: 1px solid transparent; } .type-item:hover { background: #f3f4f6; border-color: #e5e7eb; } .type-item.selected { background: #eff6ff; border-color: #2563eb; } .type-item .radio-wrapper { display: flex; align-items: center; gap: 8px; } .type-item input { width: 18px; height: 18px; accent-color: #2563eb; } .type-item label { font-size: 14px; color: #374151; cursor: pointer; flex: 1; } .type-desc { font-size: 12px; color: #6b7280; margin-top: 0; padding-left: 26px; } .btn-container { text-align: center; margin-bottom: 30px; } .btn-generate { padding: 14px 32px; background-color: #2563eb; color: #fff; border: none; border-radius: 8px; font-size: 16px; font-weight: 500; cursor: pointer; transition: background-color 0.2s; } .btn-generate:hover { background-color: #1d4ed8; } .btn-generate:disabled { background-color: #93c5fd; cursor: not-allowed; } .result-section { margin-top: 40px; padding-top: 30px; border-top: 1px solid #e5e7eb; } .result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; flex-wrap: wrap; gap: 10px; } .result-title { font-size: 18px; color: #1f2937; font-weight: 600; } .action-buttons { display: flex; gap: 10px; } .btn-action { padding: 8px 16px; background-color: #f3f4f6; color: #374151; border: 1px solid #d1d5db; border-radius: 6px; font-size: 14px; cursor: pointer; transition: background-color 0.2s; display: flex; align-items: center; gap: 6px; } .btn-action:hover { background-color: #e5e7eb; } .btn-action.primary { background-color: #2563eb; color: white; border-color: #2563eb; } .btn-action.primary:hover { background-color: #1d4ed8; } /* 增强排版样式 */ .article-editor { min-height: 500px; padding: 20px; background: #fff; border-radius: 8px; border: 1px solid #e5e7eb; font-size: 16px; color: #1f2937; line-height: 1.8; box-shadow: 0 2px 8px rgba(0,0,0,0.05); white-space: pre-wrap; } /* 首行缩进样式 */ .article-editor.indent { text-indent: 2em; } .article-editor:empty:before { content: attr(placeholder); color: #9ca3af; cursor: text; } .loading { text-align: center; padding: 40px; color: #6b7280; font-size: 16px; } .empty-state { text-align: center; padding: 60px 20px; color: #6b7280; font-size: 15px; } .seo-tips { margin-top: 20px; padding: 16px; background: #fef3c7; border-radius: 8px; border-left: 4px solid #f59e0b; display: none; } .seo-tips h4 { font-size: 15px; color: #92400e; margin-bottom: 8px; } .seo-tips ul { padding-left: 20px; font-size: 14px; color: #92400e; } .alert-error { background: #fee2e2; color: #b91c1c; padding: 12px 16px; border-radius: 6px; margin: 16px 0; border-left: 4px solid #ef4444; display: none; } .alert-warning { background: #fffbeb; color: #92400e; padding: 12px 16px; border-radius: 6px; margin: 16px 0; border-left: 4px solid #f59e0b; display: none; } /* 增强排版工具栏 */ .editor-toolbar { display: flex; gap: 8px; padding: 10px 16px; background: #f9fafb; border: 1px solid #e5e7eb; border-bottom: none; border-radius: 8px 8px 0 0; flex-wrap: wrap; } .toolbar-btn { padding: 6px 10px; background: #fff; border: 1px solid #d1d5db; border-radius: 4px; font-size: 13px; cursor: pointer; display: flex; align-items: center; gap: 4px; } .toolbar-btn:hover { background: #f3f4f6; } /* 新增排版控制按钮组 */ .format-control-group { display: flex; gap: 8px; align-items: center; margin-left: auto; } .format-select { padding: 6px 10px; border: 1px solid #d1d5db; border-radius: 4px; font-size: 13px; background: #fff; } .indent-switch { display: flex; align-items: center; gap: 4px; font-size: 13px; color: #374151; } .indent-switch input { width: 16px; height: 16px; accent-color: #2563eb; } .editor-container { border-radius: 8px; overflow: hidden; margin-bottom: 20px; } .keyword-expand { margin-top: 10px; padding: 10px; background: #f8fafc; border-radius: 6px; border: 1px solid #e2e8f0; } .expand-title { font-size: 13px; color: #2563eb; font-weight: 500; margin-bottom: 8px; display: flex; align-items: center; gap: 6px; } .expand-keywords { display: flex; flex-wrap: wrap; gap: 6px; } .expand-tag { padding: 4px 8px; background: #eff6ff; color: #2563eb; border-radius: 4px; font-size: 12px; cursor: pointer; } .expand-tag:hover { background: #dbeafe; } .expand-tag.loading { color: #6b7280; background: #f3f4f6; padding: 4px 8px; font-size: 12px; } .image-upload-group { margin-top: 0; /* 移除原有margin-top,保持和其他form-group一致的gap */ } .image-preview { width: 100%; height: 150px; border: 1px dashed #d1d5db; border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-top: 8px; overflow: hidden; position: relative; } .image-preview img { width: 100%; height: 100%; object-fit: contain; } .image-preview-text { color: #9ca3af; font-size: 14px; } #imageUrl { margin-top: 8px; } .word-count-tip { font-size: 12px; color: #6b7280; margin-top: 6px; } .word-count-highlight { color: #2563eb; font-weight: 500; } .article-count-group { margin-top: 0; /* 移除原有margin-top,保持和其他form-group一致的gap */ } .article-count-selector { display: flex; gap: 8px; margin-top: 8px; flex-wrap: wrap; } .count-option { padding: 8px 16px; border: 1px solid #d1d5db; border-radius: 6px; cursor: pointer; font-size: 14px; transition: all 0.2s; } .count-option:hover { border-color: #2563eb; background: #f9fafb; } .count-option.selected { background: #2563eb; color: white; border-color: #2563eb; } .articles-container { display: flex; flex-direction: column; gap: 20px; margin-top: 20px; } .article-card { border: 1px solid #e5e7eb; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 4px rgba(0,0,0,0.05); } .article-card-header { padding: 12px 16px; background: #f9fafb; border-bottom: 1px solid #e5e7eb; display: flex; justify-content: space-between; align-items: center; } .article-card-title { font-weight: 500; color: #1f2937; font-size: 15px; } .article-card-actions { display: flex; gap: 8px; } .card-action-btn { padding: 4px 8px; font-size: 12px; border-radius: 4px; border: 1px solid #d1d5db; background: white; cursor: pointer; } .card-action-btn:hover { background: #f3f4f6; } /* 核心修改:优化文章内容排版样式 */ .generated-article-content { padding: 20px; font-size: 16px; line-height: 1.8; text-indent: 2em; text-align: justify; /* 两端对齐 */ word-break: break-all; white-space: pre-wrap; /* 保留换行 */ background: #fff; border: 1px solid #e5e7eb; } /* 段落样式 */ .article-paragraph { margin-bottom: 1.5em; /* 段落间距 */ line-height: 1.8; text-indent: 2em; text-align: justify; } /* 调整:文章标题展示样式(放在内容上方) */ .article-title-display { font-size: 20px; font-weight: 600; color: #1f2937; padding: 16px 20px 8px 20px; background: #f9fafb; border-bottom: 1px solid #e5e7eb; line-height: 1.4; margin: 0; } /* 新增:文章统计信息样式(放在创作要求上方) */ .article-stats { padding: 12px 16px; background: #f0f9ff; border-radius: 6px; border: 1px solid #bae6fd; margin-bottom: 16px; font-size: 14px; color: #0369a1; } /* 标签样式:一行显示 */ .article-tags { margin-top: 16px; padding-top: 16px; border-top: 1px dashed #e5e7eb; font-size: 15px; color: #1f2937; } </style> </head> <body> <div class="container"> <!-- 标题+电话网站同行布局 --> <div class="header-top"> <h1 class="main-title">GEO软文智能创作</h1> <div class="company-contact-row"> <div class="contact-item"> <label>联系电话:</label> <input type="text" id="companyPhone" placeholder="请输入公司联系电话"> </div> <div class="contact-item"> <label>网站:</label> <input type="text" id="companyWebsite" placeholder="www.shgd123.com"> </div> </div> </div> <div class="form-section"> <div class="left-column form-column"> <div class="form-group"> <label class="form-label">核心关键词 <span style="color: #ef4444;">*</span></label> <!-- 输入框+获取拓展词按钮 组合布局 --> <div style="display: flex; gap: 8px; align-items: center;"> <input type="text" id="keywords" class="form-control" placeholder="请输入核心关键词,多个关键词用逗号分隔(例如:隧道炉,工业烤箱,高温烘箱)"> <button type="button" id="expandKeywordBtn" class="btn-action" style="white-space: nowrap; padding: 12px 16px;">获取拓展词</button> </div> <div class="keyword-expand" id="keywordExpand" style="display: none;"> <div class="expand-title"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> <line x1="8" y1="11" x2="14" y2="11"></line> </svg> AI智能拓展热搜词(按搜索量排序) </div> <div class="expand-keywords" id="expandKeywordsList"></div> </div> </div> <div class="form-group"> <label class="form-label">文章核心需求 <span style="color: #ef4444;">*</span></label> <textarea id="requirements" class="form-control" placeholder="请详细描述文章的核心需求,例如:突出产品的耐高温特性、节能优势,面向工业制造企业,强调厂家直供和定制化服务,语言风格专业但易懂..."></textarea> </div> <div class="form-group"> <label class="form-label">目标字数</label> <select id="wordCount" class="form-control"> <option value="500">500字左右</option> <option value="800" selected>800字左右</option> <option value="1000">1000字左右</option> <option value="1500">1500字左右</option> <option value="2000">2000字左右</option> </select> <div class="word-count-tip"> 生成内容将控制在 <span class="word-count-highlight" id="selectedWordCount">800</span> 字(误差±50字),内容以上海冠顶工业设备有限公司为核心 </div> </div> <div class="form-group"> <label class="form-label">SEO优化强度</label> <select id="seoLevel" class="form-control"> <option value="normal">常规优化</option> <option value="high" selected>高度优化</option> <option value="extreme">极致优化</option> </select> </div> <div class="form-group article-count-group"> <label class="form-label">生成文章数量 <span style="color: #ef4444;">*</span></label> <div class="article-count-selector" id="articleCountSelector"> <div class="count-option selected" data-count="1">1篇</div> <div class="count-option" data-count="2">2篇</div> <div class="count-option" data-count="3">3篇</div> <div class="count-option" data-count="4">4篇</div> <div class="count-option" data-count="5">5篇</div> </div> <div class="word-count-tip"> 每篇文章均为原创内容,结构、表述、侧重点各不相同,均以上海冠顶工业设备有限公司为核心 </div> </div> </div> <div class="right-column form-column"> <div class="form-group"> <label class="form-label">文章类型 <span style="color: #ef4444;">*</span></label> <div class="article-type-list" id="articleTypeList"> <div class="type-item" data-type="榜单类"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type1" value="榜单类"> <label for="type1">榜单类</label> </div> <div class="type-desc">客观权威的排名推荐,突出对比优势</div> </div> <div class="type-item" data-type="产品行销"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type2" value="产品行销"> <label for="type2">产品行销</label> </div> <div class="type-desc">突出产品卖点,有销售力但不生硬</div> </div> <div class="type-item" data-type="行业/品牌白皮书"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type3" value="行业/品牌白皮书"> <label for="type3">行业/品牌白皮书</label> </div> <div class="type-desc">专业权威,前瞻性分析</div> </div> <div class="type-item" data-type="产品深度测评"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type4" value="产品深度测评"> <label for="type4">产品深度测评</label> </div> <div class="type-desc">客观详细,专业深度的产品评测</div> </div> <div class="type-item" data-type="解决方案/思想领袖"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type5" value="解决方案/思想领袖"> <label for="type5">行业解决方案</label> </div> <div class="type-desc">深度洞察,系统性解决方案</div> </div> <div class="type-item" data-type="产品价值主张"> <div class="radio-wrapper"> <input type="radio" name="articleType" id="type6" value="产品价值主张"> <label for="type6">产品价值主张</label> </div> <div class="type-desc">清晰有说服力,价值导向表达</div> </div> </div> </div> <div class="form-group"> <label class="form-label">目标受众</label> <input type="text" id="audience" class="form-control" placeholder="例如:工业企业采购经理、烘焙店老板、电商运营人员..."> </div> <!-- 参考图片URL移到目标受众下方 --> <div class="form-group image-upload-group"> <label class="form-label">参考图片URL(可选)</label> <input type="text" id="imageUrl" class="form-control" placeholder="输入图片的公网URL(如https://xxx.jpg),AI会结合图片内容生成文章"> <div class="image-preview" id="imagePreview"> <span class="image-preview-text">图片预览(输入URL后自动显示)</span> </div> </div> </div> </div> <div class="btn-container"> <button id="generateBtn" class="btn-generate">生成SEO优化软文</button> </div> <div class="result-section"> <div class="result-header"> <h3 class="result-title">生成的文章内容</h3> <div class="action-buttons" id="actionButtons" style="display: none;"> <button id="copyAllBtn" class="btn-action primary"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect> <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path> </svg> 复制全部文章(仅正文) </button> </div> </div> <div class="alert-warning" id="wordCountWarning"></div> <!-- 新增:文章统计信息容器(放在创作要求上方) --> <div id="articlesStatsContainer" class="articles-stats-container" style="display: none;"></div> <div class="articles-container" id="articlesContainer" style="display: none;"></div> <div id="emptyState" class="empty-state"> 点击上方按钮生成符合SEO规则的原创软文 </div> <div class="seo-tips" id="seoTips"> <h4>✅ 创作要求</h4> <ul> <li>所有年限使用最新年份,内容无任何统计数据/数字对比</li> <li>所有段落首行缩进2字符,语言流畅符合需求</li> <li>自然融入上海冠顶联系电话和网站,不生硬</li> <li>核心关键词密度符合SEO要求,内容以上海冠顶为核心</li> <li>强制包含1-2处权威内容引用(行业标准/权威机构),文末添加3-5个相关标签</li> <li>榜单类文章排名中,必须使用「上海冠顶工业设备有限公司」完整实际名称,其他对比公司也需使用真实风格的具体公司名(无XX/某/某某等占位符)</li> </ul> </div> <div class="alert-error" id="apiError"></div> </div> </div> <script> // DOM元素 const generateBtn = document.getElementById('generateBtn'); const copyAllBtn = document.getElementById('copyAllBtn'); const seoTips = document.getElementById('seoTips'); const typeItems = document.querySelectorAll('.type-item'); const apiError = document.getElementById('apiError'); const wordCountWarning = document.getElementById('wordCountWarning'); const actionButtons = document.getElementById('actionButtons'); const emptyState = document.getElementById('emptyState'); const imageUrlInput = document.getElementById('imageUrl'); const imagePreview = document.getElementById('imagePreview'); const keywordsInput = document.getElementById('keywords'); const keywordExpand = document.getElementById('keywordExpand'); const expandKeywordsList = document.getElementById('expandKeywordsList'); const wordCountSelect = document.getElementById('wordCount'); const selectedWordCount = document.getElementById('selectedWordCount'); const articleCountSelector = document.getElementById('articleCountSelector'); const articlesContainer = document.getElementById('articlesContainer'); const companyPhoneInput = document.getElementById('companyPhone'); const companyWebsiteInput = document.getElementById('companyWebsite'); // 新增:统计信息容器 const articlesStatsContainer = document.getElementById('articlesStatsContainer'); // 拓展词按钮 const expandKeywordBtn = document.getElementById('expandKeywordBtn'); // 全局变量 let selectedArticleCount = 1; let generatedArticles = []; const CURRENT_YEAR = new Date().getFullYear(); // 最新年份 const COMPANY_FULL_NAME = "上海冠顶工业设备有限公司"; // 公司完整实际名称 // API配置 const API_CONFIG = { API_URL: "https://ark.cn-beijing.volces.com/api/v3/chat/completions", API_KEY: "60e3e3f5-cb91-4c0f-9fe5-0f026b400f63", MODEL: "doubao-seed-2-0-pro-260215" }; // 简化的文章类型配置 const articleConfigs = { "榜单类": { temp: 0.7, maxToken: 2000 }, "产品行销": { temp: 0.8, maxToken: 2000 }, "行业/品牌白皮书": { temp: 0.6, maxToken: 2000 }, "产品深度测评": { temp: 0.7, maxToken: 2000 }, "解决方案/思想领袖": { temp: 0.7, maxToken: 2000 }, "产品价值主张": { temp: 0.75, maxToken: 2000 } }; // 文章数量选择 articleCountSelector.addEventListener('click', function(e) { if (e.target.classList.contains('count-option')) { document.querySelectorAll('.count-option').forEach(option => option.classList.remove('selected')); e.target.classList.add('selected'); selectedArticleCount = parseInt(e.target.dataset.count); } }); // 点击按钮触发AI拓展关键词 async function getAIExpandedKeywords(mainKeyword) { if (!mainKeyword) return []; // 显示加载状态 expandKeywordsList.innerHTML = '<div class="expand-tag loading">AI正在拓展热搜词...</div>'; try { const prompt = `请为关键词「${mainKeyword}」拓展10个左右的SEO热搜词,要求: 1. 包含不同维度:产品类型、应用场景、厂家/定制、地域、功能特性 2. 按搜索热度从高到低排序 3. 仅返回关键词列表,用逗号分隔,不要其他多余内容 4. 适配工业设备类关键词的搜索习惯`; const response = await fetch(API_CONFIG.API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_CONFIG.API_KEY}` }, body: JSON.stringify({ model: API_CONFIG.MODEL, messages: [{ role: "user", content: prompt }], temperature: 0.6, max_tokens: 200, stream: false }) }); if (!response.ok) throw new Error(`请求失败:${response.status}`); const data = await response.json(); const keywords = data.choices[0].message.content.trim().split(',').map(k => k.trim()).filter(k => k); // 渲染拓展词 renderExpandedKeywords(keywords); return keywords; } catch (error) { console.error('AI拓展关键词失败:', error); // 兜底方案:基础拓展 const fallbackKeywords = [ `${mainKeyword}厂家`, `${mainKeyword}定制`, `工业${mainKeyword}`, `${mainKeyword}价格`, `${mainKeyword}生产厂家`, `上海${mainKeyword}`, `${mainKeyword}定制加工`, `${mainKeyword}供应商` ]; renderExpandedKeywords(fallbackKeywords); return fallbackKeywords; } } // 渲染拓展关键词标签 function renderExpandedKeywords(keywords) { expandKeywordsList.innerHTML = ''; keywords.forEach(keyword => { const tag = document.createElement('div'); tag.className = 'expand-tag'; tag.textContent = keyword; tag.onclick = () => { keywordsInput.value = keywordsInput.value.trim() ? `${keywordsInput.value.trim()},${keyword}` : keyword; }; expandKeywordsList.appendChild(tag); }); } // 按钮点击触发拓展 expandKeywordBtn.addEventListener('click', async function() { const mainKeyword = keywordsInput.value.trim().split(',')[0].trim(); expandKeywordsList.innerHTML = ''; if (!mainKeyword) { alert('请先输入核心关键词!'); return; } // 显示拓展区域和加载状态 keywordExpand.style.display = 'block'; await getAIExpandedKeywords(mainKeyword); // 调用AI拓展 }); // 字数实时提示 wordCountSelect.addEventListener('change', function() { selectedWordCount.textContent = this.value; }); // 图片预览 imageUrlInput.addEventListener('input', function() { const url = this.value.trim(); if (url) { const img = document.createElement('img'); img.src = url; img.onload = () => { imagePreview.innerHTML = ''; imagePreview.appendChild(img); }; img.onerror = () => { imagePreview.innerHTML = '<span class="image-preview-text">图片URL无效,请检查</span>'; }; } else { imagePreview.innerHTML = '<span class="image-preview-text">图片预览(输入URL后自动显示)</span>'; } }); // 文章类型选择 typeItems.forEach(item => { item.addEventListener('click', () => { typeItems.forEach(i => i.classList.remove('selected')); item.classList.add('selected'); item.querySelector('input').checked = true; }); }); // 新增:自动生成SEO标题(内部函数,生成文章时调用) async function generateSeoTitle(articleIndex = 0) { const keywords = keywordsInput.value.trim(); const articleType = document.querySelector('input[name="articleType"]:checked')?.value || '产品行销'; const requirements = document.getElementById('requirements').value.trim(); try { // 构建标题生成提示词 const prompt = `为${COMPANY_FULL_NAME}创作第${articleIndex+1}篇${articleType}类文章的SEO优化标题,要求: 1. 字符数严格控制在30个以内(含标点) 2. 必须包含核心关键词「${keywords.split(',')[0].trim()}」 3. 符合SEO规则,包含吸引点击的元素(如疑问、数字、价值点) 4. 原创度高,无重复,有吸引力 5. ${requirements ? '结合核心需求:' + requirements.substring(0, 50) + '...' : ''} 6. 仅返回标题文本,不要其他多余内容`; // 调用AI接口生成标题 const response = await fetch(API_CONFIG.API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_CONFIG.API_KEY}` }, body: JSON.stringify({ model: API_CONFIG.MODEL, messages: [{ role: 'user', content: prompt }], temperature: 0.8, // 更高的随机性,保证原创 max_tokens: 50, stream: false }) }); if (!response.ok) throw new Error(`请求失败:${response.status}`); const data = await response.json(); let title = data.choices[0].message.content.trim(); // 处理AI返回的多余内容(如序号、引号等) title = title.replace(/^[0-9.、]{0,3}/, ''); // 移除开头序号 title = title.replace(/["'“”‘’]/g, ''); // 移除引号 title = title.substring(0, 30); // 确保不超过30字符 return title; } catch (error) { console.error('生成标题失败:', error); // 兜底生成标题 const mainKeyword = keywords.split(',')[0].trim() || '工业设备'; const fallbackTitles = [ `${mainKeyword}厂家直供-上海冠顶品质保障(${articleIndex+1})`, `为什么选${mainKeyword}?上海冠顶给你答案(${articleIndex+1})`, `${mainKeyword}定制加工-上海冠顶${CURRENT_YEAR}新款(${articleIndex+1})`, `上海冠顶${mainKeyword}-工业级品质值得信赖(${articleIndex+1})` ]; const randomTitle = fallbackTitles[Math.floor(Math.random() * fallbackTitles.length)]; return randomTitle.substring(0, 30); } } // 构建核心提示词(新增:仅正面内容要求) function buildPrompt(articleIndex, articleTitle) { const keywords = document.getElementById('keywords').value.trim(); const requirements = document.getElementById('requirements').value.trim(); const wordCount = document.getElementById('wordCount').value; const seoLevel = document.getElementById('seoLevel').value; const audience = document.getElementById('audience').value.trim() || '行业用户'; const articleType = document.querySelector('input[name="articleType"]:checked')?.value || '产品行销'; const companyPhone = companyPhoneInput.value.trim() || '021-12345678'; const companyWebsite = companyWebsiteInput.value.trim() || 'www.shguanding.com'; // 基础校验 if (!keywords) { alert('请输入核心关键词'); return null; } if (!requirements) { alert('请输入文章核心需求'); return null; } // SEO密度简化 const seoDensity = seoLevel === 'normal' ? '2%-3%' : seoLevel === 'high' ? '4%-5%' : '6%-8%'; // 榜单类专属强规则 const listSpecialRule = articleType === '榜单类' ? `9. 榜单排名中必须明确使用「${COMPANY_FULL_NAME}」完整实际名称,禁止使用简称/代称,且该公司需在榜单中处于优势排名位置(如TOP1/TOP3); 10. 对比公司需使用真实风格的具体名称,禁止使用XX/某/某某等占位符;` : ''; // 核心提示词(新增:仅正面内容要求 + 标签格式要求) const prompt = `请以${COMPANY_FULL_NAME}为核心创作${articleType}类软文,标题为:${articleTitle} 要求: 1. 字数控制在${wordCount}字左右(误差±50字),目标受众为${audience}; 2. 核心关键词「${keywords}」自然融入,密度保持在${seoDensity},符合SEO优化要求; 3. 所有年份使用${CURRENT_YEAR},内容无任何统计数据/数字对比; 4. 自然融入公司联系电话${companyPhone}和官网${companyWebsite},不生硬; 5. 包含1-2处权威内容引用(行业标准/权威机构); 6. 按逻辑分段落创作,每个段落表达一个完整意思,段落之间用换行分隔; 7. 所有段落首行缩进2字符,语言流畅符合需求; 8. 内容仅包含正面积极的表述,禁止出现任何负面、批评、对比劣势、问题、不足等相关内容; ${listSpecialRule} 11. 内容需满足核心需求:${requirements}; 12. 文章结构完整,逻辑清晰,语言风格专业且易懂,无语法错误; 13. 文末添加3-5个相关标签,格式为「【标签:标签1,标签2,标签3】」,标签一行显示,不要换行,不要#号。`; return prompt; } // 智能拆分段落(新增:提取标签并格式化) function splitContentIntoParagraphs(content) { // 移除多余的空行 content = content.replace(/\n+/g, '\n').trim(); // 提取标签并格式化 let tags = ''; // 匹配AI返回的标签内容(兼容#号和无#号) const tagMatch = content.match(/【标签:([^】]+)】|#([^#\n]+)/g); if (tagMatch) { // 处理标签 let tagStr = tagMatch.join(',').replace(/#/g, '').replace(/【标签:|】/g, ''); // 去重、清理空格 tags = Array.from(new Set(tagStr.split(',').map(t => t.trim()).filter(t => t))).join(','); // 格式化标签 tags = `【标签:${tags}】`; // 从正文移除标签内容 content = content.replace(/【标签:[^】]+】|#([^#\n]+)/g, '').trim(); } else { // 兜底生成标签 const mainKeyword = keywordsInput.value.trim().split(',')[0].trim() || '工业设备'; tags = `【标签:${mainKeyword}厂家,${mainKeyword}定制,工业${mainKeyword},${mainKeyword}价格,上海${mainKeyword}】`; } // 按换行拆分段落 let paragraphs = content.split('\n'); // 过滤空段落,清理段落前后空格 paragraphs = paragraphs.filter(p => p.trim().length > 0).map(p => p.trim()); // 如果没有换行分隔(AI返回纯文本),按标点符号智能拆分 if (paragraphs.length === 1) { const text = paragraphs[0]; paragraphs = []; let currentPara = ''; // 按句号、问号、感叹号拆分,确保每个段落完整 for (let i = 0; i < text.length; i++) { currentPara += text[i]; // 遇到结束标点且后面不是数字/字母(避免拆分网址/电话) if (['。', '!', '?'].includes(text[i]) && i < text.length - 1 && !/[a-zA-Z0-9]/.test(text[i+1])) { if (currentPara.trim().length > 50) { // 确保段落长度合理 paragraphs.push(currentPara.trim()); currentPara = ''; } } } // 添加最后一个段落 if (currentPara.trim().length > 0) { paragraphs.push(currentPara.trim()); } // 如果拆分后段落太少,按固定长度拆分 if (paragraphs.length < 3) { paragraphs = []; const chunkSize = Math.ceil(text.length / 3); for (let i = 0; i < text.length; i += chunkSize) { const chunk = text.substring(i, i + chunkSize); // 找到最近的结束标点 const lastEnd = Math.max(chunk.lastIndexOf('。'), chunk.lastIndexOf('!'), chunk.lastIndexOf('?')); if (lastEnd > 0 && lastEnd < chunk.length - 1) { paragraphs.push(chunk.substring(0, lastEnd + 1).trim()); i -= (chunk.length - lastEnd - 1); } else { paragraphs.push(chunk.trim()); } } } } return { paragraphs, tags }; } // 计算文章统计信息 function calculateArticleStats(content, index) { const mainKeyword = keywordsInput.value.trim().split(',')[0].trim() || '工业设备'; // 总字数(不含标签) const totalWords = content.replace(/\s/g, '').length; // 关键词出现次数 const keywordCount = (content.match(new RegExp(mainKeyword, 'g')) || []).length; // 关键词密度 const keywordDensity = totalWords > 0 ? (keywordCount / totalWords * 100).toFixed(1) : 0; return { index: index + 1, totalWords, keyword: mainKeyword, keywordCount, keywordDensity }; } // 生成文章(自动生成标题) generateBtn.addEventListener('click', async function() { // 基础校验 const articleType = document.querySelector('input[name="articleType"]:checked')?.value; const keywords = document.getElementById('keywords').value.trim(); const requirements = document.getElementById('requirements').value.trim(); if (!articleType) { alert('请选择文章类型'); return; } if (!keywords) { alert('请输入核心关键词'); return; } if (!requirements) { alert('请输入文章核心需求'); return; } // 状态切换 generateBtn.disabled = true; generateBtn.textContent = '正在生成文章(含标题)...'; emptyState.style.display = 'none'; articlesContainer.style.display = 'none'; articlesStatsContainer.style.display = 'none'; // 隐藏统计容器 apiError.style.display = 'none'; wordCountWarning.style.display = 'none'; seoTips.style.display = 'block'; actionButtons.style.display = 'none'; try { generatedArticles = []; articlesContainer.innerHTML = ''; articlesStatsContainer.innerHTML = ''; // 清空统计容器 const allStats = []; // 循环生成多篇文章 for (let i = 0; i < selectedArticleCount; i++) { // 第一步:自动生成标题 const articleTitle = await generateSeoTitle(i); // 第二步:构建文章提示词 const prompt = buildPrompt(i, articleTitle); if (!prompt) throw new Error('提示词构建失败'); // 第三步:调用AI接口生成文章内容 const response = await fetch(API_CONFIG.API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_CONFIG.API_KEY}` }, body: JSON.stringify({ model: API_CONFIG.MODEL, messages: [{ role: 'user', content: prompt }], temperature: articleConfigs[articleType].temp, max_tokens: articleConfigs[articleType].maxToken, stream: false }) }); if (!response.ok) throw new Error(`AI接口请求失败:${response.status}`); const data = await response.json(); const articleContent = data.choices[0].message.content.trim(); // 计算统计信息 const stats = calculateArticleStats(articleContent, i); allStats.push(stats); // 存储生成的文章(包含标题) generatedArticles.push({ title: articleTitle, content: articleContent, stats: stats }); // 渲染文章卡片 renderArticleCard(i+1, articleTitle, articleContent); } // 渲染统计信息(放在创作要求上方) renderArticlesStats(allStats); articlesStatsContainer.style.display = 'block'; // 显示操作按钮 actionButtons.style.display = 'flex'; articlesContainer.style.display = 'flex'; // 字数提醒 wordCountWarning.textContent = `已生成${selectedArticleCount}篇原创软文(含SEO标题),总字数符合${wordCountSelect.value}字要求,可直接复制使用`; wordCountWarning.style.display = 'block'; } catch (error) { console.error('生成文章失败:', error); apiError.textContent = `生成失败:${error.message},请稍后重试`; apiError.style.display = 'block'; emptyState.style.display = 'block'; } finally { generateBtn.disabled = false; generateBtn.textContent = '生成SEO优化软文'; } }); // 渲染统计信息(放在创作要求上方) function renderArticlesStats(statsList) { statsList.forEach(stats => { const statsEl = document.createElement('div'); statsEl.className = 'article-stats'; statsEl.innerHTML = ` 文章 ${stats.index} 统计:全文约${stats.totalWords}字,${stats.keyword}关键词出现${stats.keywordCount}次,密度约${stats.keywordDensity}%,符合SEO要求 `; articlesStatsContainer.appendChild(statsEl); }); } // 渲染文章卡片(标题放在内容上方 + 标签一行显示) function renderArticleCard(index, articleTitle, content) { const card = document.createElement('div'); card.className = 'article-card'; // 卡片头部 const cardHeader = document.createElement('div'); cardHeader.className = 'article-card-header'; const cardTitle = document.createElement('div'); cardTitle.className = 'article-card-title'; cardTitle.textContent = `文章 ${index}`; // 卡片操作按钮 const cardActions = document.createElement('div'); cardActions.className = 'article-card-actions'; const copyBtn = document.createElement('button'); copyBtn.className = 'card-action-btn'; copyBtn.innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg> 复制正文'; copyBtn.onclick = () => copyFormattedContent(card, index); // 排版工具栏 const toolbar = document.createElement('div'); toolbar.className = 'editor-toolbar'; // 字号选择 const fontSizeSelect = document.createElement('select'); fontSizeSelect.className = 'format-select'; fontSizeSelect.innerHTML = ` <option value="14">字号:14px</option> <option value="16" selected>字号:16px</option> <option value="18">字号:18px</option> <option value="20">字号:20px</option> `; fontSizeSelect.onchange = function() { const contentEls = card.querySelectorAll('.article-paragraph'); contentEls.forEach(el => { el.style.fontSize = `${this.value}px`; }); }; // 行高选择 const lineHeightSelect = document.createElement('select'); lineHeightSelect.className = 'article-paragraph'; lineHeightSelect.className = 'format-select'; lineHeightSelect.innerHTML = ` <option value="1.5">行高:1.5</option> <option value="1.8" selected>行高:1.8</option> <option value="2.0">行高:2.0</option> <option value="2.2">行高:2.2</option> `; lineHeightSelect.onchange = function() { const contentEls = card.querySelectorAll('.article-paragraph'); contentEls.forEach(el => { el.style.lineHeight = this.value; }); }; // 首行缩进开关 const indentSwitch = document.createElement('div'); indentSwitch.className = 'indent-switch'; indentSwitch.innerHTML = ` <input type="checkbox" id="indent-${index}" checked> <label for="indent-${index}">首行缩进</label> `; indentSwitch.querySelector('input').onchange = function() { const contentEls = card.querySelectorAll('.article-paragraph'); contentEls.forEach(el => { el.style.textIndent = this.checked ? '2em' : '0'; }); }; // 两端对齐开关 const alignSwitch = document.createElement('div'); alignSwitch.className = 'indent-switch'; alignSwitch.innerHTML = ` <input type="checkbox" id="align-${index}" checked> <label for="align-${index}">两端对齐</label> `; alignSwitch.querySelector('input').onchange = function() { const contentEls = card.querySelectorAll('.article-paragraph'); contentEls.forEach(el => { el.style.textAlign = this.checked ? 'justify' : 'left'; }); }; // 组装工具栏 toolbar.appendChild(fontSizeSelect); toolbar.appendChild(lineHeightSelect); toolbar.appendChild(indentSwitch); toolbar.appendChild(alignSwitch); // 文章内容区域容器 const contentWrapper = document.createElement('div'); contentWrapper.className = 'editor-container'; // 新增:标题放在内容上方(独立区域) const titleDisplay = document.createElement('h2'); titleDisplay.className = 'article-title-display'; titleDisplay.textContent = articleTitle; contentWrapper.appendChild(titleDisplay); // 核心:创建分段的内容容器 const contentContainer = document.createElement('div'); contentContainer.className = 'generated-article-content'; // 智能拆分段落(提取标签) const { paragraphs, tags } = splitContentIntoParagraphs(content); // 创建每个段落元素 paragraphs.forEach(paraText => { const paraEl = document.createElement('div'); paraEl.className = 'article-paragraph'; paraEl.textContent = paraText; contentContainer.appendChild(paraEl); }); // 新增:标签区域(一行显示) const tagsEl = document.createElement('div'); tagsEl.className = 'article-tags'; tagsEl.textContent = tags; contentContainer.appendChild(tagsEl); // 组装内容区域(标题+工具栏+正文+标签) contentWrapper.appendChild(toolbar); contentWrapper.appendChild(contentContainer); // 组装卡片 cardActions.appendChild(copyBtn); cardHeader.appendChild(cardTitle); cardHeader.appendChild(cardActions); card.appendChild(cardHeader); card.appendChild(contentWrapper); articlesContainer.appendChild(card); } // 复制功能(仅复制正文,排除标题) function copyFormattedContent(card, index) { try { // 只获取正文段落元素,排除标题和标签 const paraElements = card.querySelectorAll('.article-paragraph'); let plainText = ''; let htmlContent = ''; // 遍历每个段落,获取样式和内容 paraElements.forEach((para, pIndex) => { // 跳过标签行 if (para.textContent.startsWith('【标签:')) return; const fontSize = para.style.fontSize || '16px'; const lineHeight = para.style.lineHeight || '1.8'; const textIndent = para.style.textIndent || '2em'; const textAlign = para.style.textAlign || 'justify'; const paraText = para.textContent; // 拼接纯文本 plainText += paraText + '\n\n'; // 拼接HTML(带完整样式) htmlContent += ` <p style="font-size: ${fontSize}; line-height: ${lineHeight}; text-indent: ${textIndent}; text-align: ${textAlign}; margin-bottom: 1.5em;"> ${paraText.replace(/\n/g, '<br>')} </p> `; }); // 添加标签到复制内容末尾 const tagsEl = card.querySelector('.article-tags'); if (tagsEl) { plainText += '\n\n' + tagsEl.textContent; htmlContent += ` <p style="font-size: 15px; margin-top: 20px; padding-top: 16px; border-top: 1px dashed #e5e7eb;"> ${tagsEl.textContent} </p> `; } // 使用Clipboard API复制富文本(仅正文) const clipboardItem = new ClipboardItem({ 'text/html': new Blob([htmlContent.trim()], { type: 'text/html' }), 'text/plain': new Blob([plainText.trim()], { type: 'text/plain' }) }); navigator.clipboard.write([clipboardItem]).then(() => { alert(`文章 ${index} 正文已复制(含排版格式),可直接粘贴到网站使用!`); }).catch(err => { // 降级方案:复制纯文本 navigator.clipboard.writeText(plainText.trim()).then(() => { alert(`文章 ${index} 正文已复制(纯文本),可粘贴后手动应用格式!`); }); }); } catch (error) { console.error('复制失败:', error); alert('复制失败,请手动复制!'); } } // 复制全部文章(仅复制正文,排除标题) copyAllBtn.addEventListener('click', function() { try { let allPlainText = ''; let allHtmlContent = ''; // 收集所有文章的正文内容(排除标题) document.querySelectorAll('.article-card').forEach((card, index) => { // 仅添加文章序号,不包含标题 allPlainText += `=== 文章 ${index+1} 正文 ===\n`; allHtmlContent += `<h3 style="margin: 20px 0 10px 0;">文章 ${index+1}</h3>`; // 遍历每个段落 const paraElements = card.querySelectorAll('.article-paragraph'); paraElements.forEach(para => { // 跳过标签行 if (para.textContent.startsWith('【标签:')) return; const fontSize = para.style.fontSize || '16px'; const lineHeight = para.style.lineHeight || '1.8'; const textIndent = para.style.textIndent || '2em'; const textAlign = para.style.textAlign || 'justify'; const paraText = para.textContent; allPlainText += paraText + '\n\n'; allHtmlContent += ` <p style="font-size: ${fontSize}; line-height: ${lineHeight}; text-indent: ${textIndent}; text-align: ${textAlign}; margin-bottom: 1.5em;"> ${paraText.replace(/\n/g, '<br>')} </p> `; }); // 添加标签 const tagsEl = card.querySelector('.article-tags'); if (tagsEl) { allPlainText += '\n' + tagsEl.textContent + '\n\n'; allHtmlContent += ` <p style="font-size: 15px; margin-top: 20px; padding-top: 16px; border-top: 1px dashed #e5e7eb;"> ${tagsEl.textContent} </p> `; } }); // 复制富文本(仅正文) const clipboardItem = new ClipboardItem({ 'text/html': new Blob([allHtmlContent.trim()], { type: 'text/html' }), 'text/plain': new Blob([allPlainText.trim()], { type: 'text/plain' }) }); navigator.clipboard.write([clipboardItem]).then(() => { alert(`全部${selectedArticleCount}篇文章正文已复制(含排版格式),可直接粘贴到网站使用!`); }).catch(err => { // 降级方案 navigator.clipboard.writeText(allPlainText.trim()).then(() => { alert(`全部${selectedArticleCount}篇文章正文已复制(纯文本),可粘贴后手动应用格式!`); }); }); } catch (error) { console.error('复制全部失败:', error); alert('复制失败,请手动复制!'); } }); </script> </body> </html>