169 lines
5.3 KiB
Markdown
169 lines
5.3 KiB
Markdown
|
|
# 积分模块新增页面 — 功能测试报告 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 后端 Java(7项) | 7 | 0 |
|
|||
|
|
| **合计** | **40** | **0** |
|
|||
|
|
|
|||
|
|
> ✅ **40/40 全部通过** — 交付物满足 Coding Plan 所有功能需求,可进入联调阶段。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 待联调验证(需运行环境)
|
|||
|
|
|
|||
|
|
以下项目需在实际启动前后端后验证:
|
|||
|
|
|
|||
|
|
- [ ] 浏览器访问 `/integral-external/order` 不跳转登录页
|
|||
|
|
- [ ] 订单列表数据正确渲染(含商品图片)
|
|||
|
|
- [ ] 用户列表手机号脱敏显示(138\*\*\*\*5678)
|
|||
|
|
- [ ] 点击"查看积分明细"正确传参 uid 并跳转
|
|||
|
|
- [ ] 积分明细页概览卡片显示正确的积分 & 个人奖金
|
|||
|
|
- [ ] 返回按钮回到用户积分列表
|