初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
This commit is contained in:
commit
78ff261b5a
199 files changed
+69126
No files matched your search
@@ -0,0 +1,406 @@
|
||||
# 测试用例 — 10问题修复验证(Round 3)
|
||||
|
||||
**测试日期**: 2026-06-01
|
||||
**测试工程师**: 测试工程师
|
||||
**测试依据**: PRD v1.0 + 项目负责人给定的10个问题清单 + 前后端代码分析
|
||||
**测试方针**: 以真实用户操作场景为基础,模拟用户通过浏览器完整走通各功能流程
|
||||
|
||||
---
|
||||
|
||||
## 1. 需求依据
|
||||
|
||||
- PRD 路径: `/data/share/project/docs/PRD.md`
|
||||
- 本轮10个问题清单(项目负责人指定):
|
||||
1. 邮件配置保存不生效 + 测试发送失败
|
||||
2. 聊天对话窗口多功能按钮不显示(置顶/转知识图谱/归档等)
|
||||
3. AI聊天询问技能后不罗列平台已安装应用
|
||||
4. 应用市场卸载后无法再安装 + 重复安装未提示
|
||||
5. 技能选择框显示已卸载应用
|
||||
6. 频道二维码显示测试地址localhost
|
||||
7. Token时间不同步 + 导出CSV无响应 + 一键充值无响应
|
||||
8. 知识图谱节点不可拖拽和点亮
|
||||
9. AI聊天技能/知识库/Agent需支持多选组合
|
||||
10. 资产重复显示 + 分类错误 + 在线预览需集成Office
|
||||
|
||||
---
|
||||
|
||||
## 2. 代码功能模块概览
|
||||
|
||||
| 模块 | 代码位置(后端) | 代码位置(前端) | 对应问题 |
|
||||
|------|--------------|-------------|---------|
|
||||
| 邮件配置API | `api/admin/settings.py:132-397` | `pages/admin/SiteSettings.tsx:271-437` | Q1 |
|
||||
| 对话管理API | `api/chat.py:125-682` | `pages/front/ChatPage.tsx:459-708` | Q2 |
|
||||
| 技能列表API | `api/evolution.py:40-52`, `api/market.py:44-124` | `ChatPage.tsx:372-401` | Q3, Q5 |
|
||||
| 应用市场安装卸载 | `api/market.py:300-393` | `pages/front/MarketPage.tsx:285-1374` | Q4 |
|
||||
| 频道二维码 | `api/channels.py:420-498` | `pages/front/ChannelPage.tsx:391-729` | Q6 |
|
||||
| Token驾驶舱 | `api/token_usage.py:25-242` | `pages/front/TokenDashboardPage.tsx:184-459` | Q7 |
|
||||
| 知识图谱 | `api/knowledge.py:226-740` | `pages/front/KnowledgePage.tsx:163-415` | Q8 |
|
||||
| 聊天多选选择器 | `api/chat.py:41-48, 258-293` | `ChatPage.tsx:835-932` | Q9 |
|
||||
| 资产分类去重 | `api/assets.py:40-373` | `pages/front/AssetsPage.tsx:395-466` | Q10 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 需求与代码差异说明
|
||||
|
||||
### 3.1 PRD中未在代码中体现的内容
|
||||
|
||||
| 编号 | PRD功能点 | 现状 |
|
||||
|------|----------|------|
|
||||
| D1 | Token驾驶舱余额预警弹窗(PRD 7.2-模块五) | 代码中未实现自动弹窗预警,仅页面展示余额信息 |
|
||||
| D2 | 应用市场选择是否参与优惠券满减(PRD 7.2-模块四) | 市场发布流程未集成优惠券参与选项 |
|
||||
| D3 | 知识库问答溯源原文展示(PRD 7.2-模块三) | 知识库QA API存在但前端溯源展示不完整 |
|
||||
| D4 | 会员自动降级/自动续费规则引擎(PRD 7.2-后台模块五) | 数据库表结构存在但自动降级定时任务未实现 |
|
||||
|
||||
### 3.2 PRD中未覆盖但代码中存在的功能模块
|
||||
|
||||
| 编号 | 模块名称 | 代码位置 | 建议 |
|
||||
|------|---------|---------|------|
|
||||
| N1 | AI自进化驾驶舱 | `api/evolution.py`, `frontend/EvolutionDashboard.tsx` | 产品确认是否纳入正式需求 |
|
||||
| N2 | 广告位管理与AI绘图 | `api/admin/ads.py`, `frontend/Ads.tsx` | 产品确认商业化优先级 |
|
||||
| N3 | 工具调用循环(tool-call) | `api/chat.py:307-380` | 已在聊天中使用,产品确认 |
|
||||
| N4 | 小说阅读预览器 | `frontend/NovelPreviewPage.tsx` | 特定资产类型的在线阅读,产品确认 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 测试用例
|
||||
|
||||
### 4.1 邮件配置保存+测试发送 (Q1)
|
||||
|
||||
#### TC-1-01 [P0] 验证邮件配置保存并确认数据持久化
|
||||
- **前置条件**: 管理员已登录后台
|
||||
- **步骤**:
|
||||
[1] 浏览器打开后台 → 点击"网站基础设置"
|
||||
[2] 在邮件配置区域填写SMTP服务器、端口、用户名、密码、发件地址
|
||||
[3] 点击"保存设置"按钮
|
||||
[4] 刷新页面,检查邮件配置是否回显已保存的数据
|
||||
[5] 通过API再次确认数据库中的配置
|
||||
- **预期结果**: 保存后页面不报错;刷新后配置数据正确回显;数据库中email_configs表存在对应记录
|
||||
- **备注**: 核心验证——保存是否真正生效
|
||||
|
||||
#### TC-1-02 [P0] 验证发送测试邮件弹窗及AI生成内容
|
||||
- **前置条件**: 邮件配置已保存,管理员在"网站基础设置"页面
|
||||
- **步骤**:
|
||||
[1] 点击"发送测试邮件"按钮
|
||||
[2] 验证弹窗出现,包含收件邮箱(必填)、邮件主题、邮件内容三个输入框
|
||||
[3] 点击"AI生成测试内容"按钮
|
||||
[4] 验证邮件主题和内容被AI自动填入(而非报错)
|
||||
[5] 填写收件邮箱,点击"发送测试邮件"
|
||||
[6] 验证页面给出明确反馈(成功或失败消息)
|
||||
- **预期结果**: 弹窗正常;AI生成内容成功填入主题和正文;发送后页面有toast提示(即使SMTP无效也应给出明确错误提示而非静默失败)
|
||||
- **备注**: 修复前AI生成和发送可能静默失败
|
||||
|
||||
#### TC-1-03 [P1] 验证邮件配置必填字段校验
|
||||
- **前置条件**: 管理员在邮件配置区域
|
||||
- **步骤**:
|
||||
[1] 清空SMTP服务器或发件地址等必填字段
|
||||
[2] 点击"保存设置"
|
||||
[3] 观察是否有校验提示
|
||||
- **预期结果**: 后端返回422或前端提示必填字段缺失
|
||||
- **备注**: 边界测试
|
||||
|
||||
---
|
||||
|
||||
### 4.2 聊天对话下拉菜单多功能按钮 (Q2)
|
||||
|
||||
#### TC-2-01 [P0] 验证对话列表项下拉菜单展示及5个操作按钮
|
||||
- **前置条件**: 用户已登录,有至少一条历史对话
|
||||
- **步骤**:
|
||||
[1] 进入AI聊天页面,在左侧对话列表中找到任意对话
|
||||
[2] 点击对话项右侧的三点(More)图标按钮
|
||||
[3] 检查下拉菜单是否弹出
|
||||
[4] 逐一验证5个操作按钮是否可见:置顶/取消置顶、转知识图谱、重命名、归档/取消归档、删除
|
||||
- **预期结果**: 下拉菜单正常弹出,5个按钮全部可见可点击
|
||||
- **备注**: 核心验证——下拉菜单是否在页面上可见
|
||||
|
||||
#### TC-2-02 [P0] 验证置顶功能
|
||||
- **前置条件**: 对话列表中有多条对话
|
||||
- **步骤**:
|
||||
[1] 对某条非置顶对话点击"置顶"
|
||||
[2] 观察对话是否移动到列表顶部
|
||||
[3] 刷新页面,确认置顶状态持久化
|
||||
[4] 再次打开菜单,点击"取消置顶"
|
||||
[5] 验证对话恢复正常排序
|
||||
- **预期结果**: 置顶后对话排在最前,刷新后保持;取消置顶恢复
|
||||
- **备注**: API: PUT /conversations/{id} pinned=true/false
|
||||
|
||||
#### TC-2-03 [P1] 验证转知识图谱功能
|
||||
- **前置条件**: 对话中有实际消息内容
|
||||
- **步骤**:
|
||||
[1] 对某条有消息内容的对话点击"转知识图谱"
|
||||
[2] 等待处理完成
|
||||
[3] 进入知识库页面,验证是否自动创建了名为"对话图谱-{对话标题}"的知识库
|
||||
- **预期结果**: 知识库创建成功,包含对话消息文档
|
||||
- **备注**: API: POST /conversations/{id}/to-knowledge-graph
|
||||
|
||||
#### TC-2-04 [P1] 验证归档和删除功能
|
||||
- **前置条件**: 对话列表中有对话
|
||||
- **步骤**:
|
||||
[1] 对某对话点击"归档"
|
||||
[2] 对话从活跃列表消失
|
||||
[3] 对另一对话点击"删除"
|
||||
[4] 对话被移除
|
||||
- **预期结果**: 归档和删除操作正常执行,状态正确更新
|
||||
|
||||
---
|
||||
|
||||
### 4.3 技能列表显示已安装应用 (Q3)
|
||||
|
||||
#### TC-3-01 [P0] 验证聊天中输入@或询问后列出平台已安装应用
|
||||
- **前置条件**: 用户已登录,已安装若干应用
|
||||
- **步骤**:
|
||||
[1] 进入AI聊天页面
|
||||
[2] 点击底部"技能"按钮
|
||||
[3] 检查下拉列表中的技能
|
||||
[4] 验证列表中只显示用户已安装的技能,不显示未安装或已卸载的应用
|
||||
[5] 选择一个技能后发送消息,验证技能参数是否传递到后端
|
||||
- **预期结果**: 技能列表仅包含已安装的技能;选中后可正常发送
|
||||
- **备注**: 代码中ChatPage.tsx:393-400通过marketAPI获取并过滤installed状态
|
||||
|
||||
#### TC-3-02 [P1] 验证卸载应用后技能列表更新
|
||||
- **前置条件**: 用户已安装技能A,技能列表中可见A
|
||||
- **步骤**:
|
||||
[1] 去应用市场卸载技能A
|
||||
[2] 返回聊天页面,重新打开技能下拉框
|
||||
[3] 检查技能A是否不再出现在列表中
|
||||
- **预期结果**: 已卸载的技能不再出现在技能选择框中
|
||||
|
||||
---
|
||||
|
||||
### 4.4 应用市场安装卸载+重复检测 (Q4)
|
||||
|
||||
#### TC-4-01 [P0] 验证安装功能
|
||||
- **前置条件**: 用户已登录,应用市场中有未安装的应用
|
||||
- **步骤**:
|
||||
[1] 进入应用市场,找到未安装的应用(无"卸载"按钮)
|
||||
[2] 点击该应用卡片进入详情
|
||||
[3] 点击"安装"按钮
|
||||
[4] 观察安装结果
|
||||
[5] 返回列表验证该应用按钮变为"卸载"
|
||||
- **预期结果**: 安装成功;状态从"未安装"变为"已安装"
|
||||
- **备注**: 真实用户操作流程
|
||||
|
||||
#### TC-4-02 [P0] 验证卸载后重新安装
|
||||
- **前置条件**: 应用已安装
|
||||
- **步骤**:
|
||||
[1] 对已安装应用点击"卸载"
|
||||
[2] 确认卸载成功(按钮变为价格/"安装")
|
||||
[3] 再次点击"安装"
|
||||
[4] 观察是否能重新安装成功
|
||||
- **预期结果**: 卸载后可重新安装,不会报错或提示已安装
|
||||
- **备注**: 修复前可能卸载后AppInstallation记录未正确清理
|
||||
|
||||
#### TC-4-03 [P1] 验证重复安装检测
|
||||
- **前置条件**: 应用已安装
|
||||
- **步骤**:
|
||||
[1] 对已安装应用再次尝试安装
|
||||
[2] 观察系统反馈
|
||||
- **预期结果**: 系统提示"已经安装,无需重复安装"或类似提示
|
||||
- **备注**: MarketPage.tsx:285-306有installed检测逻辑
|
||||
|
||||
---
|
||||
|
||||
### 4.5 技能选择框不显示已卸载应用 (Q5)
|
||||
|
||||
#### TC-5-01 [P0] 验证技能选择框中不包含已卸载应用
|
||||
- **前置条件**: 用户安装过技能A和B,并卸载了B
|
||||
- **步骤**:
|
||||
[1] 进入聊天页面
|
||||
[2] 点击"技能"按钮打开选择框
|
||||
[3] 检查列表中是否包含技能B(已卸载)
|
||||
- **预期结果**: 列表中不包含已卸载的技能B;仅显示已安装的技能A
|
||||
- **备注**: 前端ChatPage.tsx:393-400过滤`a.installed !== false`
|
||||
|
||||
#### TC-5-02 [P1] 验证技能选择框为空时的提示
|
||||
- **前置条件**: 用户没有安装任何技能
|
||||
- **步骤**:
|
||||
[1] 进入聊天页面,点击"技能"按钮
|
||||
[2] 观察下拉框内容
|
||||
- **预期结果**: 显示"暂无可用技能"或空列表
|
||||
|
||||
---
|
||||
|
||||
### 4.6 频道二维码非localhost (Q6)
|
||||
|
||||
#### TC-6-01 [P0] 验证频道二维码中绑定URL使用生产地址
|
||||
- **前置条件**: 管理员已在后台配置频道(微信平台)
|
||||
- **步骤**:
|
||||
[1] 进入频道页面
|
||||
[2] 点击频道进入详情
|
||||
[3] 点击"连接频道"或"接入新平台"触发二维码生成
|
||||
[4] 通过浏览器DevTools检查Network请求中二维码生成API的响应
|
||||
[5] 验证二维码编码的URL是否以`APP_ACCESS_URL`为前缀
|
||||
- **预期结果**: 二维码中的绑定URL使用`APP_ACCESS_URL`(即`http://s-3686137677310083075-773.team-coding:8080`),而非`localhost`
|
||||
- **备注**: channels.py:496-497使用APP_ACCESS_URL环境变量
|
||||
|
||||
#### TC-6-02 [P1] 验证二维码扫码绑定流程
|
||||
- **前置条件**: 频道已创建,微信凭证已配置
|
||||
- **步骤**:
|
||||
[1] 创建新的微信频道
|
||||
[2] 在第二步中生成二维码
|
||||
[3] 检查二维码图片是否正常显示
|
||||
[4] 观察二维码下方是否显示平台提示信息
|
||||
- **预期结果**: 二维码图片正常显示,绑定URL使用生产地址
|
||||
|
||||
---
|
||||
|
||||
### 4.7 Token驾驶舱时间/导出/充值 (Q7)
|
||||
|
||||
#### TC-7-01 [P0] 验证Token消耗明细时间显示正确
|
||||
- **前置条件**: 用户已有Token消耗记录
|
||||
- **步骤**:
|
||||
[1] 进入Token驾驶舱页面
|
||||
[2] 查看消耗明细表格中的"时间"列
|
||||
[3] 对比系统当前时间
|
||||
[4] 验证时间格式为`YYYY-MM-DD HH:mm`
|
||||
- **预期结果**: 时间显示与系统时间在同一时区,格式正确
|
||||
- **备注**: 前端formatTime函数(TokenDashboardPage.tsx:444-459)处理
|
||||
|
||||
#### TC-7-02 [P0] 验证CSV导出功能
|
||||
- **前置条件**: 用户有Token消耗记录
|
||||
- **步骤**:
|
||||
[1] 点击"导出数据"按钮
|
||||
[2] 观察浏览器是否触发文件下载
|
||||
[3] 下载完成后打开CSV文件检查内容
|
||||
[4] 验证文件名格式为`token-usage-YYYY-MM-DD.csv`
|
||||
- **预期结果**: 浏览器触发下载,CSV包含正确的Token消耗数据(时间/模型/应用/Prompt/Completion/总Token/费用)
|
||||
- **备注**: 修复前可能点击无响应
|
||||
|
||||
#### TC-7-03 [P0] 验证一键充值按钮跳转
|
||||
- **前置条件**: 用户在Token驾驶舱页面
|
||||
- **步骤**:
|
||||
[1] 点击"一键充值"按钮
|
||||
[2] 观察页面跳转
|
||||
- **预期结果**: 跳转到付费中心页面(`#/pricing`或`#/billing`)
|
||||
- **备注**: 修复前可能点击无响应
|
||||
|
||||
#### TC-7-04 [P1] 验证Token余额不足提示
|
||||
- **前置条件**: 用户Token余额为0
|
||||
- **步骤**:
|
||||
[1] 进入Token驾驶舱
|
||||
[2] 观察是否显示余额不足的提示
|
||||
- **预期结果**: 页面顶端显示"Token余额不足"警告横幅
|
||||
|
||||
---
|
||||
|
||||
### 4.8 知识图谱节点拖拽和点亮 (Q8)
|
||||
|
||||
#### TC-8-01 [P0] 验证知识图谱节点可拖拽
|
||||
- **前置条件**: 知识库已构建知识图谱,有节点和边
|
||||
- **步骤**:
|
||||
[1] 进入知识库 → 点击有图谱的库
|
||||
[2] 点击"查看图谱"或"构建知识图谱"
|
||||
[3] 在Canvas画布上找到一个节点
|
||||
[4] 鼠标按住节点并拖动
|
||||
[5] 松开鼠标,验证节点停留在新位置
|
||||
- **预期结果**: 节点可被拖拽移动,松手后停留在新位置
|
||||
- **备注**: KnowledgeGraphView组件第176-178行和405-408行实现
|
||||
|
||||
#### TC-8-02 [P0] 验证知识图谱节点可点亮/高亮
|
||||
- **前置条件**: 图谱中有多个节点和边
|
||||
- **步骤**:
|
||||
[1] 在Canvas上点击一个节点
|
||||
[2] 观察该节点是否高亮(金色边框)
|
||||
[3] 观察与该节点相连的邻居节点是否有彩色光晕
|
||||
[4] 观察非关联节点是否变暗
|
||||
[5] 鼠标悬停在节点上,观察hover效果
|
||||
- **预期结果**: 选中节点金色边框高亮;邻居节点彩色光晕;非关联节点变暗半透明
|
||||
- **备注**: KnowledgeGraphView第296-353行实现
|
||||
|
||||
---
|
||||
|
||||
### 4.9 聊天多选组合功能 (Q9)
|
||||
|
||||
#### TC-9-01 [P0] 验证知识库多选功能
|
||||
- **前置条件**: 用户有多个知识库
|
||||
- **步骤**:
|
||||
[1] 进入聊天页面
|
||||
[2] 点击底部"知识库"按钮
|
||||
[3] 在下拉框中勾选2个以上知识库
|
||||
[4] 观察已选知识库是否带✓标记
|
||||
[5] 点击"清除选择"按钮验证全部取消
|
||||
- **预期结果**: 支持多选;已选项标记✓;清除选择可全取消
|
||||
|
||||
#### TC-9-02 [P0] 验证Agent多选功能
|
||||
- **前置条件**: 用户已安装多个Agent
|
||||
- **步骤**:
|
||||
[1] 点击"Agent"按钮
|
||||
[2] 勾选多个Agent
|
||||
[3] 验证多选状态保持
|
||||
- **预期结果**: 支持多选Agent
|
||||
|
||||
#### TC-9-03 [P0] 验证技能多选功能
|
||||
- **前置条件**: 用户已安装多个技能
|
||||
- **步骤**:
|
||||
[1] 点击"技能"按钮
|
||||
[2] 勾选多个技能
|
||||
[3] 验证多选状态保持
|
||||
- **预期结果**: 支持多选技能
|
||||
|
||||
#### TC-9-04 [P0] 验证三者组合发送
|
||||
- **前置条件**: 至少选了一个知识库+一个Agent+一个技能
|
||||
- **步骤**:
|
||||
[1] 同时选择知识库、Agent、技能
|
||||
[2] 在输入框输入消息内容
|
||||
[3] 点击发送(Enter)
|
||||
[4] 通过Network检查发送请求参数是否包含knowledge_base_ids、agent_ids、skill_ids
|
||||
- **预期结果**: 发送请求正确携带多选的knowledge_base_ids、agent_ids、skill_ids参数
|
||||
|
||||
---
|
||||
|
||||
### 4.10 资产去重+分类+预览 (Q10)
|
||||
|
||||
#### TC-10-01 [P0] 验证资产不重复显示
|
||||
- **前置条件**: 知识库中存在文档(已自动同步为资产)
|
||||
- **步骤**:
|
||||
[1] 进入资产页面
|
||||
[2] 检查列表中是否有同名/同内容的重复条目
|
||||
[3] 通过JS选择器检查资产ID是否有重复
|
||||
- **预期结果**: 每个资产只出现一次,无重复条目
|
||||
- **备注**: 前端AssetsPage.tsx:453-459通过Set去重
|
||||
|
||||
#### TC-10-02 [P0] 验证资产分类正确性
|
||||
- **前置条件**: 有不同类型的资产(文件、图片等)
|
||||
- **步骤**:
|
||||
[1] 进入资产页面
|
||||
[2] 使用分类筛选按钮逐个切换(全部/文件/图片/视频/音频/小说/其他)
|
||||
[3] 每次切换后验证显示的资产类型是否与所选分类匹配
|
||||
- **预期结果**: 分类筛选正确,各分类下的资产类型匹配
|
||||
|
||||
#### TC-10-03 [P1] 验证文件类型自动映射
|
||||
- **前置条件**: 知识库中有不同类型的文档(.docx, .pptx, .pdf, .txt等)
|
||||
- **步骤**:
|
||||
[1] 进入资产页面
|
||||
[2] 检查各种文件类型的显示标签
|
||||
[3] 验证.docx显示为"Word"、.pptx显示为"PPT"、.txt显示为"文本"等
|
||||
- **预期结果**: fileType标签映射正确
|
||||
|
||||
#### TC-10-04 [P1] 验证知识库文档归类到文件分类
|
||||
- **前置条件**: 知识库中上传了文档
|
||||
- **步骤**:
|
||||
[1] 进入资产页面 → 点击"文件"分类
|
||||
[2] 验证知识库文档是否出现在文件分类下
|
||||
- **预期结果**: 知识库文档显示在"文件"分类中
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试用例统计
|
||||
|
||||
| 问题编号 | 问题简述 | P0用例 | P1用例 | P2用例 | 合计 |
|
||||
|---------|---------|--------|--------|--------|------|
|
||||
| Q1 | 邮件配置保存+测试发送 | 2 | 1 | 0 | 3 |
|
||||
| Q2 | 对话下拉菜单按钮 | 2 | 2 | 0 | 4 |
|
||||
| Q3 | 技能列表显示已安装 | 1 | 1 | 0 | 2 |
|
||||
| Q4 | 应用市场安装卸载 | 2 | 1 | 0 | 3 |
|
||||
| Q5 | 技能选择框过滤 | 1 | 1 | 0 | 2 |
|
||||
| Q6 | 频道二维码地址 | 1 | 1 | 0 | 2 |
|
||||
| Q7 | Token时间/导出/充值 | 3 | 1 | 0 | 4 |
|
||||
| Q8 | 知识图谱拖拽点亮 | 2 | 0 | 0 | 2 |
|
||||
| Q9 | 聊天多选组合 | 4 | 0 | 0 | 4 |
|
||||
| Q10 | 资产去重分类 | 2 | 2 | 0 | 4 |
|
||||
| **合计** | | **20** | **10** | **0** | **30** |
|
||||
|
||||
---
|
||||
|
||||
> **文档状态**: 已完成
|
||||
> **创建日期**: 2026-06-01
|
||||
> **基于**: PRD v1.0 + 前后端代码功能分析
|
||||
Reference in new issue
Block a user