# 管理后台 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 |