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