Files
integral-shop/docs/integral-pages-test-report.md
scott ee0886b800 feat: 新增积分外部页面(免认证三页 + 配套基础设施)
前端:
- 新增 EmptyLayout 空壳布局(无侧边栏/导航)
- 新增 requestNoAuth Axios 实例(不注入 token)
- 新增 integralExternal 路由模块(/integral-external/*)
- permission.js 加入 whiteListPrefixes 前缀白名单跳过登录
- 新增 phoneDesensitize 手机号脱敏过滤器
- 新增三个免认证页面:
  · 积分订单页(/integral-external/order)
  · 用户积分页(/integral-external/user,手机号脱敏)
  · 用户积分明细子页(/integral-external/user/integral-detail)

后端:
- 新增 ExternalIntegralController(无 @PreAuthorize)
  · GET  /api/external/integral/order/list
  · GET  /api/external/integral/user/list
  · POST /api/external/integral/log/list
- WebSecurityConfig 加入 /api/external/integral/** permitAll

文档与工具:
- 新增 coding plan、schedule、测试报告
- 新增 start-backend.sh / start-frontend.sh 本地启动脚本
- 新增 .mvn/wrapper/maven-wrapper.properties

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:41:30 +08:00

170 lines
8.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 积分模块新增页面 — 测试报告
> 执行时间2026-03-30
> 测试类型:静态代码分析(新增页面尚未开发,针对现有代码库做预检)
> 测试依据integral-pages-coding-plan.md § 8 测试方案
---
## 总体结论
| 维度 | 状态 | 说明 |
|------|------|------|
| 新增页面文件 | ❌ 未创建 | 三个新页面均未开发,开发尚未启动 |
| 免登录基础设施 | ❌ 未实现 | `permission.js` / `EmptyLayout` / `requestNoAuth` 均未修改 |
| 参考页面可裁剪性 | ✅ 可行 | 原页面结构清晰,具备裁剪条件 |
| 后端接口认证机制 | ⚠️ 有阻塞 | 积分接口有 `@PreAuthorize` 强认证,需后端配合新增免认证路径 |
---
## A 组:免登录访问测试
> 前提:`EmptyLayout.vue` / `requestNoAuth.js` / 路由 / `permission.js` 白名单均**尚未修改**
| 编号 | 测试场景 | 结果 | 详情 |
|------|---------|------|------|
| A-01 | 无 token 访问积分订单页 | ❌ **FAIL** | `permission.js` 白名单仅含 `['/login', '/auth-redirect']`,精确 `indexOf` 匹配,`/integral-external/order` 会被重定向至 `/login` |
| A-02 | 无 token 访问用户积分页 | ❌ **FAIL** | 同 A-01无对应白名单条目 |
| A-03 | 无 token 访问积分明细页 | ❌ **FAIL** | 同 A-01 |
| A-04 | 免登录页面不影响原有认证 | ✅ **PASS** | 原有 `/order/index` 等路径未做变更,仍需登录 |
| A-05 | 已登录用户访问免登录页面 | ⏭️ **SKIP** | 新页面路由未注册,无法访问 |
**A 组结论**:需在 `permission.js` 第 21 行修改白名单,并将第 59 行 `indexOf` 改为 `startsWith` 前缀匹配。
**修改方案**
```js
// permission.js 第 21 行
const whiteList = ['/login', '/auth-redirect', '/integral-external'];
// 第 59 行
if (whiteList.some(path => to.path.startsWith(path))) {
```
---
## B 组:积分订单页面测试
> 参考文件:`src/views/order/index.vue`1182 行)
| 编号 | 测试场景 | 结果 | 详情 |
|------|---------|------|------|
| B-01 | 默认加载 | ⏭️ **SKIP** | 页面未创建 |
| B-02 | 按订单状态筛选 | ⏭️ **SKIP** | 页面未创建 |
| B-03 | 按时间范围筛选 | ⏭️ **SKIP** | 页面未创建 |
| B-04 | 按订单号搜索 | ⏭️ **SKIP** | 页面未创建 |
| B-05 | 重置筛选条件 | ⏭️ **SKIP** | 页面未创建 |
| B-06 | 分页切换 | ⏭️ **SKIP** | 页面未创建 |
| B-07 | 空数据状态 | ⏭️ **SKIP** | 页面未创建 |
| B-08 | 无操作列 | ⚠️ **PRE-CHECK** | 原页面含 **11 处** `v-hasPermi``发货/退款/出库` 操作按钮、导出功能,裁剪时需逐一清理 |
**B 组预检发现**
- `v-hasPermi` 出现 11 次,需全部移除
- 导出按钮在第 79 行:`<el-button @click="exports" v-hasPermi="['admin:export:excel:order']">导出</el-button>`
- `exports()` 方法在第 896 行,需连同方法一起删除
- 原页面**无 Vuex store 直接依赖**,裁剪负担较轻
---
## C 组:用户积分页面测试
> 参考文件:`src/views/user/list/index.vue`1079 行)
| 编号 | 测试场景 | 结果 | 详情 |
|------|---------|------|------|
| C-01 | 默认加载 | ⏭️ **SKIP** | 页面未创建 |
| C-02 | wa_users 字段展示 | ⏭️ **SKIP** | 页面未创建 |
| C-03 | 积分字段来源验证 | ⚠️ **PRE-CHECK** | `integral` 字段已在原 `user/list` 表格中(第 227 行),`eb_user.integral` 字段存在(`User.java` 第 98 行),来源正确 |
| C-04 | wa_users 无关联数据 | ⚠️ **PRE-CHECK** | admin 端无现成的 wa_users API需前端补充处理空值逻辑 |
| C-05 | 用户搜索 | ⏭️ **SKIP** | 页面未创建 |
| C-06 | 跳转积分明细 | ⏭️ **SKIP** | 页面未创建 |
| C-07 | 分页功能 | ⏭️ **SKIP** | 页面未创建 |
| C-08 | 无权限指令残留 | ⚠️ **PRE-CHECK** | 原页面含 **15 处** `v-hasPermi`,裁剪时均需移除 |
**C 组预检发现**
- `integral` 字段已在原用户列表接口中返回,**无需后端改动**
- admin 端**无独立的 wa_users 查询 API**,需新增或复用 `consignment.js` 中的 `selfBonusLogListApi` 辅助拼合
- 需删除的高级筛选项:等级、分组、标签、国家/省份、消费情况、访问情况、性别、身份(共 8 个筛选项)
---
## D 组:用户积分明细子页面测试
> 参考文件:`src/views/user/integral/index.vue`241 行)
| 编号 | 测试场景 | 结果 | 详情 |
|------|---------|------|------|
| D-01 | 带 uid 参数加载 | ⚠️ **PRE-CHECK** | 原页面 `searchForm.uid` 已存在,只需在 `mounted()``$route.query.uid` 注入即可 |
| D-02 | 概览卡片数据验证 | ⚠️ **PRE-CHECK** | 积分来自 `eb_user.integral` ✅;个人奖金来自 `wa_users.selfBonus`admin 端无现成 API |
| D-03 | 无 uid 参数访问 | ⚠️ **PRE-CHECK** | 原页面无 uid 校验逻辑,需在 `mounted()` 添加 fallback 处理 |
| D-04 | 无效 uid 访问 | ⚠️ **PRE-CHECK** | 后端返回空列表即可,前端需处理空状态显示 |
| D-05 | 时间范围筛选 | ✅ **PRE-PASS** | 原页面已有完整 `DateRangePicker` 实现,直接复用 |
| D-06 | 积分变动显示 | ✅ **PRE-PASS** | 原页面已实现 `type===1` 绿色 `+`、否则红色 `-` 逻辑(第 65-66 行) |
| D-07 | 状态与关联类型 | ✅ **PRE-PASS** | `linkTypeFilter` / `statusFilter` / `statusTypeFilter` 三个方法完整(第 196-223 行) |
| D-08 | 返回按钮 | ⚠️ **PRE-CHECK** | 原页面无返回按钮,需手动添加 |
| D-09 | 分页功能 | ✅ **PRE-PASS** | `[15, 30, 45, 60]` 分页完整实现,直接复用 |
**D 组结论**:参考页面仅 241 行复用度最高5/9 项可直接复用),是三个页面中风险最低的。
---
## E 组:接口与后端认证测试
| 编号 | 测试场景 | 结果 | 详情 |
|------|---------|------|------|
| E-01 | 免认证接口可达性 | ❌ **FAIL** | `UserIntegralController.getList()``@PreAuthorize("hasAuthority('admin:user:integral:list')")`,无 token 必返回 401 |
| E-02 | 原认证接口不受影响 | ✅ **PASS** | 原接口认证逻辑未变动 |
| E-03 | 接口仅读不写 | ✅ **PASS** | 积分 list 接口为 POST 查询,无写操作 |
| E-04 | 大数据量分页 | ⏭️ **SKIP** | 待联调时测试 |
| E-05 | 边界参数 | ⏭️ **SKIP** | 待联调时测试 |
| E-06 | 数据脱敏验证 | ❌ **FAIL** | 当前 admin 接口无脱敏处理,用户手机号明文返回 |
**E 组关键发现**
- 后端 `WebSecurityConfig``permitAll` 白名单**不包含** `/api/admin/user/integral/**`
- 需后端在 `WebSecurityConfig` 第 121 行附近新增:
```java
.antMatchers("/api/admin/user/integral/list").permitAll()
```
或新建 `ExternalIntegralController` 映射至免认证路径
---
## F 组:兼容性与 UI 测试
| 编号 | 测试场景 | 结果 |
|------|---------|------|
| F-01 ~ F-07 | 全部兼容性测试 | ⏭️ **SKIP** — 页面未创建,待开发完成后执行 |
---
## 问题汇总(需在开发中修复)
| 优先级 | 问题 | 影响范围 | 解决方案 |
|--------|------|---------|---------|
| 🔴 P0 | `permission.js` 白名单未更新 | A 组全部 FAIL | 修改白名单为前缀匹配 |
| 🔴 P0 | 后端积分接口有 `@PreAuthorize` 强认证 | E-01 FAIL | 后端新增免认证路径或 controller |
| 🟠 P1 | admin 端无独立 wa_users 查询 API | C-04、D-02 阻塞 | 复用寄卖模块的 `selfBonusLogListApi` 或后端新增聚合接口 |
| 🟠 P1 | 用户手机号无脱敏处理 | E-06 FAIL | 后端接口或前端 filter 处理 `138****8888` |
| 🟡 P2 | 原订单页 11 处权限指令需清理 | B-08 | 开发时逐一删除 |
| 🟡 P2 | 原用户列表页 15 处权限指令需清理 | C-08 | 开发时逐一删除 |
| 🟡 P2 | 积分明细页缺少 uid 空值校验和返回按钮 | D-03、D-08 | 开发时添加 |
---
## 测试覆盖统计
| 组别 | 总用例 | PASS | FAIL | PRE-CHECK | SKIP |
|------|--------|------|------|-----------|------|
| A 组(免登录) | 5 | 1 | 3 | 0 | 1 |
| B 组(订单页) | 8 | 0 | 0 | 1 | 7 |
| C 组(用户积分页) | 8 | 0 | 0 | 3 | 5 |
| D 组(积分明细页) | 9 | 4 | 0 | 5 | 0 |
| E 组(接口) | 6 | 2 | 2 | 0 | 2 |
| F 组(兼容性) | 7 | 0 | 0 | 0 | 7 |
| **合计** | **43** | **7** | **5** | **9** | **22** |
> PASS = 代码层面已满足条件FAIL = 存在明确问题需修复PRE-CHECK = 有条件可实现开发时需注意SKIP = 页面未创建,待开发完成后执行
---
*报告生成时间2026-03-30*