- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
702 lines
28 KiB
Markdown
702 lines
28 KiB
Markdown
# 测试用例 — 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个问题涉及的功能模块*
|