Files
qihuaiflow/tests/fix-verification-test-case-report.md
T
qyyfw 78ff261b5a 初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
2026-07-02 14:40:46 +08:00

702 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 测试用例 — 9项问题修复验证
## 1. 需求依据
- 来源:项目负责人下发的9项问题修复清单
- 修复范围:AI聊天窗口按钮、Agent部署列表、资产自动归集、聊天选择框、微信二维码URL、驾驶舱统计数据、管理员密码修改、邮件配置、日志风控数据
## 2. 代码功能模块概览
| 模块 | 说明 | 前端代码位置 | 后端代码位置 |
|------|------|-------------|-------------|
| 对话功能按钮 | 置顶/重命名/转知识图谱/归档/删除 | ChatPage.tsx:414-514, 639-660 | chat.py:122-169, 500-665 |
| Agent部署绑定 | 增值服务绑定Agent弹窗 | Services.tsx:496-541 | services.py:391-453 |
| 资产自动归集 | 知识库文档同步为资产 | KnowledgePage.tsx:412-505, AssetsPage.tsx:420-437 | knowledge.py:529-612, 781-799 |
| 聊天选择框 | 知识库/Agent/技能下拉 | ChatPage.tsx:331-356, 786-851 | chat.py:38-44 |
| 微信二维码URL | 二维码使用生产地址 | ChannelPage.tsx:391-477, 672-729 | channels.py:420-518, config.py:37-49 |
| 驾驶舱统计 | 仪表盘4项统计卡片 | Dashboard.tsx:21-98 | dashboard.py:18-96 |
| 管理员密码修改 | 密码修改表单与接口 | ProfilePage.tsx:365-448 | users.py:285-309, profile.py:132-156 |
| 邮件配置 | SMTP配置保存与测试 | SiteSettings.tsx:14-16, 97-137, 214-260 | settings.py:104-308 |
| 日志与风控 | 6个Tab日志查看 | Logs.tsx:51-694, Dashboard.tsx:128-194 | logs.py:35-810, dashboard.py:50-96 |
## 3. 需求与代码差异说明
### 3.1 需求中未在代码中体现的内容
无。9个问题对应的功能模块在前后端代码中均有完整实现。
### 3.2 PRD中未覆盖但代码中存在的功能模块
无。本次为问题修复验证,非PRD覆盖度审查,所有问题对应代码已确认。
## 4. 测试用例
---
### 4.1 问题1:AI聊天对话窗口功能按钮
#### TC-1-01 [P0] 验证对话置顶/取消置顶功能
- **前置条件**:用户已登录,存在至少2个对话,其中一个未置顶
- **涉及API**:`PUT /app/api/chat/conversations/{conv_id}` (pinned字段)
- **步骤**:
1. 进入AI聊天页面,在左侧对话列表找到目标对话
2. 点击对话右侧"更多"按钮(...),展开下拉菜单
3. 点击"置顶"选项
- **预期结果**:
- 该对话移动到列表最上方
- 对话标题旁显示置顶图标(图钉)
- 下拉菜单中"置顶"变为"取消置顶"
- 再次点击"取消置顶",对话恢复原位置,图钉图标消失
#### TC-1-02 [P0] 验证对话重命名功能
- **前置条件**:用户已登录,存在至少1个对话
- **涉及API**:`PUT /app/api/chat/conversations/{conv_id}` (title字段)
- **步骤**:
1. 在对话列表中点击某对话的"更多"按钮 → "重命名"
2. 在弹出的 prompt 输入框中输入新名称"测试对话-新名称"
3. 点击确定
- **预期结果**:
- 对话列表中该对话标题更新为新名称
- 无需刷新页面即可看到变化
#### TC-1-03 [P1] 验证重命名为空字符串
- **前置条件**:用户已登录,存在至少1个对话
- **涉及API**:`PUT /app/api/chat/conversations/{conv_id}`
- **步骤**:
1. 点击某对话的"重命名"
2. 在 prompt 输入框中不输入任何内容或输入空格
3. 点击确定
- **预期结果**:请求不发送(前端过滤空值),对话标题保持不变
#### TC-1-04 [P0] 验证对话转知识图谱功能
- **前置条件**:用户已登录,存在一个包含消息的对话
- **涉及API**:`POST /app/api/chat/conversations/{conv_id}/to-knowledge-graph`
- **步骤**:
1. 点击对话的"更多"按钮 → "转知识图谱"
2. 观察弹出的三步进度弹窗
3. 等待转换完成
- **预期结果**:
- 弹窗依次显示:步骤1"准备转换" → 步骤2"正在分析" → 步骤3"转换完成"
- 第三步显示生成的图节点数、边数、知识库名称
- 对话列表中该对话显示知识图谱转换次数标记
- 知识库列表中新增对应的知识库
#### TC-1-05 [P1] 验证转知识图谱失败场景
- **前置条件**:用户已登录,存在一个空对话(无消息)
- **涉及API**:`POST /app/api/chat/conversations/{conv_id}/to-knowledge-graph`
- **步骤**:
1. 点击空对话的"转知识图谱"
2. 等待弹窗流程
- **预期结果**:
- 弹窗显示错误信息(如"转换失败"或相应错误提示)
- 不生成知识库记录
#### TC-1-06 [P0] 验证对话归档功能
- **前置条件**:用户已登录,存在至少1个活跃状态对话
- **涉及API**:`PUT /app/api/chat/conversations/{conv_id}` (status字段)
- **步骤**:
1. 点击对话"更多"按钮 → "归档"
2. 观察对话列表变化
3. 切换到归档视图查看
- **预期结果**:
- 该对话从活跃列表中移除
- 下拉菜单中"归档"变为"取消归档"
- 可通过"取消归档"恢复对话到活跃列表
#### TC-1-07 [P0] 验证对话删除功能
- **前置条件**:用户已登录,存在至少1个对话
- **涉及API**:`DELETE /app/api/chat/conversations/{conv_id}`
- **步骤**:
1. 点击对话"更多"按钮 → "删除"
2. 在弹出的确认对话框中点击"确定"
3. 观察对话列表
- **预期结果**:
- 该对话从列表中消失
- 列表自动选中下一个对话(如有)
- 若删除的是最后一个对话,页面不选中任何对话
#### TC-1-08 [P1] 验证删除操作取消
- **前置条件**:用户已登录,存在至少1个对话
- **涉及API**:无(取消不发送API请求)
- **步骤**:
1. 点击对话"删除"
2. 在确认对话框中点击"取消"
- **预期结果**:对话保持原样,不发生任何变化
#### TC-1-09 [P2] 验证下拉菜单在点击对话区域外关闭
- **前置条件**:用户已登录,已展开某对话的下拉菜单
- **涉及API**:无
- **步骤**:
1. 点击某对话"更多"按钮展开下拉菜单
2. 点击对话列表其他区域
- **预期结果**:下拉菜单自动关闭
---
### 4.2 问题2:Agent部署时能找到开发文档和系统应用列表
#### TC-2-01 [P0] 验证Agent分配弹窗显示可用Agent列表
- **前置条件**:管理员已登录,市场中有已发布的Agent类型应用(status为published/active),存在"应用定制"类型的服务
- **涉及API**:`GET /app/api/admin/services/agents`
- **步骤**:
1. 进入管理后台 → 增值服务页面
2. 找到类型为"应用定制"的服务
3. 点击该服务行的"Agent"按钮
4. 观察弹出的Agent分配弹窗
- **预期结果**:
- 弹窗标题为"选择要绑定的Agent"
- 列表显示所有已发布的Agent应用
- 每个Agent显示:名称、描述、发布者
#### TC-2-02 [P1] 验证Agent列表为空时的提示
- **前置条件**:管理员已登录,市场中无已发布的Agent类型应用
- **涉及API**:`GET /app/api/admin/services/agents`
- **步骤**:
1. 进入增值服务页面
2. 对某"应用定制"服务点击"Agent"按钮
- **预期结果**:
- 弹窗中显示"暂无可用Agent"占位提示
- 不显示空白列表
#### TC-2-03 [P0] 验证Agent绑定成功
- **前置条件**:管理员已登录,存在可用Agent,目标服务未绑定Agent
- **涉及API**:`PUT /app/api/admin/services/{id}/agent`
- **步骤**:
1. 打开Agent分配弹窗
2. 点击某个Agent的"选择"按钮
3. 观察结果
- **预期结果**:
- Agent绑定成功,弹窗关闭
- 服务列表中该服务的Agent字段更新为绑定的Agent名称
#### TC-2-04 [P1] 验证非"应用定制"类型服务不显示Agent按钮
- **前置条件**:管理员已登录,存在系统内置类型服务
- **涉及API**:无
- **步骤**:
1. 进入增值服务页面
2. 查看系统内置类型服务的操作按钮
- **预期结果**:非"应用定制"(app_custom)类型服务不显示"Agent"按钮
---
### 4.3 问题3:资产页面知识库上传文件按分类自动归集
#### TC-3-01 [P0] 验证知识库上传文档自动归集到资产"文档"分类
- **前置条件**:用户已登录,已创建一个知识库
- **涉及API**:`POST /app/api/knowledge/bases/{base_id}/documents`
- **步骤**:
1. 进入知识库页面,选择一个知识库
2. 点击"上传文档",选择一个PDF文件(如 test.pdf)
3. 确认上传
4. 上传完成后,切换到资产页面
5. 在资产页面选择"文档"分类
- **预期结果**:
- 资产页面"文档"分类下显示刚上传的文件
- 文件显示名称、文件类型(PDF)、大小等信息
- 文件描述包含"知识库文档"标识
#### TC-3-02 [P0] 验证不同文件类型上传后正确归集
- **前置条件**:用户已登录,已创建知识库
- **涉及API**:`POST /app/api/knowledge/bases/{base_id}/documents`
- **步骤**:
1. 上传一个 Word 文档(.docx)
2. 上传一个 Excel 表格(.xlsx)
3. 切换到资产页面→文档分类
4. 分别使用子类型筛选 Word、Excel
- **预期结果**:
- 在"Word"子筛选下只显示 Word 文档
- 在"Excel"子筛选下只显示 Excel 文档
- "全部文件"下显示所有上传的文档
#### TC-3-03 [P1] 验证资产页面分类Tab切换功能正常
- **前置条件**:用户已登录,资产中有文档类型文件
- **涉及API**:`GET /app/api/assets` (category参数)
- **步骤**:
1. 进入资产页面
2. 依次点击"全部"→"文档"→"图片"→"视频"→"音频"→"小说"分类Tab
- **预期结果**:
- 每个Tab切换后显示对应分类的资产
- 文档分类下显示子类型筛选栏
- 非文档分类下不显示子类型筛选栏
#### TC-3-04 [P1] 验证上传同名文件不导致资产重复
- **前置条件**:用户已登录,已上传过文件 test.pdf
- **涉及API**:`POST /app/api/knowledge/bases/{base_id}/documents`
- **步骤**:
1. 再次上传同名文件 test.pdf
2. 查看资产页面文档分类
- **预期结果**:
- 两个文档分别创建独立的资产记录(不同ID)
- 两者均显示在资产列表中
#### TC-3-05 [P2] 验证空知识库上传后资产数量同步
- **前置条件**:用户已登录,新创建的知识库(无文档)
- **涉及API**:`POST /app/api/knowledge/bases/{base_id}/documents`
- **步骤**:
1. 记录当前资产页面文档数量
2. 上传一个新文档
3. 再次查看资产页面
- **预期结果**:资产页面文档数+1
---
### 4.4 问题4:AI聊天选择框可显示知识库文件和Agent/技能应用
#### TC-4-01 [P0] 验证聊天输入框知识库下拉显示
- **前置条件**:用户已登录,已创建至少1个知识库(含文档)
- **涉及API**:`GET /app/api/knowledge/bases`
- **步骤**:
1. 进入AI聊天页面
2. 查看输入框上方的附件按钮区
3. 点击"知识库"按钮
- **预期结果**:
- 下拉菜单标题显示"选择知识库"
- 列出所有知识库,每个显示名称和文档数量
- 文档数量格式如"3 文档"
#### TC-4-02 [P0] 验证Agent下拉显示
- **前置条件**:用户已登录,市场中有已发布的Agent应用
- **涉及API**:`GET /app/api/market/apps?type=agent`
- **步骤**:
1. 进入AI聊天页面
2. 点击输入框上方的"Agent"按钮
- **预期结果**:
- 下拉菜单标题显示"选择 Agent"
- 列出所有已发布的Agent应用,显示名称
#### TC-4-03 [P0] 验证技能下拉显示
- **前置条件**:用户已登录,市场中有已发布的技能应用
- **涉及API**:`GET /app/api/market/apps?type=skill`
- **步骤**:
1. 进入AI聊天页面
2. 点击输入框上方的"技能"按钮
- **预期结果**:
- 下拉菜单标题显示"选择技能"
- 列出所有技能,显示名称
#### TC-4-04 [P1] 验证知识库为空时的占位提示
- **前置条件**:用户已登录,用户下无知识库
- **涉及API**:`GET /app/api/knowledge/bases`
- **步骤**:
1. 进入AI聊天页面
2. 点击"知识库"下拉按钮
- **预期结果**:显示"暂无可用知识库"占位
#### TC-4-05 [P1] 验证Agent为空时的占位提示
- **前置条件**:用户已登录,市场无Agent类型应用
- **涉及API**:`GET /app/api/market/apps?type=agent`
- **步骤**:
1. 进入AI聊天页面
2. 点击"Agent"下拉按钮
- **预期结果**:显示"暂无可用 Agent"占位
#### TC-4-06 [P1] 验证技能为空时的占位提示
- **前置条件**:用户已登录,市场无技能类型应用
- **涉及API**:`GET /app/api/market/apps?type=skill`
- **步骤**:
1. 进入AI聊天页面
2. 点击"技能"下拉按钮
- **预期结果**:显示"暂无可用技能"占位
#### TC-4-07 [P2] 验证下拉菜单可正常关闭
- **前置条件**:用户已登录,已展开某个附件下拉
- **涉及API**:无
- **步骤**:
1. 点击"知识库"展开下拉
2. 再次点击"知识库"或点击页面其他区域
- **预期结果**:下拉菜单关闭
---
### 4.5 问题5:频道微信二维码生成真实生产地址(非localhost)
#### TC-5-01 [P0] 验证微信二维码URL使用生产地址
- **前置条件**:用户已登录,已配置微信频道(无需填写AppID/AppSecret)
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 进入频道管理页面
2. 选择微信平台
3. 点击"生成授权二维码"按钮
4. 查看API返回的 qr_url 内容
- **预期结果**:
- API返回的二维码数据中包含的URL以生产地址(APP_ACCESS_URL)开头
- URL格式为 `{生产地址}/#/channels/bind?token=xxx&platform=wechat`
- 二维码URL不是 `http://localhost:8080` 或 `http://127.0.0.1`
#### TC-5-02 [P0] 验证二维码正常渲染
- **前置条件**:用户已登录,已触发二维码生成
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 在频道页面点击"生成授权二维码"
2. 观察页面二维码区域
- **预期结果**:
- 页面显示清晰的二维码图片
- 二维码下方显示"请使用微信扫描二维码完成授权"
- 二维码生成过程中显示"正在生成授权二维码..."加载状态
#### TC-5-03 [P1] 验证未配置凭证时的二维码提示
- **前置条件**:用户已登录,未填写微信AppID和AppSecret
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 不填写AppID/AppSecret
2. 点击"生成授权二维码"
- **预期结果**:
- 成功生成本地模拟二维码
- 返回数据中 is_mock 为 true
- 提示消息说明这是模拟测试二维码
#### TC-5-04 [P1] 验证二维码过期处理
- **前置条件**:用户已登录,已生成二维码
- **涉及API**:`POST /app/api/channels/authorize/scan/status?platform=wechat`
- **步骤**:
1. 生成二维码后等待超过有效期(约5分钟)
2. 观察页面状态变化
- **预期结果**:页面显示"二维码已过期,请重新生成"提示
#### TC-5-05 [P2] 验证二维码生成失败时的错误提示
- **前置条件**:用户已登录
- **涉及API**:`POST /app/api/channels/authorize/scan?platform=wechat`
- **步骤**:
1. 模拟网络异常或后端返回错误
2. 点击生成二维码
- **预期结果**:
- 页面显示错误提示信息
- 不显示损坏的二维码图片
---
### 4.6 问题6:平台驾驶舱显示真实统计数据
#### TC-6-01 [P0] 验证仪表盘4项统计卡片显示真实数据
- **前置条件**:管理员已登录,数据库中存在活跃用户、启用模型、今日订单、今日Token记录
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入管理后台首页(驾驶舱)
2. 观察4个统计卡片
- **预期结果**:
- "用户总数"卡片显示数据库中status="active"的用户数(非0或硬编码值)
- "活跃模型数"卡片显示is_enabled=True的模型数
- "今日订单数"卡片显示今日创建的订单数
- "今日Token消耗"卡片显示今日Token消耗总数(≥10000时以"万"单位显示)
#### TC-6-02 [P0] 验证驾驶舱显示最近操作日志
- **前置条件**:管理员已登录,数据库中有操作日志记录
- **涉及API**:`GET /app/api/admin/dashboard/recent-logs`
- **步骤**:
1. 进入管理后台首页
2. 向下滚动到"最近操作日志"区域
- **预期结果**:
- 表格显示最近操作日志(最多10条)
- 每条显示:用户、操作、目标、详情、IP、时间
- 数据与数据库OperationLog表一致
#### TC-6-03 [P0] 验证驾驶舱显示最近审计日志
- **前置条件**:管理员已登录,数据库中有审计日志记录
- **涉及API**:`GET /app/api/admin/dashboard/recent-audit`
- **步骤**:
1. 进入管理后台首页
2. 向下滚动到"最近审计日志"区域
- **预期结果**:
- 表格显示最近审计日志(最多10条)
- 每条显示:操作人、操作类型、目标类型、详情、时间
- 数据与数据库AuditLog表一致
#### TC-6-04 [P1] 验证统计卡片值为0时的显示
- **前置条件**:管理员已登录,数据库中今日无订单、无Token消耗
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入管理后台首页
- **预期结果**:
- "今日订单数"显示"0"
- "今日Token消耗"显示"0"
- 不显示NaN、undefined、null等异常值
#### TC-6-05 [P1] 验证驾驶舱数据加载中状态
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入管理后台首页
2. 观察加载过程
- **预期结果**:
- 数据加载期间显示加载动画和"加载仪表盘数据..."文字
- 加载完成后数据正确渲染
#### TC-6-06 [P2] 验证统计卡片使用正确的数字格式
- **前置条件**:管理员已登录,用户数较大(如1000+)
- **涉及API**:`GET /app/api/admin/dashboard/stats`
- **步骤**:
1. 进入管理后台首页
- **预期结果**:
- "用户总数"使用千位分隔符(如"1,234")
- "今日Token消耗"≥10000时显示为"X.X万"格式
---
### 4.7 问题7:管理员密码修改功能
#### TC-7-01 [P0] 验证正常修改密码流程
- **前置条件**:用户已登录,知道当前密码
- **涉及API**:`PUT /app/api/profile/password`
- **步骤**:
1. 进入个人中心 → 安全设置
2. 在"修改密码"区域输入旧密码
3. 输入新密码(至少6位,如"NewPass123")
4. 在确认框中再次输入相同新密码
5. 点击"修改密码"按钮
- **预期结果**:
- 显示"密码修改成功"绿色提示
- 三个输入框被清空
- 可使用新密码重新登录
#### TC-7-02 [P1] 验证旧密码为空时的校验
- **前置条件**:用户已登录
- **涉及API**:无(前端拦截)
- **步骤**:
1. 进入安全设置
2. 不输入旧密码
3. 输入新密码和确认密码
4. 点击"修改密码"
- **预期结果**:
- 显示红色错误提示"请输入旧密码"
- 不发送API请求
- 页面保持当前状态
#### TC-7-03 [P1] 验证新密码长度不足6位的校验
- **前置条件**:用户已登录
- **涉及API**:无(前端拦截)
- **步骤**:
1. 输入正确的旧密码
2. 输入新密码"12345"(5位)
3. 点击"修改密码"
- **预期结果**:
- 显示红色错误提示"新密码长度至少为6位"
- 不发送API请求
#### TC-7-04 [P1] 验证两次新密码输入不一致的校验
- **前置条件**:用户已登录
- **涉及API**:无(前端拦截)
- **步骤**:
1. 输入正确的旧密码
2. 输入新密码"NewPass123"
3. 在确认框中输入"NewPass456"
4. 点击"修改密码"
- **预期结果**:
- 显示红色错误提示"两次输入的新密码不一致"
- 不发送API请求
#### TC-7-05 [P1] 验证旧密码错误的后端校验
- **前置条件**:用户已登录
- **涉及API**:`PUT /app/api/profile/password`
- **步骤**:
1. 输入错误的旧密码
2. 输入符合要求的新密码并确认
3. 点击"修改密码"
- **预期结果**:
- 显示错误提示"原密码错误"(来自后端返回)
- 密码未被修改
#### TC-7-06 [P2] 验证修改密码时按钮Loading状态
- **前置条件**:用户已登录
- **涉及API**:`PUT /app/api/profile/password`
- **步骤**:
1. 输入所有正确信息
2. 点击"修改密码"
3. 观察按钮状态
- **预期结果**:
- 按钮变为"修改中..."并禁用
- 请求完成后按钮恢复为"修改密码"
---
### 4.8 问题8:网站基础设置-邮件配置保存和测试
#### TC-8-01 [P0] 验证邮件配置保存功能
- **前置条件**:管理员已登录
- **涉及API**:`PUT /app/api/admin/settings/email`
- **步骤**:
1. 进入管理后台 → 网站基础设置
2. 滚动到"邮件配置"卡片
3. 填写SMTP服务器、端口、用户名、密码、发件地址
4. 点击"保存"按钮
- **预期结果**:
- 页面顶部显示绿色成功提示"邮件配置 保存成功"
- 提示在2秒后自动消失
- 刷新页面后配置仍然保留(从后端加载)
#### TC-8-02 [P0] 验证邮件配置回显
- **前置条件**:管理员已登录,之前已保存过邮件配置
- **涉及API**:`GET /app/api/admin/settings/email`
- **步骤**:
1. 进入网站基础设置页面
2. 查看邮件配置卡片的各字段
- **预期结果**:
- 各字段回显之前保存的值
- SMTP服务器、端口、用户名、发件地址等正确显示
- 密码字段可能脱敏或正确回显
#### TC-8-03 [P0] 验证发送测试邮件功能(有效配置)
- **前置条件**:管理员已登录,已保存有效SMTP配置
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 在邮件配置卡片点击"发送测试邮件"按钮
2. 等待结果
- **预期结果**:
- 显示测试结果提示(成功或失败消息)
- 提示在5秒后自动消失
- 成功时显示接收邮箱地址
#### TC-8-04 [P1] 验证未保存配置时发送测试邮件
- **前置条件**:管理员已登录,从未保存过邮件配置(或SMTP主机为空)
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 不填写任何邮件配置
2. 直接点击"发送测试邮件"
- **预期结果**:
- 显示错误提示"邮件配置未设置,请先保存邮件配置"
- 不尝试发送邮件
#### TC-8-05 [P1] 验证SMTP认证失败的错误处理
- **前置条件**:管理员已登录,保存了错误的SMTP用户名/密码
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 填写错误SMTP认证信息并保存
2. 点击"发送测试邮件"
- **预期结果**:
- 显示"SMTP认证失败,请检查用户名和密码"错误
#### TC-8-06 [P1] 验证SMTP连接失败的错误处理
- **前置条件**:管理员已登录,保存了不可达的SMTP服务器地址
- **涉及API**:`POST /app/api/admin/settings/email/test`
- **步骤**:
1. 填写不存在的SMTP服务器地址并保存
2. 点击"发送测试邮件"
- **预期结果**:
- 显示"无法连接到SMTP服务器 xxx:xxx"错误
#### TC-8-07 [P2] 验证TLS开关控制
- **前置条件**:管理员已登录
- **涉及API**:`PUT /app/api/admin/settings/email`, `POST /app/api/admin/settings/email/test`
- **步骤**:
1. 勾选/取消勾选TLS复选框
2. 保存配置
3. 检查TLS开关状态是否被保存
- **预期结果**:
- TLS开关状态正确保存
- 后端根据use_tls字段决定是否使用starttls
---
### 4.9 问题9:日志与风控显示真实审计/操作日志数据
#### TC-9-01 [P0] 验证操作日志Tab显示真实数据
- **前置条件**:管理员已登录,数据库OperationLog表中有记录
- **涉及API**:`GET /app/api/admin/logs/operations`
- **步骤**:
1. 进入管理后台 → 日志风控页面
2. 确认默认选中"操作日志"Tab
3. 查看表格数据
- **预期结果**:
- 表格显示操作日志记录
- 每条记录包含:用户名、操作(action)、目标(target)、详情、IP、时间
- 数据来源于数据库真实记录(非占位/模拟数据)
#### TC-9-02 [P0] 验证审计日志Tab显示真实数据
- **前置条件**:管理员已登录,数据库AuditLog表中有记录
- **涉及API**:`GET /app/api/admin/logs/audit-logs`
- **步骤**:
1. 进入日志风控页面
2. 切换到"审计日志"Tab
3. 查看表格数据
- **预期结果**:
- 表格显示审计日志记录
- 每条记录包含:管理员(admin_name)、操作(action)、目标类型(target_type)、详情、时间
- 数据来源于数据库真实记录
#### TC-9-03 [P0] 验证日志统计概览显示
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/logs/stats`
- **步骤**:
1. 进入日志风控页面
2. 查看页面顶部的统计概览
- **预期结果**:
- 显示今日API调用、错误数/错误率、活跃用户、Token消耗、操作日志数、慢请求数
- 数值从数据库实时计算(非硬编码)
#### TC-9-04 [P0] 验证6个Tab切换功能
- **前置条件**:管理员已登录
- **涉及API**:各Tab对应API
- **步骤**:
1. 依次点击"操作日志"→"Token日志"→"付费日志"→"审计日志"→"API统计"→"慢请求"
- **预期结果**:
- 每个Tab切换后显示对应的数据表格
- 表格列头与数据类型匹配
- 切换Tab时筛选条件重置
#### TC-9-05 [P1] 验证操作日志筛选功能
- **前置条件**:管理员已登录,数据库中有多条操作日志
- **涉及API**:`GET /app/api/admin/logs/operations?keyword=xxx&action=xxx`
- **步骤**:
1. 在操作日志Tab展开筛选条件
2. 输入关键词或选择操作类型
3. 点击查询
- **预期结果**:
- 列表按筛选条件过滤数据
- 分页信息更新
#### TC-9-06 [P1] 验证日志分页功能
- **前置条件**:管理员已登录,日志数据超过20条
- **涉及API**:各日志API(含page参数)
- **步骤**:
1. 查看日志列表
2. 点击"下一页"
- **预期结果**:
- 加载第二页数据
- 分页信息显示"共 X 条记录,第 2/Y 页"
#### TC-9-07 [P1] 验证驾驶舱中操作日志和审计日志数据一致性
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/dashboard/recent-logs`, `GET /app/api/admin/dashboard/recent-audit`, `GET /app/api/admin/logs/operations`, `GET /app/api/admin/logs/audit-logs`
- **步骤**:
1. 查看管理后台首页的"最近操作日志"
2. 切换到日志风控页面查看操作日志Tab
3. 对比数据
- **预期结果**:
- 首页最近操作日志与日志风控操作日志Tab中的前几条记录一致
- 首页最近审计日志与日志风控审计日志Tab中的前几条记录一致
#### TC-9-08 [P2] 验证操作日志随用户操作实时更新
- **前置条件**:管理员已登录
- **涉及API**:`GET /app/api/admin/logs/operations`
- **步骤**:
1. 查看当前操作日志列表
2. 在另一窗口执行某项操作(如修改配置)
3. 刷新日志页面
- **预期结果**:新产生的操作日志出现在列表中
#### TC-9-09 [P2] 验证日志不可删除
- **前置条件**:管理员已登录,日志页面有记录
- **涉及API**:无
- **步骤**:
1. 查看日志页面各Tab
2. 检查是否有删除按钮或删除操作入口
- **预期结果**:日志页面不提供删除日志的功能按钮
---
## 5. 测试用例统计
| 问题 | P0 | P1 | P2 | 合计 |
|------|----|----|----|----|
| 1. AI聊天对话功能按钮 | 4 | 3 | 1 | 8 |
| 2. Agent部署绑定 | 2 | 2 | 0 | 4 |
| 3. 资产自动归集 | 2 | 2 | 1 | 5 |
| 4. 聊天选择框 | 3 | 3 | 1 | 7 |
| 5. 微信二维码URL | 2 | 2 | 1 | 5 |
| 6. 驾驶舱统计数据 | 3 | 2 | 1 | 6 |
| 7. 管理员密码修改 | 1 | 4 | 1 | 6 |
| 8. 邮件配置 | 3 | 3 | 1 | 7 |
| 9. 日志与风控 | 4 | 3 | 2 | 9 |
| **合计** | **24** | **24** | **9** | **57** |
---
*报告生成时间:2026-06-01*
*生成方式:基于前后端代码分析,覆盖全部9个问题涉及的功能模块*