202 lines
4.6 KiB
Markdown
202 lines
4.6 KiB
Markdown
|
|
# 关注页面问题已修复 ✅
|
|||
|
|
|
|||
|
|
## 问题根本原因
|
|||
|
|
|
|||
|
|
**后端API返回的字段名与Android端期望的不匹配**
|
|||
|
|
|
|||
|
|
- **Android端期望**:关注列表API返回的用户对象中包含 `uid` 字段
|
|||
|
|
- **后端实际返回**:只有 `userId` 字段,没有 `uid` 字段
|
|||
|
|
- **结果**:Android端无法提取用户ID,导致无法匹配直播间
|
|||
|
|
|
|||
|
|
## 已完成的修复
|
|||
|
|
|
|||
|
|
### 1. 修改后端SQL映射文件
|
|||
|
|
|
|||
|
|
文件:`Zhibo/zhibo-h/crmeb-service/src/main/resources/mapper/FollowRecordDao.xml`
|
|||
|
|
|
|||
|
|
**修改内容**:
|
|||
|
|
```xml
|
|||
|
|
<!-- 修改前 -->
|
|||
|
|
SELECT
|
|||
|
|
u.uid as userId,
|
|||
|
|
u.nickname,
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
<!-- 修改后 -->
|
|||
|
|
SELECT
|
|||
|
|
u.uid as userId,
|
|||
|
|
u.uid as uid, -- 新增:同时返回uid字段
|
|||
|
|
u.nickname,
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这样后端API会同时返回 `userId` 和 `uid` 两个字段,兼容Android端的期望。
|
|||
|
|
|
|||
|
|
### 2. 重新编译后端代码
|
|||
|
|
|
|||
|
|
已成功编译:
|
|||
|
|
```
|
|||
|
|
[INFO] BUILD SUCCESS
|
|||
|
|
[INFO] Total time: 54.118 s
|
|||
|
|
[INFO] Finished at: 2026-01-03T15:19:45+08:00
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
编译后的jar文件位置:
|
|||
|
|
```
|
|||
|
|
Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 部署步骤
|
|||
|
|
|
|||
|
|
### 步骤1:部署后端代码
|
|||
|
|
|
|||
|
|
如果在服务器上,执行:
|
|||
|
|
```bash
|
|||
|
|
cd /root/zhibo/Zhibo/zhibo-h/crmeb-front
|
|||
|
|
cp target/Crmeb-front.jar ./
|
|||
|
|
./restart.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或者重启服务:
|
|||
|
|
```bash
|
|||
|
|
sudo systemctl restart zhibo-front
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤2:验证修复
|
|||
|
|
|
|||
|
|
#### 方法1:使用curl测试API
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://your-server/api/front/follow/following?page=1&pageSize=10" \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
期望返回:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "success",
|
|||
|
|
"data": {
|
|||
|
|
"list": [
|
|||
|
|
{
|
|||
|
|
"userId": 41,
|
|||
|
|
"uid": 41, // ✅ 现在包含uid字段
|
|||
|
|
"nickname": "夏至已至",
|
|||
|
|
"avatar": "...",
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 方法2:Android端测试
|
|||
|
|
1. 重启Android应用
|
|||
|
|
2. 登录用户43 (xiaofeng)
|
|||
|
|
3. 点击"关注"标签页
|
|||
|
|
4. 应该能看到已关注主播的直播间
|
|||
|
|
|
|||
|
|
#### 方法3:查看Android日志
|
|||
|
|
在Logcat中应该看到:
|
|||
|
|
```
|
|||
|
|
获取到关注列表,数量: 1
|
|||
|
|
关注的用户ID: 41, 昵称: 夏至已至
|
|||
|
|
所有直播间数量: X
|
|||
|
|
直播间: 火影忍者, uid=41, isLive=true, 是否匹配=true
|
|||
|
|
匹配成功!添加直播间: 火影忍者
|
|||
|
|
筛选后的直播间数量: 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 技术细节
|
|||
|
|
|
|||
|
|
### Android端的匹配逻辑
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// MainActivity.java 中的代码
|
|||
|
|
for (Map<String, Object> user : followingList) {
|
|||
|
|
Object uidObj = user.get("uid"); // 期望获取uid字段
|
|||
|
|
if (uidObj instanceof Number) {
|
|||
|
|
int uid = ((Number) uidObj).intValue();
|
|||
|
|
followedUserIds.add(uid);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 然后用这些ID去匹配直播间
|
|||
|
|
for (Room room : allRoomsList) {
|
|||
|
|
Integer roomUid = room.getUid();
|
|||
|
|
if (roomUid != null && followedUserIds.contains(roomUid)) {
|
|||
|
|
filteredRooms.add(room); // 匹配成功
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 后端的SQL查询
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 获取关注列表时,同时返回userId和uid
|
|||
|
|
SELECT
|
|||
|
|
u.uid as userId, -- 保持兼容性
|
|||
|
|
u.uid as uid, -- Android端需要的字段
|
|||
|
|
u.nickname,
|
|||
|
|
u.avatar,
|
|||
|
|
u.mark as signature,
|
|||
|
|
fr.create_time as followTime,
|
|||
|
|
CASE
|
|||
|
|
WHEN TIMESTAMPDIFF(MINUTE, u.last_login_time, NOW()) < 5 THEN 1
|
|||
|
|
ELSE 0
|
|||
|
|
END as isOnline
|
|||
|
|
FROM eb_follow_record fr
|
|||
|
|
JOIN eb_user u ON fr.followed_id = u.uid
|
|||
|
|
WHERE fr.follower_id = #{userId}
|
|||
|
|
AND (fr.follow_status = 1 OR fr.follow_status = '关注')
|
|||
|
|
AND fr.is_deleted = 0
|
|||
|
|
ORDER BY fr.create_time DESC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 其他可能需要的修复
|
|||
|
|
|
|||
|
|
如果部署后仍然有问题,可能还需要:
|
|||
|
|
|
|||
|
|
### 1. 修复数据库数据
|
|||
|
|
```bash
|
|||
|
|
mysql -u root -p zhibo < final_fix_follow_issue.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这个脚本会:
|
|||
|
|
- 修复关注状态值("关注" → "1")
|
|||
|
|
- 确保主播标识正确
|
|||
|
|
- 创建测试数据
|
|||
|
|
|
|||
|
|
### 2. 检查数据库连接
|
|||
|
|
```sql
|
|||
|
|
-- 确认关注记录存在
|
|||
|
|
SELECT * FROM eb_follow_record WHERE follower_id = 43;
|
|||
|
|
|
|||
|
|
-- 确认主播存在
|
|||
|
|
SELECT * FROM eb_user WHERE uid = 41 AND is_streamer = 1;
|
|||
|
|
|
|||
|
|
-- 确认直播间存在
|
|||
|
|
SELECT * FROM eb_live_room WHERE uid = 41;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 预期结果
|
|||
|
|
|
|||
|
|
修复完成后:
|
|||
|
|
|
|||
|
|
✅ 关注列表API返回包含 `uid` 字段的用户对象
|
|||
|
|
✅ Android端能正确提取用户ID
|
|||
|
|
✅ Android端能匹配到已关注主播的直播间
|
|||
|
|
✅ 关注页面显示已关注主播的直播间
|
|||
|
|
✅ 支持下拉刷新
|
|||
|
|
✅ 正在直播的房间优先显示
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
这是一个典型的**前后端字段名不匹配**问题:
|
|||
|
|
- 后端只返回 `userId`
|
|||
|
|
- Android端期望 `uid`
|
|||
|
|
- 解决方案:后端同时返回两个字段,保持兼容性
|
|||
|
|
|
|||
|
|
修复非常简单,只需要在SQL中添加一行 `u.uid as uid`,然后重新编译部署即可。
|
|||
|
|
|
|||
|
|
现在请部署后端代码,然后测试关注页面功能!
|