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