zhibo/我的记录数据不显示问题排查.md

131 lines
3.8 KiB
Markdown

# 我的记录数据不显示问题排查
## 问题描述
- 管理端显示用户"道玄"(ID: 121)有完整的活动记录数据
- 移动端"我的记录"页面显示"暂无记录"
## 问题分析
### 数据流程
```
Android App → HTTP请求(带Token) → 后端拦截器验证Token → Controller获取userId → Service查询数据 → 返回结果
```
### 关键代码路径
1. **Android端Token发送**: `ApiClient.java` 中的 `auth` 拦截器
2. **后端Token验证**: `FrontTokenInterceptor.java``FrontTokenComponent.check()`
3. **获取用户ID**: `UserService.getUserId()``FrontTokenComponent.getUserId()`
4. **数据查询**: `UserActivityRecordService.getViewHistory()` 等方法
### 可能的问题原因
1. **Token未正确发送**
- `ApiClient.appContext` 为 null
- `AuthStore.getToken()` 返回 null
2. **Token在Redis中不存在或已过期**
- Token过期时间: 24小时 (`TOKEN_EXPRESS_MINUTES = 60 * 24`)
- Redis key格式: `TOKEN_USER:` + token
3. **Token格式不匹配**
- 后端期望的Header: `Authori-zation`(注意中间有连字符)
## 已添加的调试日志
### Android端 (Logcat TAG: MyRecords, ApiClient)
```
加载记录: type=view, page=1, userId=xxx
Token状态: 存在, 长度=32, 前20字符=xxx...
请求URL: http://xxx/api/front/activity/view/history
请求头Authori-zation: xxx
添加Token到请求头: xxx...
```
### 后端 (搜索关键字)
```
[FrontTokenInterceptor] URI=xxx, rawToken=xxx, processedToken=xxx
[FrontTokenInterceptor] Token验证结果: true/false
[FrontTokenComponent] getUserId: rawToken=xxx, processedToken=xxx, redisKey=xxx, exists=true/false, userId=xxx
【观看历史】请求头Token: xxx
【观看历史】请求参数: userId=xxx, targetType=xxx, page=1, pageSize=20
【观看历史】返回结果: userId=xxx, total=xxx, listSize=xxx
```
## 调试步骤
### 1. 检查Android端Token
```bash
# 在Logcat中过滤
adb logcat -s MyRecords ApiClient AuthStore
```
预期输出:
- Token状态: 存在
- 添加Token到请求头: xxx...
### 2. 检查后端Token验证
查看后端日志,搜索 `[FrontTokenInterceptor]`
预期输出:
- rawToken 不为 null
- Token验证结果: true
### 3. 检查Redis中的Token
```bash
# 连接Redis
redis-cli
# 查看Token是否存在
EXISTS TOKEN_USER:your_token_here
# 查看Token对应的userId
GET TOKEN_USER:your_token_here
```
### 4. 使用调试接口
Android端会自动调用 `api/front/activity/debug/token` 接口,查看返回结果:
```json
{
"header_Authori-zation": "xxx",
"header_Authorization": "xxx",
"userId": 121,
"isLoggedIn": true
}
```
## 解决方案
### 如果Token未发送
1. 确保登录成功后Token已保存到SharedPreferences
2. 检查 `AuthStore.setToken()` 是否被正确调用
### 如果Token已过期
1. 重新登录获取新Token
2. 或者在Redis中手动延长Token过期时间
### 如果Token格式不匹配
1. 确保Android端发送的Header名称是 `Authori-zation`
2. 确保Token值不包含前缀 `TOKEN_USER:`
## 修改的文件列表
1. `zhibo/android-app/app/src/main/java/com/example/livestreaming/net/ApiClient.java`
- 增强Token拦截器日志
2. `zhibo/android-app/app/src/main/java/com/example/livestreaming/MyRecordsActivity.java`
- 增加Token调试方法
- 增强请求日志
3. `zhibo/android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java`
- 添加调试接口 `debugToken()`
4. `zhibo/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/interceptor/FrontTokenInterceptor.java`
- 增强Token验证日志
5. `zhibo/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/token/FrontTokenComponent.java`
- 增强 `getUserId()` 方法日志
6. `zhibo/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/UserActivityRecordController.java`
- 增强各接口的请求日志
- 添加调试接口 `/debug/token`