5.7 KiB
5.7 KiB
订单列表页面游客模式实现 - 彻底修复版
时间: 2026-02-01
问题: 未登录的家长端访问订单列表页面时,弹出"登录已过期"提示
需求: 游客模式下可以看到订单列表页面,但不显示个人订单数据
问题分析
原始问题
- 未登录用户访问
/pages/order/list页面 - 页面尝试调用
/api/order/list-full接口 - 接口返回 401 未登录错误
- request.js 拦截器弹出"登录已过期"提示框
根本原因
- 问题1: 订单列表接口不在游客模式允许访问的接口列表中
- 问题2: 页面逻辑没有判断登录状态,直接加载订单
- 问题3: request.js 中
res.statusCode === 401的处理逻辑缺少游客模式判断
修复方案(彻底版)
1. 修改 request.js - 添加订单接口到游客白名单
文件: peidu/uniapp/src/utils/request.js
// 游客模式可访问的接口(不弹出登录提示)
const GUEST_ALLOWED_URLS = [
'/api/notification/unread-count',
'/api/timecard/list',
'/api/home/courses',
'/api/banner/list',
'/api/service/list',
'/api/teacher/list',
'/api/course/list',
'/api/order/list', // ✅ 新增
'/api/order/list-full' // ✅ 新增
]
2. 修改 request.js - 修复 statusCode 401 处理逻辑
关键修复: 在 res.statusCode === 401 的处理中增加游客模式判断
// 处理401未登录
if (res.statusCode === 401) {
if (!shouldHandleAuthExpired(options.url)) {
reject({ code: 401, message: '未登录', data: res })
return
}
// ✅ 游客模式:如果是游客可访问的接口,静默失败,不弹窗
if (isGuestMode() && isGuestAllowedUrl(options.url)) {
console.log('[Request] 游客模式,接口静默失败:', options.url)
reject({ code: 401, message: '未登录', data: res, silent: true })
return
}
const latestToken = uni.getStorageSync('token')
// ✅ 游客模式:没有token时,不尝试刷新,直接静默失败
if (!latestToken) {
console.log('[Request] 游客模式,无token,静默失败')
reject({ code: 401, message: '未登录', data: res, silent: true })
return
}
// ... 后续刷新token逻辑
}
修复要点:
- 增加游客模式判断:
isGuestMode() && isGuestAllowedUrl(options.url) - 增加无token判断:
!latestToken时直接静默失败 - 静默失败时添加
silent: true标记
3. 修改 list.vue - 游客模式不加载订单
文件: peidu/uniapp/src/pages/order/list.vue
修改点1:loadOrders 方法增加游客判断
async loadOrders() {
// ✅ 游客模式:不加载订单,直接返回
if (!this.isLoggedIn) {
console.log('[服务日历] 游客模式,不加载订单')
this.loading = false
return
}
this.loading = true
try {
// ... 原有加载逻辑
} catch (error) {
console.error('加载订单异常:', error)
// ✅ 游客模式:静默失败,不显示错误提示
if (!error.silent) {
uni.showToast({ title: '加载失败', icon: 'none' })
}
} finally {
this.loading = false
}
}
修改点2:onShow 生命周期重新检查登录状态
onShow() {
// ✅ 重新检查登录状态
const token = uni.getStorageSync('token')
this.isLoggedIn = !!(token && token !== '')
// 只有登录用户才加载订单
if (this.isLoggedIn) {
this.loadOrders()
}
}
修复的关键点
为什么之前的修复没有生效?
-
只修复了
res.data.code === 401的情况- 之前只在业务码401时增加了游客判断
- 但 HTTP 状态码401(
res.statusCode === 401)的处理逻辑没有修复
-
缺少无token的判断
- 游客模式下没有token
- 但代码仍然尝试刷新token,导致弹窗
-
两个401处理分支都需要修复
res.statusCode === 401- HTTP状态码401res.data.code === 401- 业务码401- 两个分支都需要增加游客模式判断
游客模式体验
未登录时显示
- ✅ 可以看到日历界面
- ✅ 可以看到筛选栏
- ✅ 显示"需要登录"提示
- ✅ 显示"立即登录"按钮
- ❌ 不显示订单数据
- ❌ 不弹出"登录已过期"错误
- ❌ 不弹出任何错误提示
登录后显示
- ✅ 正常加载个人订单
- ✅ 显示订单数量统计
- ✅ 可以查看订单详情
- ✅ 可以进行订单操作
测试验证
测试步骤
- 执行
Archive/[一次性]清除缓存重新编译-游客模式修复-2026-02-01.bat - 在微信开发者工具中清除缓存
- 清除小程序Storage中的token
- 以游客身份访问订单列表页面
- 验证不弹出"登录已过期"提示
- 验证显示"需要登录"空状态
- 点击"立即登录"按钮跳转到登录页
- 登录后返回,验证正常显示订单
预期结果
- ✅ 游客模式:显示空状态,不弹任何错误
- ✅ 登录模式:正常显示订单列表
- ✅ 控制台显示:
[Request] 游客模式,无token,静默失败
相关文件
peidu/uniapp/src/utils/request.js- 请求拦截器(已修复两处401处理)peidu/uniapp/src/pages/order/list.vue- 订单列表页面Archive/[一次性]清除缓存重新编译-游客模式修复-2026-02-01.bat- 清除缓存脚本
总结
通过以下三个改动彻底实现了游客模式:
- request.js - 白名单 - 将订单接口加入游客白名单
- request.js - HTTP 401 - 修复
res.statusCode === 401的游客判断 - list.vue - 页面逻辑 - 游客模式下不加载订单
关键修复: 增加了 !latestToken 的判断,游客模式下没有token时直接静默失败,不尝试刷新token,避免弹窗。