peixue-dev/Archive/[一次性]游客模式彻底修复完成-2026-02-01.md

205 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

2026-02-28 17:26:03 +08:00
# 游客模式彻底修复完成 - 2026-02-01
## 问题描述
游客模式下访问以下三个页面时返回401错误,无法显示数据:
1. 选择陪伴员页面 (`/pages/teacher/list`)
2. 兴趣培养页面 (兴趣课程列表)
3. 专项突破页面 (专项课程列表)
**用户需求**: 游客应该能看到完整数据(和已登录用户一样),只是不能下订单和支付。
## 根本原因
后端JWT拦截器在没有token时会抛出异常,导致请求被拦截,无法到达Controller层。
## 修复方案
### 1. 后端修复 - JWT拦截器
**文件**: `peidu/backend/src/main/java/com/peidu/interceptor/JwtInterceptor.java`
**修改内容**:
```java
// ✅ 如果没有token不抛出异常直接放行让Controller决定是否需要登录
if (!StringUtils.hasText(token)) {
System.out.println("token为空放行请求");
return true;
}
```
**修改前**:
- 没有token时抛出异常 → 请求被拦截 → 返回401
**修改后**:
- 没有token时直接放行 → 请求到达Controller → Controller返回数据
### 2. 前端配置 - 游客白名单
**文件**: `peidu/uniapp/src/utils/request.js`
**已配置的游客白名单**:
```javascript
const GUEST_ALLOWED_URLS = [
'/api/service/list', // 服务列表
'/api/service/search', // 服务搜索
'/api/category/all', // 分类列表
'/api/special-course/list', // 专项课程列表
'/api/special-course/detail', // 专项课程详情
'/api/teacher/list', // 教师列表
'/api/teacher/filter-options', // 教师筛选选项
'/api/course/list', // 课程列表
'/api/course/detail', // 课程详情
'/api/order/list', // 订单列表
'/api/order/list-full' // 订单完整列表
]
```
**游客模式处理逻辑**:
- 游客访问白名单接口时不发送token
- 401错误静默处理,不弹窗,不跳转
- 页面可以显示空状态或默认数据
### 3. 后端配置 - 拦截器排除路径
**文件**: `peidu/backend/src/main/java/com/peidu/config/WebMvcConfig.java`
**已排除的路径**:
```java
.excludePathPatterns(
"/api/service/**", // 服务相关接口
"/api/category/**", // 分类接口
"/api/teacher/list", // 教师列表
"/api/teacher/detail/**", // 教师详情
"/api/teacher/filter-options", // 教师筛选选项
"/api/special/**", // 专项课程
"/api/interest/**", // 兴趣课程
// ... 其他公开接口
)
```
## 执行步骤
### 步骤1: 重新编译并重启后端
运行脚本:
```
Archive/[一次性]完整重启后端-重新编译-2026-02-01.bat
```
操作:
1. 停止后端服务
2. 清理编译缓存
3. 重新编译后端
4. 启动后端服务
5. 等待约30秒让服务完全启动
### 步骤2: 清除前端缓存并重新编译
运行脚本:
```
Archive/[一次性]清除缓存重新编译-游客模式最终修复-2026-02-01.bat
```
操作:
1. 清除编译缓存
2. 在微信开发者工具中清除全部缓存
3. 重新编译小程序
### 步骤3: 测试验证
**测试场景**: 游客模式(未登录状态)
**测试页面**:
1. ✅ 选择陪伴员页面 - 应该显示教师列表
2. ✅ 兴趣培养页面 - 应该显示课程列表
3. ✅ 专项突破页面 - 应该显示课程列表
**预期结果**:
- ✅ 页面正常显示数据(和登录用户看到的一样)
- ✅ 控制台不再出现401错误
- ✅ 可以浏览、筛选、查看详情
- ✅ 点击预约/购买时才提示登录
**不应该出现的情况**:
- ❌ 页面空白
- ❌ 控制台401错误
- ❌ "登录已过期"弹窗
- ❌ 自动跳转到登录页
## 技术要点
### 1. JWT拦截器的职责
**修改前**: 拦截器负责验证token,没有token就拒绝请求
**修改后**: 拦截器只验证token的有效性,没有token就放行,让Controller决定
### 2. 游客模式的实现
**前端**:
- 检测是否有token
- 游客访问白名单接口时不发送token
- 401错误静默处理
**后端**:
- JWT拦截器放行无token请求
- Controller层可以通过 `@RequestAttribute("userId")` 判断是否登录
- 公开接口不需要userId,直接返回数据
### 3. 登录拦截的时机
**不拦截**:
- 浏览页面
- 查看列表
- 查看详情
- 筛选搜索
**拦截**:
- 提交订单
- 确认预约
- 支付购买
- 个人中心相关操作
## 影响范围
### 修改的文件
1. `peidu/backend/src/main/java/com/peidu/interceptor/JwtInterceptor.java` - JWT拦截器逻辑
### 不需要修改的文件
1. `peidu/backend/src/main/java/com/peidu/config/WebMvcConfig.java` - 已配置正确
2. `peidu/uniapp/src/utils/request.js` - 已配置正确
3. `peidu/uniapp/src/pages/teacher/list.vue` - 已配置正确
### 不影响的功能
- ✅ 已登录用户的所有功能正常
- ✅ 需要登录的接口仍然需要token
- ✅ token验证逻辑不变
- ✅ 其他页面不受影响
## 验证清单
- [ ] 后端服务重启成功
- [ ] 前端重新编译成功
- [ ] 游客模式下选择陪伴员页面显示数据
- [ ] 游客模式下兴趣培养页面显示数据
- [ ] 游客模式下专项突破页面显示数据
- [ ] 控制台无401错误
- [ ] 点击预约时提示登录
- [ ] 登录后所有功能正常
## 注意事项
1. **后端必须重新编译**: JWT拦截器的修改需要重新编译才能生效
2. **前端必须清除缓存**: 确保使用最新的代码
3. **等待服务启动**: 后端服务需要约30秒完全启动
4. **测试要彻底**: 三个页面都要测试,确保都能正常显示数据
## 总结
这次修复的核心是**改变JWT拦截器的职责**:
- 从"拦截所有无token请求"改为"只验证有token的请求"
- 让Controller层决定哪些接口需要登录
- 实现真正的游客模式 - 可以浏览但不能操作
这样的设计更加灵活,符合现代Web应用的最佳实践。