210 lines
5.2 KiB
Markdown
210 lines
5.2 KiB
Markdown
|
|
# 关注页面问题总结
|
|||
|
|
|
|||
|
|
## 问题现象
|
|||
|
|
用户 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,正在直播)**
|
|||
|
|
- 房间 1:11 (is_live = 0)
|
|||
|
|
- 房间 9:aedfsd (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 正在直播的"火影忍者"房间。
|