# Tab 1:关键词蒸馏 - 优化分析报告 > **分析维度**:逻辑 / UI 布局 / 用户体验 > **分析日期**:2026-01-28 > **分析范围**:Tab 1 完整功能模块 --- ## 📋 目录 1. [全局问题:序号使用规范](#全局问题序号使用规范) 2. [Tab 1 重排后的结构草图](#tab-1-重排后的结构草图) 3. [问题清单(含严重级别)](#问题清单含严重级别) 4. [改动方案(含具体交互/文案/状态设计)](#改动方案含具体交互文案状态设计) 5. [测试用例清单](#测试用例清单) 6. [最小改动 MVP 优化清单](#最小改动-mvp-优化清单) --- ## 全局问题:序号使用规范 ### 判断标准:何时保留、何时删除序号 #### ✅ **保留序号的情况** 1. **流程型 Tab(有明确顺序依赖)** - 示例:Tab 1 → Tab 2 → Tab 3(关键词 → 创作 → 优化) - 理由:序号帮助用户理解工作流顺序 2. **教程/引导型内容** - 示例:"步骤 1:配置 → 步骤 2:生成 → 步骤 3:验证" - 理由:序号是内容的一部分,不可省略 3. **Tab 数量 > 5 个** - 理由:序号帮助快速定位("第 7 个 Tab") #### ❌ **删除序号的情况** 1. **功能型 Tab(无顺序依赖)** - 当前情况:Tab 1-10 虽然有一定流程,但用户可能跳转使用 - 理由:序号造成视觉噪音,Tab 名称本身已足够清晰 2. **Tab 数量 ≤ 5 个** - 理由:无需序号即可快速识别 3. **Tab 内模块标题** - 当前问题:Tab 1 内无序号,但其他 Tab 可能有 - 理由:通过视觉层级(h2/h3/emoji)已能区分 ### 推荐方案:默认去掉 Tab 名称中的序号 **理由**: - Tab 名称已足够描述性("关键词蒸馏" vs "1 关键词蒸馏") - 减少视觉噪音,提升现代感 - 用户通过 Tab 位置和名称即可识别,无需序号 **替代方案**: - 使用 **emoji 图标** 增强识别度(已部分实现) - 使用 **视觉分组**(通过间距、分隔线) - 使用 **颜色/高亮** 区分重要 Tab ### 如何通过标题层级/分组/间距替代"序号引导" #### 方案 A:视觉层级(推荐) ```python # Tab 名称(无序号) st.tabs([ "🎯 关键词蒸馏", # 核心功能,emoji 突出 "✍️ 自动创作", # 核心功能 "🔧 文章优化", # 核心功能 "✅ 多模型验证", # 验证功能 "📊 AI 数据报表", # 分析功能 # ... ]) ``` #### 方案 B:分组 + 分隔符 ```python # 主要流程组 st.tabs([ "关键词蒸馏", "自动创作", "文章优化", "多模型验证", "---", # 分隔符(视觉分组) "历史记录", "AI 数据报表", # ... ]) ``` #### 方案 C:保留序号但优化样式 ```python # 序号作为副标题(更轻量) st.tabs([ "关键词蒸馏 · 1", "自动创作 · 2", # ... ]) ``` **最终推荐**:**方案 A**(去掉序号,保留 emoji,通过视觉层级区分) --- ## Tab 1 重排后的结构草图 ### 当前结构问题 1. **信息分散**:功能模块之间缺乏明确分组 2. **条件显示混乱**:部分功能仅在有关键词时显示,但布局不清晰 3. **重复输入**:品牌/优势信息在侧边栏,但某些功能可能需要重复输入 4. **视觉层级不清晰**:所有模块使用相同的 `st.markdown("#### ...")` 层级 ### 重排后的布局结构 ``` ┌─────────────────────────────────────────────────────────┐ │ Tab 1: 关键词蒸馏 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 【区域 1:模式选择】(始终显示,顶部固定) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 生成模式: [AI生成] [托词工具] [混合模式] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 【区域 2:配置区】(条件显示:托词工具/混合模式) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 📐 组合模式选择 │ │ │ │ - 多选组合模式 │ │ │ │ - [展开:组合模式说明] │ │ │ └────────────────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 📚 词库管理 │ │ │ │ [编辑词库 Tab] [导入/导出 Tab] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 【区域 3:生成控制】(始终显示) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 生成数量: [滑块 10-100] │ │ │ │ [生成关键词] [清空本模块结果] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 【区域 4:扩展功能】(条件显示:有关键词时) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 🌐 语义足迹扩展 │ │ │ │ - 扩展数量: [滑块] │ │ │ │ - [开始语义扩展] [合并策略: 追加/替换/交替] │ │ │ │ - [统计信息] [扩展详情] [覆盖面分析] │ │ │ └────────────────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 🎯 话题集群生成 │ │ │ │ - 话题集群数量: [滑块] │ │ │ │ - [生成话题集群] │ │ │ │ - [统计] [集群列表] [关联关系] [网络图] [规划建议] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 【区域 5:关键词列表】(条件显示:有关键词时) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 📋 关键词列表 │ │ │ │ [DataFrame 表格] │ │ │ │ [下载关键词CSV] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 【区域 6:智能挖掘】(条件显示:有关键词时,折叠默认) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 🔍 智能关键词挖掘与趋势分析 │ │ │ │ [🌐 行业热点挖掘] [📊 竞争度分析] [📈 趋势预测] │ │ │ │ [💎 价值矩阵] │ │ │ └────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ ``` ### 组件顺序与交互流 #### 交互流程 1:AI 生成模式(最简单) ``` 1. 选择"AI生成"模式 2. 设置生成数量(默认 10) 3. 点击"生成关键词" 4. 查看关键词列表 5. (可选)使用扩展功能 ``` #### 交互流程 2:托词工具模式 ``` 1. 选择"托词工具"模式 2. 配置组合模式(多选) 3. 管理词库(编辑/导入) 4. 设置生成数量 5. 点击"生成关键词" 6. 查看关键词列表 ``` #### 交互流程 3:混合模式 ``` 1. 选择"混合模式" 2. 配置组合模式 3. 管理词库 4. 设置生成数量 5. 点击"生成关键词"(先托词生成,再 LLM 润色) 6. 查看关键词列表 7. (可选)使用扩展功能 ``` ### 紧凑布局规则 #### 间距规则 ```python # 区域间距 区域之间:st.markdown("---") # 1.5rem 间距(CSS 已定义) # 容器内间距 with st.container(border=True): # 容器内 padding: 1.5rem(CSS 已定义) # 容器内元素间距:0.75rem st.markdown("#### 标题") # margin-top: 0, margin-bottom: 0.75rem # 控件间距:0.5rem ``` #### 分组规则 ```python # 主要功能区域:使用 container(border=True) # 次要信息:使用 expander(默认折叠) # 统计信息:使用 columns + metric(紧凑显示) ``` #### 折叠规则 ```python # 默认展开 - 模式选择 - 生成控制 - 关键词列表(如果有关键词) # 默认折叠 - 组合模式说明(expander) - 扩展详情(expander) - 覆盖面分析(expander) - 智能挖掘(整个区域,如果功能复杂) ``` --- ## 问题清单(含严重级别) ### 🔴 P0 - 必改(逻辑漏洞/严重体验问题) #### 1. 空值检查不完整 - **位置**:第 1064-1192 行(生成关键词逻辑) - **问题**: - `generation_mode == "AI生成"` 时,未检查 `brand` 和 `advantages` 是否为空 - `generation_mode == "托词工具"` 时,检查了空词库,但错误提示在生成后,应该在生成前阻止 - **影响**:可能导致 API 调用失败或生成无效结果 - **修复**:在 `run_kw` 点击时,先验证所有必需参数 #### 2. 状态同步问题 - **位置**:第 1194-1867 行(扩展功能区域) - **问题**: - `st.session_state.expanded_keywords` 在扩展后未清空,可能导致重复合并 - `st.session_state.topic_clusters` 在生成新关键词后未清空,可能显示旧数据 - **影响**:数据混乱,用户困惑 - **修复**:在生成新关键词时,清空所有扩展/集群相关状态 #### 3. 并发点击防护缺失 - **位置**:所有按钮点击处理 - **问题**: - 用户快速点击"生成关键词"可能触发多次 API 调用 - 无 loading 状态保护 - **影响**:重复请求、资源浪费、可能的数据覆盖 - **修复**:使用 `st.session_state` 标记处理中状态,禁用按钮 #### 4. 错误提示不友好 - **位置**:第 1180-1192 行(生成失败处理) - **问题**: - 错误信息过于技术化("生成失败,可能的原因:...") - 未提供具体解决建议 - **影响**:用户不知道如何修复问题 - **修复**:提供分场景的错误提示和操作建议 #### 5. 缓存问题 - **位置**:第 1107-1120 行(托词工具生成) - **问题**: - `wordbanks` 每次从 `st.session_state` 读取,但更新词库后可能未同步 - `selected_patterns` 可能过期 - **影响**:使用旧配置生成,结果不符合预期 - **修复**:在生成前重新加载最新配置 ### 🟡 P1 - 建议(体验优化) #### 6. 布局分散 - **位置**:整个 Tab 1 - **问题**: - 功能模块之间缺乏视觉分组 - 条件显示的功能(扩展/集群/挖掘)与主要功能混在一起 - **影响**:信息过载,用户难以聚焦 - **修复**:使用容器分组,明确区域划分 #### 7. 重复输入 - **位置**:第 1604 行(行业热点挖掘) - **问题**: - `industry` 输入框默认值 "外贸ERP",但用户可能已在侧边栏配置了品牌信息 - 未复用侧边栏的 `brand` 信息 - **影响**:用户需要重复输入 - **修复**:默认使用 `brand`,允许覆盖 #### 8. 加载态不明确 - **位置**:所有异步操作 - **问题**: - `st.spinner` 文本不够具体("AI生成中..." vs "正在生成 20 个关键词...") - 无进度提示(对于大量关键词生成) - **影响**:用户不知道需要等待多久 - **修复**:提供更详细的加载信息和进度估算 #### 9. 默认值不合理 - **位置**:第 1042 行(生成数量滑块) - **问题**: - 默认值使用 `st.session_state.kw_last_num`,但首次使用时可能未初始化 - 范围 10-100,但用户可能需要更少或更多 - **影响**:首次使用体验不佳 - **修复**:确保默认值始终有效,考虑扩大范围或添加手动输入 #### 10. 结果展示不清晰 - **位置**:第 1566 行(关键词列表) - **问题**: - DataFrame 显示所有关键词,但列表可能很长(100+) - 未区分原始关键词和扩展关键词(虽然有 caption,但不够明显) - **影响**:难以快速查看和筛选 - **修复**:添加分页、搜索、筛选功能 ### 🟢 P2 - 可做(锦上添花) #### 11. 撤销功能缺失 - **位置**:第 1060 行(清空按钮) - **问题**: - "清空本模块结果" 不可撤销 - 用户误操作后无法恢复 - **影响**:用户需要重新生成 - **修复**:添加撤销功能或确认对话框 #### 12. 批量操作缺失 - **位置**:关键词列表 - **问题**: - 无法批量删除/导出/标记关键词 - 智能挖掘结果需要逐个添加 - **影响**:效率低下 - **修复**:添加多选和批量操作 #### 13. 历史记录集成 - **位置**:整个 Tab 1 - **问题**: - 生成的关键词未与 Tab 5(历史记录)深度集成 - 无法快速查看/恢复历史关键词 - **影响**:无法复用历史数据 - **修复**:在 Tab 1 添加"从历史记录加载"功能 #### 14. 导出格式单一 - **位置**:第 1574 行(下载 CSV) - **问题**: - 仅支持 CSV 格式 - 未支持 JSON、TXT、Excel 等格式 - **影响**:用户需要手动转换格式 - **修复**:添加多格式导出选项 #### 15. 快捷键支持 - **位置**:整个 Tab 1 - **问题**: - 无键盘快捷键(如 Ctrl+Enter 生成) - 无快速导航 - **影响**:效率较低 - **修复**:添加常用快捷键(Streamlit 限制,可能需 JS 扩展) --- ## 改动方案(含具体交互/文案/状态设计) ### 改动 1:去掉 Tab 名称中的序号 **位置**:第 913 行 **改动前**: ```python tab1, tab2, tab3, ... = st.tabs([ "1 关键词蒸馏", "2 自动创作", ... ]) ``` **改动后**: ```python tab1, tab2, tab3, ... = st.tabs([ "🎯 关键词蒸馏", "✍️ 自动创作", "🔧 文章优化", "✅ 多模型验证", "📚 历史记录", "📊 AI 数据报表", "⚙️ 工作流自动化", "📦 GEO 资源库", "🔄 平台同步", "🛠️ 配置优化助手" ]) ``` **理由**:去掉序号,保留 emoji,提升现代感和识别度 --- ### 改动 2:优化布局结构(区域分组) **位置**:第 918-1868 行(整个 Tab 1) **改动前**:功能模块平铺,缺乏分组 **改动后**: ```python with tab1: # ========== 区域 1:模式选择 ========== st.markdown("### 🎯 生成模式") generation_mode = st.radio( "选择生成模式", ["AI生成", "托词工具", "混合模式"], index=["AI生成", "托词工具", "混合模式"].index(st.session_state.kw_generation_mode), horizontal=True, key="kw_mode_radio" ) st.session_state.kw_generation_mode = generation_mode st.markdown("---") # ========== 区域 2:配置区(条件显示) ========== if generation_mode in ["托词工具", "混合模式"]: # 组合模式选择 with st.container(border=True): st.markdown("#### 📐 组合模式选择") # ... 现有代码 ... # 词库管理 with st.container(border=True): st.markdown("#### 📚 词库管理") # ... 现有代码 ... st.markdown("---") # ========== 区域 3:生成控制 ========== with st.container(border=True): st.markdown("#### ⚙️ 生成控制") c1, c2, c3 = st.columns([2, 1, 1]) with c1: st.session_state.kw_last_num = st.slider( "生成数量", 10, 100, st.session_state.kw_last_num, key="kw_num" ) with c2: run_kw_disabled = ( (generation_mode != "托词工具" and (not st.session_state.cfg_valid or gen_llm is None)) or (generation_mode in ["托词工具", "混合模式"] and not st.session_state.get("selected_patterns")) ) run_kw = st.button( "🚀 生成关键词", type="primary", use_container_width=True, disabled=run_kw_disabled, key="kw_run", ) with c3: if st.button("🗑️ 清空结果", use_container_width=True, key="kw_clear"): # 清空所有相关状态 st.session_state.keywords = [] st.session_state.expanded_keywords = [] st.session_state.topic_clusters = [] st.session_state.mined_keywords = [] st.toast("已清空所有关键词和相关数据") st.rerun() # 生成逻辑(改进错误处理和状态管理) if run_kw: # 参数验证 if generation_mode == "AI生成": if not brand or not advantages: st.error("❌ 请先在侧边栏配置品牌名称和核心优势") st.stop() # 防止并发点击 if st.session_state.get("kw_generating", False): st.warning("⏳ 正在生成中,请勿重复点击") st.stop() st.session_state.kw_generating = True # ... 生成逻辑(保持现有代码) ... st.session_state.kw_generating = False # ========== 区域 4:扩展功能(条件显示) ========== if st.session_state.keywords: st.markdown("---") # 语义足迹扩展 with st.container(border=True): st.markdown("#### 🌐 语义足迹扩展") # ... 现有代码(改进状态管理) ... # 话题集群生成 with st.container(border=True): st.markdown("#### 🎯 话题集群生成") # ... 现有代码(改进状态管理) ... # ========== 区域 5:关键词列表(条件显示) ========== if st.session_state.keywords: st.markdown("---") st.markdown("#### 📋 关键词列表") # 添加搜索和筛选 search_col, filter_col = st.columns([3, 1]) with search_col: search_term = st.text_input("🔍 搜索关键词", key="kw_search", placeholder="输入关键词搜索...") with filter_col: show_original = st.checkbox("仅显示原始关键词", key="kw_filter_original", value=False) # 过滤关键词 display_keywords = st.session_state.keywords if search_term: display_keywords = [kw for kw in display_keywords if search_term.lower() in kw.lower()] if show_original and st.session_state.expanded_keywords: original_count = len(st.session_state.keywords) - len(st.session_state.expanded_keywords) display_keywords = display_keywords[:original_count] # 显示列表(分页) if display_keywords: page_size = 20 total_pages = (len(display_keywords) - 1) // page_size + 1 page = st.session_state.get("kw_page", 1) page_col1, page_col2, page_col3 = st.columns([1, 2, 1]) with page_col2: page = st.selectbox("页码", range(1, total_pages + 1), index=page - 1, key="kw_page_select") start_idx = (page - 1) * page_size end_idx = start_idx + page_size page_keywords = display_keywords[start_idx:end_idx] df = pd.DataFrame(page_keywords, columns=["长尾关键词/问题"]) st.dataframe(df, use_container_width=True, hide_index=True) st.caption(f"显示第 {start_idx + 1}-{min(end_idx, len(display_keywords))} 条,共 {len(display_keywords)} 条关键词") # 区分原始和扩展关键词 if st.session_state.expanded_keywords: original_count = len(st.session_state.keywords) - len(st.session_state.expanded_keywords) st.info(f"📌 原始关键词:{original_count} 个 | 🆕 扩展关键词:{len(st.session_state.expanded_keywords)} 个") else: st.info("未找到匹配的关键词") # 下载按钮 st.download_button( "📥 下载关键词 CSV", pd.DataFrame(st.session_state.keywords, columns=["长尾关键词/问题"]).to_csv(index=False, encoding="utf-8-sig"), f"{sanitize_filename(brand,40)}_keywords.csv", mime="text/csv", use_container_width=True, key="kw_dl_csv", ) # ========== 区域 6:智能挖掘(条件显示,默认折叠) ========== if st.session_state.keywords: st.markdown("---") with st.expander("🔍 智能关键词挖掘与趋势分析", expanded=False): st.caption("发现高价值关键词,分析竞争度,预测趋势,优化关键词策略") # ... 现有代码(保持 tabs 结构) ... else: st.info("💡 提示:在左侧完成配置后,点击"生成关键词"开始使用。") ``` **改动点**: 1. 明确区域划分(使用注释和分隔线) 2. 改进状态管理(清空时清空所有相关状态) 3. 添加参数验证和并发防护 4. 添加搜索、筛选、分页功能 5. 智能挖掘默认折叠(减少信息过载) --- ### 改动 3:改进错误处理和用户提示 **位置**:第 1064-1192 行(生成逻辑) **改动前**: ```python if cleaned: st.session_state.keywords = cleaned st.success(f"生成完成({len(cleaned)} 条)") else: error_msg = "生成失败,可能的原因:\n" # ... 通用错误信息 st.error(error_msg) ``` **改动后**: ```python if cleaned: st.session_state.keywords = cleaned # 清空扩展和集群相关状态 st.session_state.expanded_keywords = [] st.session_state.topic_clusters = [] st.session_state.mined_keywords = [] st.success(f"✅ 生成完成!共生成 {len(cleaned)} 个关键词") st.balloons() # 成功动画(可选) else: # 分场景错误提示 if generation_mode == "AI生成": st.error(""" ❌ **AI 生成失败** **可能原因:** - API Key 配置错误或余额不足 - 网络连接问题 - 品牌名称或核心优势为空 **解决建议:** 1. 检查侧边栏的 API Key 配置 2. 确认品牌名称和核心优势已填写 3. 稍后重试或联系技术支持 """) elif generation_mode == "托词工具": wordbanks = st.session_state.wordbanks or st.session_state.keyword_tool.load_wordbanks() empty_banks = [k for k, v in wordbanks.items() if not v] if empty_banks: st.error(f""" ❌ **词库为空** 以下词库为空,请先添加词汇: - {', '.join(empty_banks)} **操作步骤:** 1. 点击"词库管理" 2. 选择空的词库类型 3. 添加至少 3-5 个词汇 4. 点击"更新词库" 5. 重新生成关键词 """) elif not st.session_state.get("selected_patterns"): st.error(""" ❌ **未选择组合模式** 请至少选择一个组合模式: 1. 在"组合模式选择"区域 2. 勾选至少一个模式 3. 重新生成关键词 """) elif generation_mode == "混合模式": # 类似托词工具的错误处理 # ... ``` **改动点**: 1. 分场景错误提示(更具体) 2. 提供解决建议(可操作) 3. 使用 markdown 格式化(更易读) 4. 清空相关状态(避免数据混乱) --- ### 改动 4:优化加载状态和进度提示 **位置**:所有异步操作 **改动前**: ```python with st.spinner("AI生成中..."): # ... ``` **改动后**: ```python # 使用进度条和详细状态 progress_bar = st.progress(0) status_text = st.empty() with st.spinner(""): status_text.text("🔄 正在生成关键词...") progress_bar.progress(10) # 模拟进度(实际应根据 API 响应调整) if generation_mode == "AI生成": status_text.text("🤖 调用 AI 模型生成关键词...") progress_bar.progress(30) # ... 实际生成逻辑 progress_bar.progress(80) status_text.text("✨ 处理生成结果...") progress_bar.progress(100) elif generation_mode == "托词工具": status_text.text("🔧 加载词库和组合模式...") progress_bar.progress(20) status_text.text("🔄 生成关键词组合...") progress_bar.progress(60) status_text.text("✨ 去重和筛选...") progress_bar.progress(100) # ... status_text.text(f"✅ 完成!生成 {len(cleaned)} 个关键词") progress_bar.empty() ``` **改动点**: 1. 使用进度条(视觉反馈) 2. 详细状态文本(用户知道在做什么) 3. 分阶段进度(更真实) --- ### 改动 5:改进默认值和初始化 **位置**:第 1042 行(生成数量滑块) **改动前**: ```python st.session_state.kw_last_num = st.slider( "生成数量", 10, 100, st.session_state.kw_last_num, key="kw_num" ) ``` **改动后**: ```python # 确保默认值有效 ss_init("kw_last_num", 20) # 默认 20 个 # 滑块 + 手动输入 col1, col2 = st.columns([3, 1]) with col1: st.session_state.kw_last_num = st.slider( "生成数量", 5, 200, # 扩大范围 st.session_state.kw_last_num, key="kw_num", help="建议范围:10-50 个关键词" ) with col2: manual_num = st.number_input( "手动输入", min_value=5, max_value=200, value=st.session_state.kw_last_num, key="kw_num_manual" ) if manual_num != st.session_state.kw_last_num: st.session_state.kw_last_num = manual_num st.rerun() ``` **改动点**: 1. 确保默认值初始化 2. 扩大范围(5-200) 3. 添加手动输入选项(精确控制) 4. 提供建议范围(帮助用户) --- ## 测试用例清单 ### 测试用例 1:AI 生成模式 - 正常流程 **前置条件**: - 侧边栏已配置 API Key、品牌名称、核心优势 - Tab 1 处于默认状态 **测试步骤**: 1. 选择"AI生成"模式(默认) 2. 设置生成数量为 20 3. 点击"生成关键词"按钮 4. 等待生成完成 **预期结果**: - ✅ 显示加载状态(进度条 + 状态文本) - ✅ 生成 20 个关键词(或接近 20 个,取决于去重) - ✅ 显示成功提示:"✅ 生成完成!共生成 X 个关键词" - ✅ 关键词列表区域显示 DataFrame - ✅ 可以下载 CSV 文件 --- ### 测试用例 2:AI 生成模式 - 参数缺失 **前置条件**: - 侧边栏未配置品牌名称或核心优势 - Tab 1 处于默认状态 **测试步骤**: 1. 选择"AI生成"模式 2. 设置生成数量为 20 3. 点击"生成关键词"按钮 **预期结果**: - ✅ 显示错误提示:"❌ 请先在侧边栏配置品牌名称和核心优势" - ✅ 不执行 API 调用 - ✅ 按钮保持可用状态(允许修复后重试) --- ### 测试用例 3:托词工具模式 - 正常流程 **前置条件**: - 侧边栏已配置品牌名称、核心优势 - 词库已初始化(有词汇) - 至少选择一个组合模式 **测试步骤**: 1. 选择"托词工具"模式 2. 在"组合模式选择"中勾选至少一个模式 3. 设置生成数量为 30 4. 点击"生成关键词"按钮 5. 等待生成完成 **预期结果**: - ✅ 显示"组合模式选择"和"词库管理"区域 - ✅ 生成 30 个关键词(或接近,取决于组合结果) - ✅ 显示成功提示 - ✅ 关键词列表显示结果 --- ### 测试用例 4:托词工具模式 - 词库为空 **前置条件**: - 侧边栏已配置 - 词库为空(所有词库类型都没有词汇) **测试步骤**: 1. 选择"托词工具"模式 2. 选择一个组合模式 3. 点击"生成关键词"按钮 **预期结果**: - ✅ 显示错误提示:"❌ 词库为空",列出空的词库类型 - ✅ 提供解决建议(添加词汇的步骤) - ✅ 不执行生成逻辑 --- ### 测试用例 5:托词工具模式 - 未选择组合模式 **前置条件**: - 侧边栏已配置 - 词库有词汇 - 未选择任何组合模式 **测试步骤**: 1. 选择"托词工具"模式 2. 不选择任何组合模式(取消所有勾选) 3. 点击"生成关键词"按钮 **预期结果**: - ✅ "生成关键词"按钮被禁用(或点击后显示错误) - ✅ 显示错误提示:"❌ 未选择组合模式" - ✅ 提供解决建议 --- ### 测试用例 6:混合模式 - 正常流程 **前置条件**: - 侧边栏已配置 API Key、品牌名称、核心优势 - 词库已初始化 - 至少选择一个组合模式 **测试步骤**: 1. 选择"混合模式" 2. 配置组合模式和词库 3. 设置生成数量为 25 4. 点击"生成关键词"按钮 5. 观察两个阶段的加载状态 **预期结果**: - ✅ 显示"托词生成中..."状态 - ✅ 显示"LLM 润色中..."状态 - ✅ 生成 25 个关键词(经过润色) - ✅ 显示成功提示 --- ### 测试用例 7:并发点击防护 **前置条件**: - 侧边栏已配置 - Tab 1 处于可生成状态 **测试步骤**: 1. 点击"生成关键词"按钮 2. 在加载过程中,快速再次点击按钮(模拟并发) **预期结果**: - ✅ 第一次点击后,按钮被禁用或显示"正在生成中" - ✅ 第二次点击被忽略或显示警告:"⏳ 正在生成中,请勿重复点击" - ✅ 只执行一次 API 调用 - ✅ 生成完成后,按钮恢复可用 --- ### 测试用例 8:语义扩展功能 **前置条件**: - 已生成关键词(至少 10 个) - 侧边栏已配置 API Key **测试步骤**: 1. 滚动到"语义足迹扩展"区域 2. 设置扩展数量为 30 3. 选择合并策略为"追加" 4. 点击"开始语义扩展"按钮 5. 等待扩展完成 **预期结果**: - ✅ 显示加载状态:"正在扩展关键词(目标:30 个)..." - ✅ 扩展完成后,关键词列表总数增加 - ✅ 显示成功提示:"✅ 语义扩展完成!新增 X 个关键词,总计 Y 个" - ✅ 显示扩展统计信息(6 个指标) - ✅ 可以查看扩展详情和覆盖面分析 --- ### 测试用例 9:话题集群生成 **前置条件**: - 已生成关键词(至少 20 个) - 侧边栏已配置 API Key **测试步骤**: 1. 滚动到"话题集群生成"区域 2. 设置话题集群数量为 5 3. 点击"生成话题集群"按钮 4. 等待生成完成 **预期结果**: - ✅ 显示加载状态 - ✅ 生成 5 个话题集群 - ✅ 显示统计信息(4 个指标) - ✅ 显示话题集群列表(可展开查看详情) - ✅ 显示话题关联关系表格 - ✅ 显示话题网络图(可视化) - ✅ 显示内容规划建议 --- ### 测试用例 10:清空功能 **前置条件**: - 已生成关键词 - 已执行扩展或集群生成 **测试步骤**: 1. 点击"清空结果"按钮 2. 观察页面状态 **预期结果**: - ✅ 显示 Toast 提示:"已清空所有关键词和相关数据" - ✅ `st.session_state.keywords` 被清空 - ✅ `st.session_state.expanded_keywords` 被清空 - ✅ `st.session_state.topic_clusters` 被清空 - ✅ `st.session_state.mined_keywords` 被清空 - ✅ 关键词列表区域消失 - ✅ 扩展功能区域消失 - ✅ 页面显示提示:"💡 提示:在左侧完成配置后,点击"生成关键词"开始使用。" --- ### 测试用例 11:搜索和筛选功能 **前置条件**: - 已生成关键词(包含扩展关键词) **测试步骤**: 1. 在关键词列表的搜索框输入关键词(如"AI") 2. 观察列表过滤结果 3. 勾选"仅显示原始关键词" 4. 观察列表变化 **预期结果**: - ✅ 搜索框实时过滤关键词 - ✅ 显示匹配的关键词数量 - ✅ 勾选"仅显示原始关键词"后,只显示原始关键词(不包含扩展的) - ✅ 分页功能正常工作(如果关键词 > 20 个) --- ### 测试用例 12:智能挖掘功能 **前置条件**: - 已生成关键词 - 侧边栏已配置 API Key **测试步骤**: 1. 展开"智能关键词挖掘与趋势分析"区域 2. 切换到"🌐 行业热点挖掘"标签 3. 输入行业领域(如"AI工具") 4. 设置挖掘数量为 20 5. 点击"开始挖掘"按钮 6. 等待挖掘完成 7. 点击某个挖掘结果的"添加"按钮 **预期结果**: - ✅ 显示加载状态 - ✅ 挖掘完成,显示挖掘结果列表 - ✅ 每个结果显示关键词、类别、意图、预估价值 - ✅ 点击"添加"后,关键词被添加到主列表 - ✅ 显示成功提示:"已添加" - ✅ 页面刷新,新关键词出现在列表中 --- ### 测试用例 13:词库管理 - 编辑词库 **前置条件**: - 选择"托词工具"或"混合模式" - 词库已初始化 **测试步骤**: 1. 在"词库管理"区域,选择"编辑词库"标签 2. 选择一个词库类型(如"核心词") 3. 在文本框中添加新词汇(每行一个) 4. 点击"更新词库"按钮 5. 观察成功提示 6. 重新生成关键词,验证新词汇被使用 **预期结果**: - ✅ 显示当前词库内容 - ✅ 可以编辑文本 - ✅ 点击"更新词库"后,显示成功提示:"核心词 已更新(X 个词汇)" - ✅ 新词汇在生成关键词时被使用 --- ### 测试用例 14:词库管理 - 导入导出 **前置条件**: - 选择"托词工具"或"混合模式" - 词库已初始化 **测试步骤**: 1. 在"词库管理"区域,选择"导入/导出"标签 2. 点击"导出词库(JSON)"按钮 3. 下载 JSON 文件 4. 修改 JSON 文件(添加新词汇) 5. 点击"导入词库(JSON)"按钮 6. 上传修改后的 JSON 文件 7. 观察导入结果 **预期结果**: - ✅ 成功下载 JSON 文件 - ✅ JSON 文件格式正确(包含所有词库类型) - ✅ 上传后显示成功提示:"词库导入成功!" - ✅ 页面刷新,新词库内容生效 - ✅ 如果 JSON 格式错误,显示错误提示 --- ### 测试用例 15:边界条件测试 **测试步骤**: 1. 生成数量设置为最小值(5) 2. 生成数量设置为最大值(200) 3. 生成数量设置为手动输入(如 150) 4. 在空状态下点击"生成关键词"(无配置) 5. 在 API Key 无效时点击"生成关键词" **预期结果**: - ✅ 最小值/最大值正常工作 - ✅ 手动输入值被正确应用 - ✅ 空状态显示友好提示 - ✅ API Key 无效时显示具体错误信息 --- ## 最小改动 MVP 优化清单(1 天内完成) ### 优先级 P0(必须完成,约 4 小时) #### 1. 去掉 Tab 名称序号(5 分钟) - [ ] 修改第 913 行,去掉序号,保留 emoji - [ ] 测试所有 Tab 切换正常 #### 2. 修复空值检查(30 分钟) - [ ] 在 `run_kw` 点击时,验证所有必需参数 - [ ] 添加分场景错误提示 - [ ] 测试各种缺失参数的情况 #### 3. 修复状态同步问题(30 分钟) - [ ] 在生成新关键词时,清空扩展/集群相关状态 - [ ] 在清空按钮中,清空所有相关状态 - [ ] 测试状态同步 #### 4. 添加并发点击防护(30 分钟) - [ ] 使用 `st.session_state.kw_generating` 标记 - [ ] 在生成过程中禁用按钮 - [ ] 测试并发点击 #### 5. 优化错误提示(1 小时) - [ ] 分场景错误提示(AI生成/托词工具/混合模式) - [ ] 提供解决建议 - [ ] 使用 markdown 格式化 - [ ] 测试各种错误场景 #### 6. 修复缓存问题(30 分钟) - [ ] 在生成前重新加载最新配置 - [ ] 测试词库更新后的生成 #### 7. 改进布局结构(1 小时) - [ ] 添加区域划分(注释 + 分隔线) - [ ] 使用容器分组主要功能 - [ ] 智能挖掘默认折叠 - [ ] 测试布局显示 ### 优先级 P1(建议完成,约 2 小时) #### 8. 添加搜索和筛选(30 分钟) - [ ] 添加搜索框 - [ ] 添加"仅显示原始关键词"筛选 - [ ] 测试搜索和筛选功能 #### 9. 改进加载状态(30 分钟) - [ ] 使用进度条和详细状态文本 - [ ] 分阶段进度提示 - [ ] 测试加载状态显示 #### 10. 优化默认值(20 分钟) - [ ] 确保 `kw_last_num` 默认值初始化 - [ ] 扩大滑块范围(5-200) - [ ] 测试默认值 #### 11. 改进结果展示(40 分钟) - [ ] 添加分页功能(如果关键词 > 20 个) - [ ] 改进原始/扩展关键词区分 - [ ] 测试结果展示 ### 优先级 P2(可选,约 1 小时) #### 12. 添加撤销功能(30 分钟) - [ ] 在清空按钮添加确认对话框 - [ ] 或添加撤销按钮(保存上一次状态) - [ ] 测试撤销功能 #### 13. 优化行业热点挖掘默认值(10 分钟) - [ ] 默认使用 `brand` 作为行业领域 - [ ] 允许覆盖 - [ ] 测试默认值 #### 14. 添加多格式导出(20 分钟) - [ ] 添加 JSON 格式导出 - [ ] 添加 TXT 格式导出 - [ ] 测试导出功能 --- ## 总结 ### 核心改动 1. **去掉序号**:Tab 名称去掉序号,保留 emoji,提升现代感 2. **布局优化**:明确区域划分,使用容器分组,智能挖掘默认折叠 3. **逻辑修复**:空值检查、状态同步、并发防护、错误提示 4. **体验提升**:搜索筛选、加载状态、分页、默认值优化 ### 预计工作量 - **P0 改动**:4 小时(必须完成) - **P1 改动**:2 小时(建议完成) - **P2 改动**:1 小时(可选) - **总计**:7 小时(1 天内可完成 P0 + P1) ### 风险控制 - **逐步实施**:先完成 P0,测试通过后再做 P1 - **保持功能**:只改布局和体验,不改核心逻辑 - **充分测试**:每个改动后立即测试,确保功能正常 --- **文档版本**:v1.0 **最后更新**:2026-01-28 **下一步**:开始实施 P0 改动