zhibo/关注页面问题总结.md

210 lines
5.2 KiB
Markdown
Raw Normal View History

2026-01-03 15:32:31 +08:00
# 关注页面问题总结
## 问题现象
用户 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 正在直播的"火影忍者"房间。