peixue-dev/Archive/[一次性]服务列表游客模式彻底修复-2026-02-01.md

6.7 KiB
Raw Blame History

服务列表游客模式彻底修复

问题描述

游客(未登录用户)访问服务列表页面时出现:

  • 显示"不存在"错误(401)
  • 页面无法正常显示
  • 控制台显示"加载服务分类失败"

问题根本原因

后端不支持游客访问服务接口,即使前端将接口加入白名单,后端仍然返回401错误。

从控制台日志可以看到:

[Request] 游客模式,访问白名单接口,静默失败: /api/category/all
{code: 401, message: "不存在", silent: true}

解决方案

方案说明

既然后端不支持游客访问,那么前端需要:

  1. 将服务相关接口加入游客白名单
  2. 当游客访问这些接口返回401时,返回空数据而不是错误
  3. 根据不同接口返回不同的空数据结构
  4. 让页面可以正常显示(只是数据为空)

修改内容

1. 游客白名单(已完成)

request.js 中添加服务相关接口:

const GUEST_ALLOWED_URLS = [
  '/api/service/list',
  '/api/service/search',   // ✅ 新增
  '/api/category/all',     // ✅ 新增
  // ... 其他接口
]

2. 401错误处理 - HTTP状态码401

位置: request.js 第207-220行

修改前:

if (isGuestMode() && isGuestAllowedUrl(options.url)) {
  console.log('[Request] 游客模式白名单接口返回401静默失败:', options.url)
  resolve({ code: 200, data: [], message: 'success' })
  return
}

修改后:

if (isGuestMode() && isGuestAllowedUrl(options.url)) {
  console.log('[Request] 游客模式白名单接口返回401返回空数据:', options.url)
  // 根据不同的接口返回不同的空数据结构
  let emptyData = []
  if (options.url.includes('/category/all')) {
    emptyData = [] // 分类列表为空数组
  } else if (options.url.includes('/service/list')) {
    emptyData = { records: [], total: 0 } // 服务列表为分页结构
  } else if (options.url.includes('/service/search')) {
    emptyData = { records: [], total: 0 } // 搜索结果为分页结构
  }
  resolve({ code: 200, data: emptyData, message: 'success' })
  return
}

3. 401错误处理 - 业务码401

位置: request.js 第258-271行

修改前:

if (isGuestMode() && isGuestAllowedUrl(options.url)) {
  console.log('[Request] 游客模式白名单接口业务码401返回空数据:', options.url)
  resolve({ code: 200, data: [], message: 'success' })
  return
}

修改后:

if (isGuestMode() && isGuestAllowedUrl(options.url)) {
  console.log('[Request] 游客模式白名单接口业务码401返回空数据:', options.url)
  // 根据不同的接口返回不同的空数据结构
  let emptyData = []
  if (options.url.includes('/category/all')) {
    emptyData = [] // 分类列表为空数组
  } else if (options.url.includes('/service/list')) {
    emptyData = { records: [], total: 0 } // 服务列表为分页结构
  } else if (options.url.includes('/service/search')) {
    emptyData = { records: [], total: 0 } // 搜索结果为分页结构
  }
  resolve({ code: 200, data: emptyData, message: 'success' })
  return
}

修复效果

游客模式体验

  1. 浏览服务列表

    游客打开小程序
      ↓
    点击"服务"标签
      ↓
    ✅ 页面正常显示(不报错)
      ↓
    ✅ 显示空的分类列表
      ↓
    ✅ 显示空的服务列表
    
  2. 搜索服务

    游客在服务页面
      ↓
    输入搜索关键词
      ↓
    ✅ 页面正常显示(不报错)
      ↓
    ✅ 显示"未找到相关服务"
    
  3. 预约服务(登录拦截)

    游客点击"立即预约"
      ↓
    进入预约页面
      ↓
    点击"确认预约"
      ↓
    🔔 提示"请先登录"
      ↓
    🔄 跳转到登录页面
    

已登录用户体验

  1. 浏览服务列表

    已登录用户打开小程序
      ↓
    点击"服务"标签
      ↓
    ✅ 正常显示服务分类
      ↓
    ✅ 正常显示服务列表
    
  2. 预约服务

    已登录用户点击"立即预约"
      ↓
    进入预约页面
      ↓
    点击"确认预约"
      ↓
    ✅ 正常创建订单
      ↓
    ✅ 跳转到支付页面
    

空数据结构说明

不同的接口需要返回不同的空数据结构,以匹配前端的数据解析逻辑:

接口 空数据结构 说明
/api/category/all [] 空数组
/api/service/list { records: [], total: 0 } 分页结构
/api/service/search { records: [], total: 0 } 分页结构

修改的文件

  • peidu/uniapp/src/utils/request.js - 请求拦截器(已修改)
    • 添加服务接口到游客白名单
    • 修改401错误处理逻辑
    • 根据不同接口返回不同的空数据结构

测试步骤

测试1: 游客浏览服务列表

  1. 清除小程序缓存和登录状态
  2. 以游客身份打开小程序
  3. 点击"服务"标签
  4. 预期结果:
    • 页面正常显示,不报错
    • 显示空的分类列表
    • 显示空的服务列表
    • 控制台显示"游客模式白名单接口返回401返回空数据"

测试2: 游客搜索服务

  1. 以游客身份进入服务页面
  2. 在搜索框输入关键词
  3. 点击搜索
  4. 预期结果:
    • 页面正常显示,不报错
    • 显示"未找到相关服务"

测试3: 已登录用户浏览服务

  1. 登录小程序
  2. 点击"服务"标签
  3. 预期结果:
    • 正常显示服务分类
    • 正常显示服务列表
    • 可以正常搜索

测试4: 预约登录拦截

  1. 以游客身份进入预约页面
  2. 填写预约信息
  3. 点击"确认预约"
  4. 预期结果:
    • 🔔 显示"请先登录"提示
    • 🔄 跳转到登录页面

执行步骤

  1. 修改 request.js 添加游客白名单
  2. 修改 request.js 的401错误处理逻辑
  3. 创建清除缓存的批处理文件
  4. 执行批处理文件清除缓存
  5. 在微信开发者工具中重新编译
  6. 测试游客浏览服务列表
  7. 测试已登录用户浏览服务列表

关键点

  1. 后端不支持游客访问 - 这是根本原因
  2. 前端返回空数据 - 让页面可以正常显示
  3. 不同接口不同结构 - 匹配前端的数据解析逻辑
  4. 静默失败 - 不弹出错误提示,不影响用户体验

相关文件

  • peidu/uniapp/src/utils/request.js - 请求拦截器(已修改)
  • peidu/uniapp/src/pages/service/list.vue - 服务列表页面
  • Archive/[一次性]清除缓存重新编译-服务列表游客模式彻底修复-2026-02-01.bat - 清除缓存脚本

修复时间: 2026-02-01
修复人员: Kiro AI
问题级别: 高(影响游客体验)
修复状态: 已完成,待测试