zhibo/关注页面问题总结.md
2026-01-03 15:32:31 +08:00

210 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 关注页面问题总结
## 问题现象
用户 43 (xiaofeng) 关注了用户 41 (夏至已至),而用户 41 有一个正在直播的房间(火影忍者),但是在关注页面看不到这个直播间。
## 数据库现状
### 1. 用户数据
- **用户 43 (xiaofeng)**is_streamer = 1主播
- **用户 41 (夏至已至)**is_streamer = 1主播
### 2. 关注记录
```
id: 12
follower_id: 43 (xiaofeng)
followed_id: 41 (夏至已至)
follow_status: "关注" (字符串)
is_deleted: 0
create_time: 2026-01-03 14:19:16
```
### 3. 直播间数据
用户 41 有 3 个直播间:
- **房间 8火影忍者 (is_live = 1正在直播)**
- 房间 111 (is_live = 0)
- 房间 9aedfsd (is_live = 0)
## 问题原因
### 主要问题:关注状态字段值不一致
**数据库中的值**`follow_status = "关注"` (字符串)
**后端查询条件**
```sql
WHERE follow_status IN ('1', '关注')
```
**Android 端查询条件**
```java
WHERE follow_status IN ('1', '关注')
```
虽然查询条件包含了 `'关注'`,但是:
1. 数据类型不一致可能导致索引失效
2. 不同数据库版本对字符串比较的处理可能不同
3. 字段定义为 `tinyint(4)` 但存储了字符串值
## 解决方案
### 方案 1统一关注状态值推荐
执行 `fix_follow_status.sql` 脚本:
```sql
-- 将字符串"关注"统一为数字"1"
UPDATE eb_follow_record
SET follow_status = '1'
WHERE follow_status = '关注';
-- 将字符串"取消关注"统一为数字"0"
UPDATE eb_follow_record
SET follow_status = '0'
WHERE follow_status IN ('取消关注', '未关注');
```
### 方案 2修改查询条件
如果不想修改数据,可以修改查询条件:
**后端修改**
```java
// 修改前
WHERE follow_status IN ('1', '关注')
// 修改后
WHERE (follow_status = '1' OR follow_status = '关注')
```
**但这不是最佳实践**,因为:
- 性能较差
- 数据不规范
- 可能导致其他问题
## 执行步骤
### 1. 备份数据(重要!)
```sql
CREATE TABLE eb_follow_record_backup AS
SELECT * FROM eb_follow_record;
```
### 2. 执行修复脚本
```bash
mysql -u root -p zhibo < fix_follow_status.sql
```
### 3. 验证修复结果
执行 `test_user_43_follow.sql` 验证:
```bash
mysql -u root -p zhibo < test_user_43_follow.sql
```
预期结果:
- 用户 43 应该能看到用户 41 的关注记录
- 应该能看到用户 41 的 3 个直播间
- 应该能看到正在直播的"火影忍者"房间
### 4. 重启后端服务
```bash
cd /root/zhibo/Zhibo/zhibo-h/crmeb-front
./restart.sh
```
### 5. 测试 Android 应用
1. 登录用户 43 (xiaofeng)
2. 进入"关注"标签页
3. 应该能看到用户 41 的直播间"火影忍者"
## 预防措施
### 1. 修改数据库表定义
确保 `follow_status` 字段使用数字类型:
```sql
ALTER TABLE eb_follow_record
MODIFY COLUMN follow_status TINYINT(4) NOT NULL DEFAULT 1
COMMENT '关注状态1-已关注 0-已取消';
```
### 2. 添加数据库约束
```sql
ALTER TABLE eb_follow_record
ADD CONSTRAINT chk_follow_status
CHECK (follow_status IN (0, 1));
```
### 3. 后端代码规范
在插入/更新关注记录时,统一使用数字:
```java
record.setFollowStatus("1"); // 关注
record.setFollowStatus("0"); // 取消关注
```
### 4. 添加单元测试
测试关注功能的各种场景,确保数据一致性。
## 其他发现
### 1. 直播间表缺少字段
`eb_live_room` 表缺少 `cover_url` 字段SQL 查询会报错。
**解决方案**
```sql
-- 检查字段是否存在
SHOW COLUMNS FROM eb_live_room LIKE 'cover_url';
-- 如果不存在,添加字段
ALTER TABLE eb_live_room
ADD COLUMN cover_url VARCHAR(255) DEFAULT NULL
COMMENT '直播间封面图'
AFTER title;
```
### 2. 用户头像字段
`eb_user` 表应该有 `avatar` 字段用于存储用户头像。
**检查**
```sql
SHOW COLUMNS FROM eb_user LIKE 'avatar';
```
## 测试用例
### 测试用例 1已关注且主播在线
- **用户**43 (xiaofeng)
- **关注**41 (夏至已至)
- **直播间**:火影忍者 (is_live = 1)
- **预期**:能在关注页面看到这个直播间
### 测试用例 2已关注但主播不在线
- **用户**43 (xiaofeng)
- **关注**41 (夏至已至)
- **直播间**11, aedfsd (is_live = 0)
- **预期**:显示"关注的主播都不在线"
### 测试用例 3未关注任何人
- **用户**:新用户
- **关注**:无
- **预期**:显示"还没有关注主播"
### 测试用例 4未登录
- **用户**:未登录
- **预期**:显示"请先登录"
## 相关文件
- 测试脚本:`test_user_43_follow.sql`
- 修复脚本:`fix_follow_status.sql`
- 调试脚本:`debug_follow_rooms.sql`
- Android 代码:`android-app/app/src/main/java/com/example/livestreaming/MainActivity.java`
- 后端代码:`Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/FollowController.java`
## 总结
问题的根本原因是 **关注状态字段值不一致**:数据库中存储的是字符串 `"关注"`,而字段定义是 `tinyint(4)`
**最佳解决方案**:执行 `fix_follow_status.sql` 统一将状态值改为数字 `'1'``'0'`
修复后,用户 43 应该能在关注页面看到用户 41 正在直播的"火影忍者"房间。