182 lines
4.4 KiB
Markdown
182 lines
4.4 KiB
Markdown
# 游客模式最终修复方案
|
||
|
||
## 修复思路
|
||
|
||
**核心原则**: 游客模式下不带token访问服务接口,让后端决定是否允许匿名访问。
|
||
|
||
## 修改内容
|
||
|
||
### 1. request.js - 请求拦截器
|
||
|
||
#### 修改1: 移除游客模式的提前拦截
|
||
**之前**: 游客访问非白名单接口时,前端直接拦截
|
||
**现在**: 允许游客访问所有接口,由后端决定是否允许
|
||
|
||
#### 修改2: 游客模式不带token
|
||
**之前**: 游客访问白名单接口时也不带token
|
||
**现在**: 游客模式下所有请求都不带token
|
||
|
||
#### 修改3: 401错误静默处理
|
||
**之前**: 游客访问白名单接口返回401时返回空数据
|
||
**现在**: 游客访问白名单接口返回401时静默失败(不弹窗)
|
||
|
||
### 2. service/list.vue - 服务列表页面
|
||
|
||
#### 修改: 错误处理优化
|
||
**添加**: 检查 `error.silent` 标志,如果是静默失败则不显示错误提示
|
||
|
||
## 工作流程
|
||
|
||
### 游客模式访问服务列表
|
||
|
||
```
|
||
游客打开服务列表
|
||
↓
|
||
前端发送请求(不带token)
|
||
↓
|
||
后端判断:
|
||
├─ 支持匿名访问 → 返回真实数据 ✅
|
||
└─ 不支持匿名访问 → 返回401 ❌
|
||
↓
|
||
前端静默失败(不弹窗)
|
||
↓
|
||
页面显示为空
|
||
```
|
||
|
||
### 游客模式预约服务
|
||
|
||
```
|
||
游客点击"确认预约"
|
||
↓
|
||
前端检查登录状态
|
||
↓
|
||
未登录 → 提示"请先登录" → 跳转登录页面
|
||
```
|
||
|
||
## 后端需要做的
|
||
|
||
**如果希望游客可以查看服务列表**,后端需要修改以下接口的权限:
|
||
|
||
1. `/api/category/all` - 获取服务分类
|
||
2. `/api/service/list` - 获取服务列表
|
||
3. `/api/service/search` - 搜索服务
|
||
|
||
**修改方式**: 允许这些接口在没有token的情况下也能访问(匿名访问)
|
||
|
||
## 修改的文件
|
||
|
||
### peidu/uniapp/src/utils/request.js
|
||
|
||
**修改点1**: 移除游客模式提前拦截
|
||
```javascript
|
||
// ❌ 删除了这段代码
|
||
// if (isGuest && !isGuestAllowedUrl(options.url)) {
|
||
// reject({ code: 401, message: '未登录', silent: true })
|
||
// return
|
||
// }
|
||
```
|
||
|
||
**修改点2**: 简化token添加逻辑
|
||
```javascript
|
||
// ✅ 简化为
|
||
if (token) {
|
||
header['Authorization'] = buildAuthHeader(token)
|
||
}
|
||
```
|
||
|
||
**修改点3**: 游客模式401静默失败
|
||
```javascript
|
||
// HTTP 401
|
||
if (isGuest && isGuestAllowedUrl(options.url)) {
|
||
console.log('[Request] 游客模式,白名单接口返回401,静默失败:', options.url)
|
||
reject({ code: 401, message: '未登录', silent: true })
|
||
return
|
||
}
|
||
|
||
// 业务码 401
|
||
if (isGuest && isGuestAllowedUrl(options.url)) {
|
||
console.log('[Request] 游客模式,白名单接口业务码401,静默失败:', options.url)
|
||
reject({ code: 401, message: '未登录', data: res.data, silent: true })
|
||
return
|
||
}
|
||
```
|
||
|
||
### peidu/uniapp/src/pages/service/list.vue
|
||
|
||
**修改点**: 错误处理优化
|
||
```javascript
|
||
catch (error) {
|
||
console.error('加载服务分类失败:', error)
|
||
// ✅ 游客模式:静默失败,不显示错误提示
|
||
if (error.silent) {
|
||
console.log('游客模式,静默失败,不显示提示')
|
||
} else {
|
||
uni.showToast({ title: '加载分类失败', icon: 'none' })
|
||
}
|
||
}
|
||
```
|
||
|
||
## 测试场景
|
||
|
||
### 场景1: 后端支持匿名访问(理想情况)
|
||
|
||
```
|
||
游客访问服务列表
|
||
↓
|
||
✅ 正常显示服务分类
|
||
✅ 正常显示服务列表
|
||
✅ 可以搜索服务
|
||
✅ 点击"确认预约"时提示登录
|
||
```
|
||
|
||
### 场景2: 后端不支持匿名访问(当前情况)
|
||
|
||
```
|
||
游客访问服务列表
|
||
↓
|
||
❌ 后端返回401
|
||
↓
|
||
✅ 前端静默失败(不弹窗)
|
||
✅ 页面显示为空
|
||
✅ 不影响用户体验
|
||
```
|
||
|
||
### 场景3: 已登录用户
|
||
|
||
```
|
||
已登录用户访问服务列表
|
||
↓
|
||
✅ 正常显示服务分类
|
||
✅ 正常显示服务列表
|
||
✅ 可以搜索服务
|
||
✅ 可以正常预约
|
||
```
|
||
|
||
## 优势
|
||
|
||
1. **最小改动** - 只修改了必要的地方
|
||
2. **不破坏现有功能** - 已登录用户不受影响
|
||
3. **灵活性** - 后端可以自由决定是否支持匿名访问
|
||
4. **用户体验** - 游客模式下不会频繁弹窗
|
||
|
||
## 后续建议
|
||
|
||
**强烈建议联系后端开发人员**,让他们修改服务接口的权限控制,允许匿名访问。这样:
|
||
- ✅ 游客可以浏览服务列表
|
||
- ✅ 可以吸引更多用户注册
|
||
- ✅ 提升用户体验
|
||
|
||
## 执行步骤
|
||
|
||
1. ✅ 代码已修改完成
|
||
2. ⏳ 执行清除缓存脚本
|
||
3. ⏳ 重新编译小程序
|
||
4. ⏳ 测试游客模式
|
||
5. ⏳ 联系后端修改接口权限(如果需要)
|
||
|
||
---
|
||
|
||
**修复时间**: 2026-02-01
|
||
**修复人员**: Kiro AI
|
||
**状态**: 代码已修改,等待测试
|