初始提交: Qihu-AIFlow v2.0.1 完整项目

- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
This commit is contained in:
qyyfw committed 2026-07-02 14:40:46 +08:00
commit 78ff261b5a
199 files changed
+69126

No files matched your search

@@ -0,0 +1,656 @@
# 测试用例 — 12项问题修复验证
## 1. 需求依据
- 来源:项目负责人下发的12项问题修复清单
- 重点验证方向:Agent/技能选择、频道二维码(非localhost)、知识库AI图谱、AI进化记录、资产文件分类+预览、邮件配置保存+测试
## 2. 代码功能模块概览
### 问题对应代码位置
| # | 问题 | 前端文件 | 后端文件 |
|---|------|---------|---------|
| 1 | Token驾驶舱时间不一致 | TokenDashboardPage.tsx:376-392 | token_usage.py:167 |
| 2 | 登录密码错误反馈 | LoginPage.tsx:59-103 | auth.py:38-49 |
| 3 | 平台驾驶舱+累计Token | Dashboard.tsx:79,101-127 | dashboard.py:38-42 |
| 4 | 广告图片上传/AI绘图 | Ads.tsx:141-188,353-417 | ads.py:182-311 |
| 5 | 模型类型映射+默认LLM | Models.tsx:156-195,313-353 | models.py:234-294,560-587 |
| 6 | 邮件配置保存+测试弹窗 | SiteSettings.tsx:128-185,358-428 | settings.py:104-374 |
| 7 | Agent/技能无法选择 | ChatPage.tsx:262-263,544-622 | chat.py:38-45,260-285 |
| 8 | 应用市场安装/卸载/搜索 | MarketPage.tsx:245-437,1249-1424 | market.py:44-125,300-393 |
| 9 | 知识库AI图谱LLM提取 | KnowledgePage.tsx:163-367,738-772 | knowledge.py:205-616 |
| 10 | 资产文档显示+在线预览 | AssetsPage.tsx:59-263,377-413 | knowledge.py:1067-1085 |
| 11 | AI进化对话未记录 | ChatPage.tsx:603-613 | chat.py:441-458, evolution_service.py:54-233 |
| 12 | 频道二维码生产地址 | ChannelPage.tsx:391-476 | channels.py:447-658, config.py:37-49 |
## 3. 需求与代码差异说明
### 3.1 代码中已实现但可能存在缺陷的功能
- **问题7(Agent/技能选择)**:选择逻辑存在,但仅为单选模式,且Agent后端无实际执行逻辑
- **问题11(AI进化记录)**:轨迹记录存在双向重复提交风险(前后端各自提交)
- **问题10(资产预览)**:知识库文档category="doc"不在VALID_ASSET_CATEGORIES中
### 3.2 PRD中未覆盖但代码已实现
无。本次为问题修复验证,所有问题均有对应代码实现。
---
## 4. 测试用例
---
### 4.1 问题1:Token驾驶舱消耗明细时间与系统时间不一致
#### TC-1-01 [P0] 验证Token消耗明细时间格式与系统时区一致
- **前置条件**:用户已登录,存在Token消耗记录
- **涉及API**:`GET /app/api/token/logs`
- **步骤**:
1. 进入Token驾驶舱页面(#/token)
2. 查看消耗明细列表中的时间列
3. 记录JS执行 `new Date().getHours()` 获取当前浏览器时间
4. 对比列表中最近一条消耗记录的时间小时数
- **预期结果**:
- 消耗明细时间的小时数与系统当前时间的小时数一致(允许秒级差异)
- 时间格式为 YYYY-MM-DD HH:mm
#### TC-1-02 [P1] 验证Token概览页面今日消耗统计的时间边界
- **前置条件**:用户已登录
- **涉及API**:`GET /app/api/token/overview`
- **步骤**:
1. 进入Token驾驶舱页面
2. 查看"今日消耗"数值
3. 通过API直接查询今日消耗并对比页面显示值
- **预期结果**:页面显示的今日消耗与API返回一致
#### TC-1-03 [P1] 验证API返回时间格式一致性
- **前置条件**:用户已登录,有Token记录
- **涉及API**:`GET /app/api/token/logs`
- **步骤**:
1. 调用API获取token logs
2. 检查返回的created_at字段格式
- **预期结果**:
- created_at格式为ISO 8601标准格式
- 同一页面的多个记录时间格式一致
---
### 4.2 问题2:登录界面修改密码后用旧密码登录反馈
#### TC-2-01 [P0] 验证旧密码登录返回"密码错误"而非通用错误
- **前置条件**:用户已修改密码
- **涉及API**:`POST /app/api/auth/login`
- **步骤**:
1. 在登录页面输入正确的用户名
2. 输入已失效的旧密码
3. 点击登录
- **预期结果**:
- 页面显示明确的"密码错误"提示
- 不显示"用户名不存在"或通用的"登录失败"
#### TC-2-02 [P0] 验证用户名不存在时显示正确提示
- **前置条件**:无
- **涉及API**:`POST /app/api/auth/login`
- **步骤**:
1. 输入不存在的用户名
2. 输入任意密码
3. 点击登录
- **预期结果**:
- 页面显示"用户名不存在"提示
- 不与"密码错误"混淆
#### TC-2-03 [P1] 验证修改密码后新密码立即生效
- **前置条件**:用户已登录(如admin/admin123)
- **涉及API**:`PUT /app/api/profile/password`, `POST /app/api/auth/login`
- **步骤**:
1. 修改密码为新密码
2. 退出登录
3. 用旧密码尝试登录
4. 用新密码登录
- **预期结果**:
- 旧密码登录失败,返回"密码错误"
- 新密码登录成功
#### TC-2-04 [P1] 验证前端错误提示区域可见且文案清晰
- **前置条件**:无
- **涉及API**:`POST /app/api/auth/login`
- **步骤**:
1. 输入错误凭据登录
2. 检查页面错误提示位置和文案
- **预期结果**:
- 错误提示在表单区域附近可见
- 文案明确区分"用户名不存在"与"密码错误"
---
### 4.3 问题3:平台驾驶舱+累计Token消耗统计
#### TC-3-01 [P0] 验证页面标题为"平台驾驶舱"
- **前置条件**:管理员已登录
- **涉及API**:无
- **步骤**:
1. 进入管理后台首页(#/admin)
2. 查看页面标题
- **预期结果**:页面标题显示为"平台驾驶舱"
#### TC-3-02 [P0] 验证累计Token消耗统计卡片存在
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入平台驾驶舱
2. 查看统计卡片区域
3. 确认包含以下统计项
- **预期结果**:
- 包含"累计总消耗"统计卡片
- 数值来源于数据库实时统计
- Token数值格式正确(大数以"万"为单位显示)
#### TC-3-03 [P1] 验证统计数据随使用更新
- **前置条件**:管理员已登录,记录当前累计Token值
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 记录当前累计Token消耗值
2. 在AI聊天中发送一条消息(产生Token消耗)
3. 刷新平台驾驶舱
4. 对比累计Token消耗值
- **预期结果**:
- 累计Token消耗值增加(或不变,取决于TokenUsageLog是否已写入)
- 如果是今日产生的消耗,今日Token也有相应变化
#### TC-3-04 [P1] 验证统计卡片包含所有必要维度
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入平台驾驶舱
2. 统计所有可见的统计卡片
- **预期结果**:至少包含以下统计维度:
- 用户总数
- 活跃模型数
- 今日订单数
- 今日Token消耗
- 累计总消耗
- 日均消耗(近30天)
---
### 4.4 问题4:广告位管理图片上传/替换+AI绘图
#### TC-4-01 [P0] 验证广告编辑中有图片上传按钮
- **前置条件**:管理员已登录
- **涉及API**:无
- **步骤**:
1. 进入管理后台 → 广告管理页面(#/admin/ads)
2. 点击编辑某个广告
3. 查找"背景图片"区域
- **预期结果**:
- 存在"上传图片"按钮
- 按钮可点击,触发文件选择
#### TC-4-02 [P0] 验证AI绘图按钮及功能
- **前置条件**:管理员已登录
- **涉及API**:`POST /app/api/admin/ads/generate-image?prompt=...`
- **步骤**:
1. 编辑广告,找到"AI绘图"按钮
2. 输入描述词(如"科技感蓝色广告图")
3. 点击AI绘图
4. 等待生成结果
- **预期结果**:
- 按钮可见且可点击
- 生成过程中显示加载状态
- 生成完成后显示预览图
#### TC-4-03 [P1] 验证图片上传功能完整流程
- **前置条件**:管理员已登录,准备测试图片文件
- **涉及API**:`POST /app/api/admin/ads/upload-image`
- **步骤**:
1. 编辑广告
2. 点击"上传图片"
3. 选择一张图片
4. 确认图片预览出现
5. 保存广告
- **预期结果**:
- 选择文件后显示图片预览
- 保存后广告使用新上传的图片
#### TC-4-04 [P1] 验证"清除图片"按钮
- **前置条件**:管理员已登录,广告已有背景图片
- **涉及API**:无
- **步骤**:
1. 编辑已有图片的广告
2. 点击"清除图片"按钮
- **预期结果**:
- 图片预览消失
- 保存后广告不再显示该图片
---
### 4.5 问题5:大模型库管理模型类型映射+全局默认LLM
#### TC-5-01 [P0] 验证非文本模型显示正确类型标签
- **前置条件**:管理员已登录,存在多模态模型(如GPT-4o包含vision)
- **涉及API**:`GET /app/api/admin/models/`
- **步骤**:
1. 进入管理后台 → 大模型库(#/admin/models)
2. 查看模型列表
3. 找到多模态模型(如支持vision、audio的模型)
- **预期结果**:
- 多模态模型显示对应的能力标签(如"视觉"、"语音")
- 纯文本模型仅显示"文本"标签
- 每个标签有对应的颜色标识
#### TC-5-02 [P0] 验证全局默认LLM设置入口
- **前置条件**:管理员已登录
- **涉及API**:`PUT /app/api/admin/models/{id}/set-default`
- **步骤**:
1. 进入大模型库页面
2. 找到"设置默认LLM"按钮或入口
3. 点击进入选择弹窗
- **预期结果**:
- 存在"设置默认LLM"功能入口
- 弹窗列出所有已启用的模型
- 可选择并确认设置默认模型
#### TC-5-03 [P1] 验证默认LLM设置后正确标记
- **前置条件**:管理员已登录
- **涉及API**:`PUT /app/api/admin/models/{id}/set-default`
- **步骤**:
1. 设置某个模型为默认LLM
2. 查看模型列表
3. 在AI聊天页面检查默认选中的模型
- **预期结果**:
- 模型列表中该模型显示"默认"标记
- AI聊天页面默认选中该模型
#### TC-5-04 [P1] 验证供应商模型列表获取功能
- **前置条件**:管理员已登录,存在模型供应商
- **涉及API**:`POST /app/api/admin/models/providers/{id}/fetch-models`
- **步骤**:
1. 进入大模型库
2. 选择某个供应商
3. 点击"获取模型列表"
- **预期结果**:
- 能够从供应商获取可用模型列表
- 每个模型显示名称和类型标签
---
### 4.6 问题6:邮件配置保存+测试弹窗
#### TC-6-01 [P0] 验证邮件配置保存功能
- **前置条件**:管理员已登录
- **涉及API**:`PUT /app/api/admin/settings/email`
- **步骤**:
1. 进入网站基础设置(#/admin/settings)
2. 填写SMTP服务器、端口、用户名、密码、发件地址
3. 点击"保存设置"
- **预期结果**:
- 显示保存成功提示
- 刷新页面后配置仍然存在(回显正确)
#### TC-6-02 [P0] 验证测试邮件弹窗输入收件箱
- **前置条件**:管理员已登录
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 在邮件配置区点击"发送测试邮件"
2. 观察弹出的测试邮件弹窗
- **预期结果**:
- 弹窗包含"收件邮箱"输入框(必填)
- 弹窗包含"邮件主题"输入框
- 弹窗包含"邮件内容"文本区
#### TC-6-03 [P0] 验证AI生成测试内容功能
- **前置条件**:管理员已登录,已打开测试邮件弹窗
- **涉及API**:`POST /app/api/admin/settings/email/generate-content`
- **步骤**:
1. 在测试邮件弹窗中点击"AI生成测试内容"
2. 等待生成结果
- **预期结果**:
- 邮件主题自动填充AI生成的内容
- 邮件正文自动填充AI生成的内容
- 内容为中文,适合测试用途
#### TC-6-04 [P1] 验证未配置时发送测试邮件的错误提示
- **前置条件**:管理员已登录,SMTP配置为空
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 清空邮件配置并保存
2. 打开测试邮件弹窗
3. 输入收件地址点击发送
- **预期结果**:
- 显示"邮件配置未设置,请先保存邮件配置"错误提示
#### TC-6-05 [P1] 验证SMTP认证失败的错误提示
- **前置条件**:管理员已登录
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 填写错误的SMTP密码
2. 保存配置
3. 发送测试邮件
- **预期结果**:显示"SMTP认证失败,请检查用户名和密码"
---
### 4.7 问题7:AI聊天Agent/技能无法选择
#### TC-7-01 [P0] 验证点击Agent下拉中的项目可选中
- **前置条件**:用户已登录,市场中有已发布Agent
- **涉及API**:无(前端交互)
- **步骤**:
1. 进入AI聊天页面(#/chat)
2. 点击输入框上方的"Agent"下拉按钮
3. 点击某个Agent
4. 观察Agent下拉按钮状态变化
- **预期结果**:
- 选中的Agent在列表中高亮/标记
- Agent按钮显示已选中状态(如高亮或显示选中数量)
#### TC-7-02 [P0] 验证点击技能下拉中的项目可选中
- **前置条件**:用户已登录,市场中有已发布技能
- **涉及API**:无(前端交互)
- **步骤**:
1. 在AI聊天页面点击"技能"下拉按钮
2. 点击某个技能
3. 观察状态变化
- **预期结果**:
- 选中的技能在列表中高亮/标记
- 技能按钮显示已选中状态
#### TC-7-03 [P0] 验证发送消息时Agent/技能参数传递
- **前置条件**:用户已登录,已选中Agent和技能
- **涉及API**:`POST /app/api/chat/conversations/{id}/messages`
- **步骤**:
1. 选中一个Agent和一个技能
2. 输入消息并发送
3. 检查发送API请求体中的agent_ids和skill_ids参数
- **预期结果**:
- 请求体包含选中的agent_ids(数组)
- 请求体包含选中的skill_ids(数组)
#### TC-7-04 [P1] 验证取消选中Agent/技能
- **前置条件**:用户已登录,已选中Agent
- **涉及API**:无
- **步骤**:
1. 点击已选中的Agent(再次点击)
2. 观察状态变化
- **预期结果**:Agent取消选中,按钮恢复默认状态
#### TC-7-05 [P1] 验证Agent/技能无数据时的占位提示
- **前置条件**:市场中无Agent或技能类型应用
- **涉及API**:`GET /app/api/market/apps?type=agent`, `GET /app/api/market/apps?type=skill`
- **步骤**:
1. 在聊天页面点击Agent下拉
- **预期结果**:显示"暂无可用 Agent"
---
### 4.8 问题8:应用市场安装/卸载状态bug+搜索
#### TC-8-01 [P0] 验证应用安装功能
- **前置条件**:用户已登录,应用市场中存在未安装应用
- **涉及API**:`POST /app/api/market/apps/{id}/install`
- **步骤**:
1. 进入应用市场(#/market)
2. 点击某个未安装的应用
3. 点击"安装"按钮
- **预期结果**:
- 安装成功后,按钮变为"已安装"或"卸载"
- 应用列表中该应用状态更新
#### TC-8-02 [P0] 验证重复安装检测
- **前置条件**:用户已安装某个应用
- **涉及API**:`POST /app/api/market/apps/{id}/install`
- **步骤**:
1. 找到已安装的应用
2. 尝试再次点击"安装"按钮
- **预期结果**:
- 前端阻止重复安装请求
- 或后端返回"应用已安装"错误提示
#### TC-8-03 [P0] 验证应用卸载功能
- **前置条件**:用户已安装某个应用
- **涉及API**:`DELETE /app/api/market/apps/{id}/uninstall`
- **步骤**:
1. 找到已安装的应用
2. 点击"卸载"按钮
3. 确认卸载
- **预期结果**:
- 卸载成功后,按钮变为"安装"
- 应用列表中该应用状态更新
#### TC-8-04 [P0] 验证搜索功能
- **前置条件**:用户已登录,市场中有多个应用
- **涉及API**:`GET /app/api/market/apps?keyword=xxx`
- **步骤**:
1. 在应用市场搜索框中输入关键词
2. 观察搜索结果
- **预期结果**:
- 搜索结果仅显示匹配的应用
- 清除搜索后恢复全部应用
#### TC-8-05 [P1] 验证安装/卸载后状态持久化
- **前置条件**:用户已安装某应用
- **涉及API**:无
- **步骤**:
1. 安装一个应用
2. 刷新页面
3. 检查该应用状态
- **预期结果**:
- 刷新后应用仍显示"已安装"状态
---
### 4.9 问题9:知识库构建知识图谱LLM驱动
#### TC-9-01 [P0] 验证知识图谱构建功能可触发
- **前置条件**:用户已登录,创建了知识库并上传了文档
- **涉及API**:`POST /app/api/knowledge/bases/{id}/build-graph`
- **步骤**:
1. 进入知识库页面(#/knowledge)
2. 选择知识库,上传一个文本内容丰富的文档
3. 点击"构建知识图谱"按钮
- **预期结果**:
- 构建过程开始(可能显示进度/加载状态)
- 构建完成后显示成功提示
#### TC-9-02 [P0] 验证知识图谱包含实体和关系
- **前置条件**:知识图谱已构建完成
- **涉及API**:`GET /app/api/knowledge/bases/{id}/graph`
- **步骤**:
1. 构建完成后查看知识图谱
2. 检查图谱节点和边
- **预期结果**:
- 图谱包含多个节点(实体/概念/属性)
- 图谱包含节点间的关系/边
- 节点类型包含entity/concept/attribute等分类
#### TC-9-03 [P1] 验证LLM提取的实体丰富性
- **前置条件**:知识库中有含命名实体的文档
- **涉及API**:`GET /app/api/knowledge/bases/{id}/graph`
- **步骤**:
1. 上传包含人物、组织、地点的文档
2. 构建知识图谱
3. 查看提取的节点
- **预期结果**:
- 节点包含文档中的人物、组织、地点等实体
- 每个节点有描述信息
- 关系有具体的关系类型(而非全为"关联")
#### TC-9-04 [P1] 验证图谱可视化渲染
- **前置条件**:知识图谱已构建
- **涉及API**:无(前端渲染)
- **步骤**:
1. 在知识库页面查看知识图谱可视化
- **预期结果**:
- 图谱以可视化方式展示(非纯文本/表格)
- 节点颜色按类型区分
- 支持交互(如拖拽/缩放/点击)
---
### 4.10 问题10:资产知识库文档显示+在线预览
#### TC-10-01 [P0] 验证知识库文档在资产"文件"分类下可见
- **前置条件**:用户已登录,已在知识库中上传文档
- **涉及API**:`GET /app/api/knowledge/bases` + `GET /app/api/knowledge/bases/{id}/documents`
- **步骤**:
1. 进入资产页面(#/assets)
2. 切换到"文件"分类Tab
3. 查看文档列表
- **预期结果**:
- 列表中包含知识库上传的文档
- 文档显示正确的文件名和类型标签
#### TC-10-02 [P0] 验证文档子类型筛选功能
- **前置条件**:资产中有不同类型文件
- **涉及API**:无(前端筛选)
- **步骤**:
1. 在文件分类下点击"知识库"子筛选
2. 观察列表变化
- **预期结果**:仅显示来自知识库的文档,其他来源文件被过滤
#### TC-10-03 [P0] 验证文档在线预览功能
- **前置条件**:资产中有文本类型文档
- **涉及API**:无
- **步骤**:
1. 在资产列表中点击某文档
2. 检查是否出现预览弹窗
3. 查看预览内容
- **预期结果**:
- 弹窗显示文档内容预览
- 文本文件可直接查看内容
- 预览弹窗有关闭按钮
#### TC-10-04 [P1] 验证不同文件类型的预览表现
- **前置条件**:资产中有PDF、Word等类型文档
- **涉及API**:无
- **步骤**:
1. 分别点击PDF、Word、TXT等类型文档
2. 观察预览弹窗表现
- **预期结果**:
- 每种类型都有合适的预览方式(文本内容或提示)
- 不支持在线预览的类型给出明确提示
#### TC-10-05 [P1] 验证知识库文档去重显示
- **前置条件**:同一文件在多个知识库中
- **涉及API**:无
- **步骤**:
1. 查看资产列表
2. 检查是否有重复文档
- **预期结果**:同一文档不重复显示
---
### 4.11 问题11:AI进化对话未记录
#### TC-11-01 [P0] 验证对话产生后生成进化轨迹记录
- **前置条件**:用户已登录,已通过 #/evolution 页面进入过AI进化
- **涉及API**:`POST /app/api/chat/conversations/{id}/messages`
- **步骤**:
1. 进入AI聊天页面
2. 发送一条消息并等待AI回复
3. 进入AI进化页面(#/evolution)
4. 查看进化事件/轨迹列表
- **预期结果**:
- 有新产生的对话轨迹记录
- 记录包含对话ID和时间信息
#### TC-11-02 [P0] 验证AI进化页面时间线事件显示
- **前置条件**:用户已登录,已有进化轨迹
- **涉及API**:`GET /app/api/evolution/events`
- **步骤**:
1. 进入AI进化页面
2. 查看时间线/事件列表
- **预期结果**:
- 显示对话相关的进化事件
- 事件类型包括"对话"或"discovered"
- 每条事件有时间戳
#### TC-11-03 [P1] 验证Pipeline处理轨迹
- **前置条件**:用户已登录,已触发进化管道
- **涉及API**:`POST /app/api/evolution/pipeline/trigger`
- **步骤**:
1. 在AI进化页面触发管道
2. 检查轨迹状态是否从"discovered"进入下一阶段
- **预期结果**:
- 管道启动后有状态变化
- 管道结束后技能树更新
#### TC-11-04 [P1] 验证进化仪表盘统计更新
- **前置条件**:用户已登录,管道已处理
- **涉及API**:`GET /app/api/evolution/dashboard`
- **步骤**:
1. 查看进化仪表盘
2. 检查技能数量、轨迹数量等统计
- **预期结果**:
- 统计数据与实际使用情况一致
- 技能数量在管道处理后可能增加
---
### 4.12 问题12:频道微信二维码显示生产地址
#### TC-12-01 [P0] 验证二维码URL使用生产地址非localhost
- **前置条件**:用户已登录,打开了微信频道
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 进入频道管理页面(#/channels)
2. 选择微信平台
3. 点击生成二维码
4. 检查API返回的qr_url或bind_url值
- **预期结果**:
- URL以生产地址开头(如https://bot.qihuyun.com)
- URL不包含localhost、127.0.0.1
- URL格式为 `{生产地址}/#/channels/bind?token=...&platform=wechat`
#### TC-12-02 [P0] 验证二维码页面正常渲染
- **前置条件**:用户已生成二维码
- **涉及API**:无(前端渲染)
- **步骤**:
1. 生成二维码后观察页面
- **预期结果**:
- 二维码图片清晰可见
- 页面下方显示操作提示文字
- 不显示localhost相关字样
#### TC-12-03 [P1] 验证无凭证时二维码的提示信息
- **前置条件**:未配置微信AppID/AppSecret
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 不填写凭证生成二维码
2. 检查提示信息
- **预期结果**:
- 返回的is_mock为true但qr_url仍为生产地址
- 提示信息说明这是模拟版本
#### TC-12-04 [P1] 验证扫描状态轮询正常
- **前置条件**:已生成二维码
- **涉及API**:`POST /app/api/channels/authorize/scan/status?platform=wechat`
- **步骤**:
1. 生成二维码后观察状态轮询
- **预期结果**:
- 定时查询扫描状态
- 状态正常更新(waiting/scanned/authorized/expired)
---
## 5. 测试用例统计
| 问题 | P0 | P1 | 合计 |
|------|----|----|----|
| 1. Token时间一致性 | 1 | 2 | 3 |
| 2. 登录密码错误反馈 | 2 | 2 | 4 |
| 3. 平台驾驶舱+累计Token | 2 | 2 | 4 |
| 4. 广告图片上传/AI绘图 | 2 | 2 | 4 |
| 5. 模型类型+默认LLM | 2 | 2 | 4 |
| 6. 邮件配置+测试弹窗 | 3 | 2 | 5 |
| 7. Agent/技能选择 | 3 | 2 | 5 |
| 8. 应用市场安装/卸载/搜索 | 4 | 1 | 5 |
| 9. 知识库AI图谱 | 2 | 2 | 4 |
| 10. 资产文档+预览 | 3 | 2 | 5 |
| 11. AI进化对话记录 | 2 | 2 | 4 |
| 12. 频道二维码生产地址 | 2 | 2 | 4 |
| **合计** | **28** | **23** | **51** |
---
*报告生成时间:2026-06-01*
*生成方式:基于前后端代码深度分析,覆盖全部12个问题涉及的功能模块*