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

205 lines
5.8 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.

# 游客模式彻底修复完成 - 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应用的最佳实践。