Files
integral-shop/docs/integral-pages-test-report-v2.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

169 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
# 积分模块新增页面 — 功能测试报告 v2
**测试时间:** 2026-03-31
**测试范围:** Coding Plan 交付清单功能验证(静态分析 + 结构检查)
**测试结果:** ✅ 全部通过11/11 项)
---
## T01 — 交付文件存在性检查
| 文件 | 结果 |
|---|:---:|
| `src/layout/EmptyLayout.vue` | ✅ PASS |
| `src/utils/requestNoAuth.js` | ✅ PASS |
| `src/router/modules/integralExternal.js` | ✅ PASS |
| `src/router/index.js`(已注册) | ✅ PASS |
| `src/api/integralExternal.js` | ✅ PASS |
| `src/permission.js`(已修改) | ✅ PASS |
| `src/filters/user.js`(已修改) | ✅ PASS |
| `src/views/integral-external/order/index.vue` | ✅ PASS |
| `src/views/integral-external/user/index.vue` | ✅ PASS |
| `src/views/integral-external/user-integral-detail/index.vue` | ✅ PASS |
| `ExternalIntegralController.java` | ✅ PASS |
**11/11 文件存在**
---
## T02 — permission.js 白名单前缀检查
```js
const whiteList = ['/login', '/auth-redirect'];
const whiteListPrefixes = ['/integral-external'];
// ...
if (whiteList.indexOf(to.path) !== -1
|| whiteListPrefixes.some(prefix => to.path.startsWith(prefix))) {
next();
}
```
-`whiteListPrefixes` 已定义并包含 `/integral-external`
- ✅ 使用 `startsWith` 前缀匹配(支持所有子路径)
---
## T03 — router/index.js 注册检查
-`import integralExternalRouter from './modules/integralExternal'` 已添加
-`integralExternalRouter` 已加入 `constantRoutes`
---
## T04 — 新页面无权限指令检查
| 页面 | v-hasPermi | checkPermi |
|---|:---:|:---:|
| order/index.vue | ✅ 无 | ✅ 无 |
| user/index.vue | ✅ 无 | ✅ 无 |
| user-integral-detail/index.vue | ✅ 无 | ✅ 无 |
**三个页面均不含任何权限指令,符合免认证要求。**
---
## T05 — phoneDesensitize 过滤器链路
1.`filters/user.js` 导出 `phoneDesensitize` 函数
2.`filters/index.js` 通过 `export * from './user'` 自动 re-export
3.`main.js` 通过 `Object.keys(filters).forEach` 全局注册所有过滤器
4.`user/index.vue` 正确使用 `{{ scope.row.phone | phoneDesensitize }}`
---
## T06 — API 函数与后端路径一致性
| API 函数 | 前端 URL | HTTP 方法 |
|---|---|:---:|
| `getExternalOrderList` | `external/integral/order/list` | GET |
| `getExternalUserList` | `external/integral/user/list` | GET |
| `getExternalIntegralLog` | `external/integral/log/list` | POST |
所有 URL 与 `ExternalIntegralController` 中的映射路径完全一致。
---
## T07 — 文件语法结构检查
| 文件 | template | script | name 属性 | 括号平衡 |
|---|:---:|:---:|:---:|:---:|
| EmptyLayout.vue | ✅ | ✅ | ✅ | ✅ |
| order/index.vue | ✅ | ✅ | ✅ | ✅ |
| user/index.vue | ✅ | ✅ | ✅ | ✅ |
| user-integral-detail/index.vue | ✅ | ✅ | ✅ | ✅ |
---
## T08 — 路由路径一致性
| 路由定义(子路径) | 完整路径 | 跳转来源 |
|---|---|---|
| `order` | `/integral-external/order` | 默认 redirect |
| `user` | `/integral-external/user` | — |
| `user/integral-detail` | `/integral-external/user/integral-detail` | user/index.vue `$router.push` |
-`user/index.vue` 导航路径 `/integral-external/user/integral-detail` 与路由定义一致
---
## T09 — EmptyLayout 引用链
-`integralExternal.js` 动态引入 `EmptyLayout`
-`EmptyLayout.vue` 包含 `<router-view />`(子页面正确渲染)
---
## T10 — requestNoAuth 免认证验证
-`api/integralExternal.js` 使用 `requestNoAuth` 实例(非 `request`
-`requestNoAuth.js` 请求拦截器中**无**任何 `Authorization` Header 注入逻辑
-`requestNoAuth.js` 响应拦截器中**无** 401 重定向到登录页逻辑
---
## T11 — 后端 Java 检查
| 检查项 | 结果 |
|---|:---:|
| `@RestController` 注解 | ✅ PASS |
| `@RequestMapping("api/external/integral")` | ✅ PASS |
| `/order/list``@GetMapping` | ✅ PASS与前端 GET 一致) |
| `/user/list``@GetMapping` | ✅ PASS与前端 GET 一致) |
| `/log/list``@PostMapping` | ✅ PASS与前端 POST 一致) |
| **无 `@PreAuthorize`** | ✅ PASS |
| `WebSecurityConfig` permitAll 白名单 | ✅ PASS |
---
## 汇总
| 测试项 | 通过 | 失败 |
|---|:---:|:---:|
| T01 文件存在性11项 | 11 | 0 |
| T02 路由白名单前缀 | 1 | 0 |
| T03 路由注册 | 1 | 0 |
| T04 无权限指令3页 | 3 | 0 |
| T05 过滤器链路4环节 | 4 | 0 |
| T06 API 路径一致性3接口 | 3 | 0 |
| T07 文件语法结构4文件 | 4 | 0 |
| T08 路由路径一致性 | 1 | 0 |
| T09 EmptyLayout 引用链 | 2 | 0 |
| T10 免认证验证3项 | 3 | 0 |
| T11 后端 Java7项 | 7 | 0 |
| **合计** | **40** | **0** |
> ✅ **40/40 全部通过** — 交付物满足 Coding Plan 所有功能需求,可进入联调阶段。
---
## 待联调验证(需运行环境)
以下项目需在实际启动前后端后验证:
- [ ] 浏览器访问 `/integral-external/order` 不跳转登录页
- [ ] 订单列表数据正确渲染(含商品图片)
- [ ] 用户列表手机号脱敏显示138\*\*\*\*5678
- [ ] 点击"查看积分明细"正确传参 uid 并跳转
- [ ] 积分明细页概览卡片显示正确的积分 & 个人奖金
- [ ] 返回按钮回到用户积分列表