Files
integral-shop/docs/phase1-checkpoint-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

128 lines
3.7 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.
# Phase 1 检查点报告 — 17:30 自动检查
> 生成时间2026-03-30 17:30
> 检查范围:`backend-adminend/src`
---
## 检查结果汇总
| # | 检查项 | 状态 | 说明 |
|---|--------|------|------|
| 1 | `EmptyLayout.vue` 空白布局 | ❌ **未找到** | `src/layout/` 目录下只有 `index.vue`,未创建 EmptyLayout |
| 2 | `requestNoAuth.js` 免认证请求实例 | ❌ **未找到** | `src/utils/` 目录下只有 `request.js`,未创建 requestNoAuth |
| 3 | 路由模块 `integralExternal.js` | ❌ **未找到** | `src/router/modules/` 下无此文件constantRoutes 未注册 |
| 4 | `permission.js` 白名单前缀匹配 | ❌ **未修改** | 当前仍为精确匹配:`whiteList.indexOf(to.path) !== -1`,未改为前缀匹配 |
| 5 | API 文件 `integralExternal.js` | ❌ **未找到** | `src/api/` 目录下无此文件 |
| 6 | 冒烟验证(无 token 访问不跳转登录) | ⚠️ **无法验证** | 基础设施文件均未创建,无法执行冒烟测试 |
---
## 当前实际状态
**Phase 1 全部 5 项任务均未完成。**
当前 `permission.js` 白名单内容:
```js
const whiteList = ['/login', '/auth-redirect'];
// 匹配方式whiteList.indexOf(to.path) !== -1精确匹配
```
访问 `/integral-external/order` 无 token 时,**会被重定向到登录页**。
---
## 建议行动
### 立即按顺序创建以下文件:
**步骤 1创建 `src/layout/EmptyLayout.vue`**
```vue
<template>
<div class="empty-layout">
<router-view />
</div>
</template>
<script>
export default {
name: 'EmptyLayout'
}
</script>
```
**步骤 2创建 `src/utils/requestNoAuth.js`**
```js
import axios from 'axios'
const requestNoAuth = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 15000
})
requestNoAuth.interceptors.response.use(
response => response.data,
error => Promise.reject(error)
)
export default requestNoAuth
```
**步骤 3创建 `src/router/modules/integralExternal.js`**
```js
import EmptyLayout from '@/layout/EmptyLayout'
const integralExternalRouter = {
path: '/integral-external',
component: EmptyLayout,
children: [
{ path: 'order', name: 'IntegralOrder', component: () => import('@/views/integral/external/order/index') },
{ path: 'user', name: 'IntegralUser', component: () => import('@/views/integral/external/user/index') },
{ path: 'detail', name: 'IntegralDetail', component: () => import('@/views/integral/external/detail/index') }
]
}
export default integralExternalRouter
```
**步骤 4修改 `src/permission.js` 白名单为前缀匹配**
```js
// 改为:
const whiteList = ['/login', '/auth-redirect', '/integral-external'];
// 修改匹配逻辑(约第 55 行):
if (whiteList.some(path => to.path.startsWith(path))) {
next();
} else {
next(`/login?redirect=${to.path}`);
NProgress.done();
}
```
**步骤 5创建 `src/api/integralExternal.js`**(基础框架)
```js
import requestNoAuth from '@/utils/requestNoAuth'
export function getIntegralOrderList(params) {
return requestNoAuth({ url: '/api/integral/order/list', method: 'get', params })
}
export function getIntegralUserList(params) {
return requestNoAuth({ url: '/api/integral/user/list', method: 'get', params })
}
export function getIntegralDetail(params) {
return requestNoAuth({ url: '/api/integral/detail/list', method: 'get', params })
}
```
---
## ⚠️ 重要提示
**免登录链路是后续 Phase 2~4 一切工作的前提**,如果 permission.js 白名单不通,所有积分外部页面都无法访问。
请优先确保 `permission.js` 的前缀匹配逻辑正确生效后,再进入 Phase 2 开发。
当前时间已到 17:30**建议立即开始 Phase 1 任务**,完成后方可进入 Phase 2积分订单页面开发。