| 模块 | 页面 | 路由 | 优先级 |
|---|---|---|---|
| 登录认证 | 管理员登录 | /login |
P0 |
| 仪表盘 | 数据概览 | /dashboard |
P0 |
| 用户管理 | 用户列表与操作 | /users |
P0 |
| 订单管理 | 订单查询与筛选 | /orders |
P1 |
| 佣金管理 | 佣金明细与统计 | /commissions |
P1 |
| 提现管理 | 提现审核处理 | /withdraw |
P1 |
| 系统配置 | 定价与佣金参数编辑 | /settings |
P0 |
| 分析记录 | 命盘数据查看 | /charts |
P2 |
num-server)admin/)| 字段 | 内容 |
|---|---|
| 前置 | 管理后台未登录,访问 /login |
| 步骤 | 1. 输入有效用户名 admin2. 输入有效密码 admin1233. 点击「登录」按钮 |
| 预期 | ① 按钮显示 loading 状态 ② 请求 POST /api/admin/login 返回 code=0③ 弹出「登录成功」提示 ④ 自动跳转至 /dashboard⑤ localStorage 中存入 admin_token |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 未登录状态,访问 /login |
| 步骤 | 1. 输入用户名 admin2. 输入错误密码 wrongpass3. 点击「登录」 |
| 预期 | ① 请求返回 code=1001 "Invalid admin credentials" ② 页面停留在登录页,不跳转 ③ 弹出错误提示 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 未登录 |
| 步骤 | 1. 输入不存在的用户名 hacker2. 输入任意密码 3. 点击「登录」 |
| 预期 | 同 TC-LOGIN-002,返回 code=1001,停留在登录页 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 未登录 |
| 步骤 | 1. 用户名和密码均为空 2. 点击「登录」 |
| 预期 | ① 表单校验阻止提交 ② 用户名和密码输入框下方显示「请输入用户名」「请输入密码」提示 ③ 不发出 API 请求 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 未登录 |
| 步骤 | 1. 输入用户名 admin,密码为空2. 点击「登录」 |
| 预期 | 表单校验阻止提交,密码框提示「请输入密码」,不发出 API 请求 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 未登录 |
| 步骤 | 1. 输入密码 2. 点击密码框右侧的「眼睛」图标切换可见性 |
| 预期 | ① 密码明文/密文可正确切换 ② 按钮图标同步变化 |
| 优先级 | P2 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录(localStorage 有有效 token) |
| 步骤 | 1. 浏览器地址栏直接输入 /login2. 回车访问 |
| 预期 | 路由守卫检测到已登录,自动重定向至 /dashboard |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,数据库中存在用户/订单/佣金数据 |
| 步骤 | 1. 登录后自动跳转至 /dashboard2. 观察页面内容 |
| 预期 | ① 请求 POST /api/admin/stats 返回 code=0② 4个统计卡片显示正确数值(总用户数、VIP用户、订单总数、总收入) ③ 月新增用户折线图渲染(ECharts) ④ 订单状态分布饼图渲染 ⑤ 最近订单表格显示最近10条订单记录 ⑥ 表格含订单号、金额(¥格式化)、状态标签、创建时间列 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库为空(无用户/订单) |
| 步骤 | 同 TC-DASH-001 |
| 预期 | ① 统计卡片显示为 - 或 0② 图表渲染空白状态 ③ 订单表格显示「暂无数据」 ④ 页面不报错 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,后端服务异常或网络断开 |
| 步骤 | 1. 访问 /dashboard |
| 预期 | ① 页面显示 loading 后停止 ② 弹出错误提示「网络错误」或后端返回的错误信息 ③ 页面不崩溃,表格和图表区域保持空白 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中有订单:totalFee 分别为 100(¥1.00)、131400(¥1,314.00)、0 |
| 步骤 | 1. 访问 /dashboard2. 查看总收入卡片 |
| 预期 | 总收入显示为 ¥1,315.00(分转元,两位小数) |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,数据库中有 ≥3 个用户(含普通用户、VIP用户、管理员) |
| 步骤 | 1. 点击左侧菜单「用户管理」 2. 观察页面 |
| 预期 | ① 请求 POST /api/admin/users 返回 code=0② 表格显示所有用户 ③ 每行包含:ID、头像、昵称、手机号、推广码、VIP标签、注册时间 ④ VIP用户标签为绿色「是」,非VIP为灰色「否」 ⑤ 分页组件显示总条数 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 用户列表已加载,存在昵称含"张三"、手机号含"138"的用户 |
| 步骤 | 1. 在搜索框输入 张三2. 观察表格筛选结果 3. 清空搜索框 4. 输入 138 |
| 预期 | ① 输入「张三」→ 表格仅显示昵称包含「张三」的用户 ② 清空搜索 → 恢复显示全部用户 ③ 输入「138」→ 表格仅显示手机号包含「138」的用户 ④ 搜索无匹配时显示「暂无数据」 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 用户 A 的 VIP 已过期(vipEndTime < now) |
| 步骤 | 1. 找到用户 A 2. 点击「升级VIP」按钮 |
| 预期 | ① 请求 POST /api/admin/user/upgrade 带 {userId: A.id}② 返回 code=0 ③ 弹出「已升级VIP」成功提示 ④ 表格自动刷新,用户A的VIP标签变为绿色「是」 ⑤ 升级VIP按钮变为 disabled 状态 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 用户 B 是 VIP(vipEndTime > now) |
| 步骤 | 1. 找到用户 B 2. 观察「升级VIP」按钮 |
| 预期 | 「升级VIP」按钮为 disabled 状态,hover 提示或置灰不可点击 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 用户 C 非管理员(isAdmin=false) |
| 步骤 | 1. 找到用户 C 2. 点击「设为管理」按钮 |
| 预期 | ① 请求 POST /api/admin/user/set-admin 带 {userId: C.id, isAdmin: true}② 返回 code=0 ③ 弹出「已设为管理员」成功提示 ④ 表格刷新,按钮文字变为「取消管理」 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 用户 D 是管理员(isAdmin=true) |
| 步骤 | 1. 找到用户 D 2. 点击「取消管理」按钮 |
| 预期 | ① 请求带 {userId: D.id, isAdmin: false}② 返回 code=0 ③ 弹出「已取消管理权限」 ④ 按钮文字变为「设为管理」 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 手动构造请求或通过接口测试 |
| 步骤 | 直接调用 API POST /api/admin/user/upgrade 带不存在的 userId |
| 预期 | 返回 code=1002 "User not found" |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中有 >20 个用户 |
| 步骤 | 1. 访问用户管理 2. 点击第2页 |
| 预期 | ① 分页组件跳转至第2页 ② 表格显示第21-40条数据 ③ URL 不变(前端分页) |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,数据库中有多种状态的订单 |
| 步骤 | 1. 点击左侧菜单「订单管理」 |
| 预期 | ① 请求 POST /api/admin/orders 返回 code=0② 表格显示所有订单 ③ 每行包含:ID、订单号、用户ID、金额(¥x.xx)、状态标签、支付方式、创建时间、支付时间 ④ 已支付订单标签为绿色,待支付为黄色 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 订单列表已加载 |
| 步骤 | 1. 在状态筛选下拉选择「已支付」 2. 观察表格 3. 切换为「待支付」 4. 选择「全部」 |
| 预期 | ① 选「已支付」→ 仅显示 status=paid 的订单 ② 选「待支付」→ 仅显示 status=pending 的订单 ③ 选「全部」→ 恢复显示全部订单 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 订单 totalFee=500(5.00元) |
| 步骤 | 查看金额列 |
| 预期 | 显示 5.00元,两位小数,保留分精度 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中无订单 |
| 步骤 | 访问订单管理 |
| 预期 | 表格显示「暂无数据」,筛选下拉可用,不报错 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中有多条佣金记录(含已结算和待结算) |
| 步骤 | 1. 点击左侧菜单「佣金管理」 |
| 预期 | ① 请求 POST /api/admin/commissions 返回 code=0② 顶部3个统计卡片显示正确数值:「已结算佣金」(绿色)、「待结算佣金」(黄色)、「总佣金」 ③ 金额格式为 ¥x.xx(两位小数) ④ 下方表格显示佣金明细:ID、订单ID、来源用户、获得用户、级别(L1/L2)、金额、状态、时间 ⑤ 已结算标签为绿色「已结算」,待结算为灰色「待结算」 |
| 优先级 | P0 |
| 字段 | 内容 |
|---|---|
| 前置 | 有 >20 条佣金记录 |
| 步骤 | 翻页操作 |
| 预期 | 分页组件工作正常,每页20条 |
| 优先级 | P2 |
| 字段 | 内容 |
|---|---|
| 前置 | 有3条已结算各100元、2条待结算各50元 |
| 步骤 | 核对统计数字 |
| 预期 | 已结算=¥300.00、待结算=¥100.00、总佣金=¥400.00 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中无佣金记录 |
| 步骤 | 访问佣金管理 |
| 预期 | 统计卡片均显示 ¥0.00,表格显示「暂无数据」 |
| 优先级 | P1 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中有多种状态的提现记录(待审核、已通过、已拒绝) |
| 步骤 | 1. 点击左侧菜单「提现管理」 |
| 预期 | ① 请求 POST /api/admin/withdraws 返回 code=0② 表格显示 ID、用户ID、金额(¥x.xx)、状态标签、创建时间 ③ 待审核=黄、已通过=绿、已拒绝=红 |
| 字段 | 内容 |
|---|---|
| 前置 | 存在一条「待审核」提现记录 |
| 步骤 | 1. 找到待审核记录 2. 点击「通过」按钮 |
| 预期 | ① 请求 POST /api/admin/withdraw/approve 带 {id: row.id}② 返回 code=0 ③ 弹出「提现已通过」成功提示 ④ 表格自动刷新,状态变为绿色「已通过」 ⑤ 通过和拒绝按钮消失 |
| 字段 | 内容 |
|---|---|
| 前置 | 存在一条「待审核」提现记录 |
| 步骤 | 1. 点击「拒绝」按钮 |
| 预期 | ① 请求 POST /api/admin/withdraw/reject 带 {id: row.id}② 返回 code=0 ③ 弹出「已拒绝该提现」 ④ 表格刷新,状态变为红色「已拒绝」 |
| 字段 | 内容 |
|---|---|
| 前置 | 存在「已通过」「已拒绝」的提现记录 |
| 步骤 | 观察操作列 |
| 预期 | 已审核的提现记录操作列不显示「通过」「拒绝」按钮 |
| 字段 | 内容 |
|---|---|
| 前置 | 提现列表已加载 |
| 步骤 | 1. 点击「刷新」按钮 |
| 预期 | ① 表格重新加载 ② 显示 loading 状态 |
| 字段 | 内容 |
|---|---|
| 前置 | 通过/拒绝 API 返回非0 code |
| 步骤 | 模拟服务端拒绝(如重复审核) |
| 预期 | ① 弹出错误提示「操作失败」 ② 页面状态不发生错误变更 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,数据库 sys_config 表有配置数据 |
| 步骤 | 1. 点击左侧菜单「系统配置」 |
| 预期 | ① 请求 POST /api/admin/config/list 返回 code=0② 页面显示 6 个配置卡片组: - 定价配置(能量师种子价/标准价/种子价上限/C端年费) - B端佣金配置(L1能量师推荐/L1 C端推荐/L2) - C端佣金配置(直接佣金比例/上级佣金比例) - 人工方案配置(平台佣金率/分销占比/最低价/最高价/最大协商轮次) - 配额配置(每日AI解读/AI问答/分享次数) - 其他参数(推广码前缀/咨询最短间隔) ③ 每个字段显示当前值并可编辑 |
| 字段 | 内容 |
|---|---|
| 前置 | 配置加载完毕 |
| 步骤 | 1. 修改能量师种子价从 1314 改为 1500 2. 点击「保存全部配置」 |
| 预期 | ① 请求 POST /api/admin/config/update 携带所有配置键值对② 返回 code=0 ③ 弹出「配置已保存,已实时生效」 ④ 刷新页面后,修改值保持为 1500 |
| 字段 | 内容 |
|---|---|
| 前置 | 配置加载完毕 |
| 步骤 | 1. 尝试输入负数到「能量师种子价」 2. 尝试输入 >100 到「直接佣金比例」 3. 尝试输入小数到整数配置项 |
| 预期 | ① el-input-number 阻止非法输入(min/max限制生效) ② 比例字段 max=100,不能超过 ③ 整数字段不接受小数 |
| 字段 | 内容 |
|---|---|
| 前置 | 某个配置项的值已被修改 |
| 步骤 | 1. 点击「定价配置」卡片右上角的「恢复初始值」 |
| 预期 | ① 请求 POST /api/admin/config/reset 针对配置键② 返回 code=0 ③ 该卡片内所有字段恢复为初始默认值 ④ 字段值刷新 |
| 字段 | 内容 |
|---|---|
| 前置 | 定价配置和佣金配置已加载 |
| 步骤 | 修改能量师种子价或L1佣金值 |
| 预期 | ① 修改种子价时,下方佣金比例提示实时更新 ② 修改佣金值时,百分比提示实时更新 ③ 计算公式正确(如 L1/种子价 = x%) |
| 字段 | 内容 |
|---|---|
| 前置 | 配置已加载 |
| 步骤 | 1. 修改配置 2. 服务器返回错误 |
| 预期 | ① 保存按钮结束 loading ② 弹出错误提示 ③ 页面保持修改后的值,不自动回滚 |
| 字段 | 内容 |
|---|---|
| 前置 | 配置加载完毕 |
| 步骤 | 尝试通过手动构造将某个必填配置置空后保存 |
| 预期 | 后端应校验非空或保存默认值,配置不丢失 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库中有多条命盘记录 |
| 步骤 | 1. 点击左侧菜单「分析记录」 |
| 预期 | ① 请求 POST /api/admin/charts 返回 code=0② 表格显示 ID、用户ID、手机号、姓名、已解读标签、创建时间 ③ 已解读(difyResponse 不为空)标签为绿色「是」,否则为灰色「否」 |
| 字段 | 内容 |
|---|---|
| 前置 | 有一条包含 chartData 和 difyResponse 的记录 |
| 步骤 | 1. 点击某条记录的「查看」按钮 |
| 预期 | ① 弹出详情弹窗 ② 弹窗显示手机号、姓名、生日、创建时间的描述列表 ③ 下方显示「图表数据」区域,格式化的 JSON 数据 ④ 下方显示「AI 解读」区域,展示解读文本 |
| 字段 | 内容 |
|---|---|
| 前置 | 有一条有 chartData 但无 difyResponse 的记录 |
| 步骤 | 点击「查看」 |
| 预期 | 弹窗显示图表数据,AI 解读区域不显示或显示为空 |
| 字段 | 内容 |
|---|---|
| 前置 | 有一条 chartData 为空的记录 |
| 步骤 | 点击「查看」 |
| 预期 | 弹窗不显示图表数据区域,AI 解读区域按需显示 |
| 字段 | 内容 |
|---|---|
| 前置 | 有 >20 条记录 |
| 步骤 | 翻页操作 |
| 预期 | 分页组件工作正常 |
| 字段 | 内容 |
|---|---|
| 前置 | 清除 localStorage,未登录状态 |
| 步骤 | 1. 直接访问 /dashboard、/users、/orders 等受保护路由 |
| 预期 | 路由守卫自动重定向至 /login,且不显示目标页面内容 |
| 字段 | 内容 |
|---|---|
| 前置 | localStorage 中存储过期或无效 token |
| 步骤 | 1. 刷新页面 2. 访问任意受保护页面 |
| 预期 | ① 请求 API 返回 code=1001 ② 自动清除 localStorage 中的 token ③ 页面跳转至 /login④ 弹出错误提示(如 Token invalid) |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录状态 |
| 步骤 | 1. 点击右上角用户头像/退出按钮(如有) |
| 预期 | ① localStorage 中 token 被清除 ② 跳转至 /login |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录 |
| 步骤 | 1. 依次点击左侧菜单每个条目 |
| 预期 | ① 每个菜单项可点击 ② 当前页面对应的菜单项高亮 ③ 页面内容正常加载 ④ 浏览器前进后退按钮可正常工作 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录 |
| 步骤 | 依次访问各页面,查看浏览器 tab 标题 |
| 预期 | 每个页面有正确的浏览器标题,如「数字能量学管理平台 - 用户管理」 |
| 字段 | 内容 |
|---|---|
| 前置 | 待审核的提现记录 |
| 步骤 | 1. 快速连续点击两次「通过」按钮 |
| 预期 | ① 第二次点击不触发请求或请求被拒绝 ② 不出现重复成功提示或数据不一致 |
| 字段 | 内容 |
|---|---|
| 前置 | 配置已加载 |
| 步骤 | 1. 修改配置多处值 2. 修改后不保存,直接刷新页面 |
| 预期 | ① 页面重新加载后,所有配置值恢复为数据库中的值 ② 未保存的修改丢失 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录 |
| 步骤 | 1. 手动修改 localStorage 中的 admin_token 为任意字符串 2. 刷新页面 |
| 预期 | API 请求返回 1001,页面跳转至登录页 |
| 字段 | 内容 |
|---|---|
| 前置 | 已登录,网络延迟极高或断开 |
| 步骤 | 1. 访问任意页面 |
| 预期 | ① 页面显示 loading 状态后超时 ② 弹出「网络错误」提示 ③ 页面不崩溃 |
| 字段 | 内容 |
|---|---|
| 前置 | 数据库为空(全新安装) |
| 步骤 | 依次访问所有页面 |
| 预期 | 每个页面均正常渲染,显示空状态(「暂无数据」/ 0值),不报错 |
| 字段 | 内容 |
|---|---|
| 前置 | sys_config 表有完整种子数据 |
| 步骤 | 1. 打开系统配置页面 2. 对照下方清单逐一核对 |
| 预期 | 以下所有配置项均存在且值正确: |
定价配置:
- pricing.practitioner.seed 能量师种子价 (default: 1314)
- pricing.practitioner.standard 能量师标准价 (default: 1986)
- pricing.practitioner.seed_limit 种子价上限 (default: 300)
- pricing.annual C端年费 (default: 131)
B端佣金(固定金额):
- commission.practitioner.l1 L1 能量师推荐 (default: 300)
- commission.practitioner.l1_cend L1 C端推荐 (default: 100)
- commission.practitioner.l2 L2 (default: 50)
C端佣金(百分比):
- commission.annual.direct_rate 直接佣金比例 (default: 40)
- commission.annual.upstream_rate 上级佣金比例 (default: 5)
人工方案:
- commerce.category.practitioner_plan.commission_rate 平台佣金率 (default: 10)
- commission.practitioner_plan.referral_rate 分销直接占比 (default: 50)
- commission.practitioner_plan.upstream_rate 分销上级占比 (default: 20)
- plan_request.min_price 方案最低价 (default: 99)
- plan_request.max_price 方案最高价 (default: 9999)
- plan_request.max_rounds 最大协商轮次 (default: 3)
配额:
- quota.chart 每日AI解读 (default: 1)
- quota.chat 每日AI问答 (default: 3)
- quota.share 每日分享 (default: 3)
其他参数:
- system.referral_prefix 推广码前缀 (default: NUM)
- system.chat_interval 咨询最短间隔(秒) (default: 5)
每次后端 API 或前端组件变更后,以下核心流程需回归验证:
| 流程 | 涉及页面 | 关键验证点 |
|---|---|---|
| 登录 → 仪表盘 | Login → Dashboard | token 获取、跳转、统计加载 |
| 用户操作 | Users | 升级VIP、设/取消管理员后数据一致 |
| 提现审核 | Withdraw | 通过/拒绝后状态正确,按钮消失 |
| 配置保存 | Settings | 修改→保存→刷新→值保持 |
| 权限拦截 | 全部 | 未登录重定向、token过期处理 |
| 前端功能 | 依赖的后端 API | 请求方式 |
|---|---|---|
| 登录 | POST /api/admin/login |
无 token |
| 仪表盘 | POST /api/admin/stats |
需 admin token |
| 用户列表 | POST /api/admin/users |
需 admin token |
| 升级VIP | POST /api/admin/user/upgrade |
需 admin token |
| 设/取消管理 | POST /api/admin/user/set-admin |
需 admin token |
| 订单列表 | POST /api/admin/orders |
需 admin token |
| 佣金列表 | POST /api/admin/commissions |
需 admin token |
| 提现列表 | POST /api/admin/withdraws |
需 admin token |
| 通过提现 | POST /api/admin/withdraw/approve |
需 admin token |
| 拒绝提现 | POST /api/admin/withdraw/reject |
需 admin token |
| 配置列表 | POST /api/admin/config/list |
需 admin token |
| 配置保存 | POST /api/admin/config/update |
需 admin token |
| 配置重置 | POST /api/admin/config/reset |
需 admin token |
| 分析记录 | POST /api/admin/charts |
需 admin token |