5.2 KiB
5.2 KiB
关注页面问题总结
问题现象
用户 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 = "关注" (字符串)
后端查询条件:
WHERE follow_status IN ('1', '关注')
Android 端查询条件:
WHERE follow_status IN ('1', '关注')
虽然查询条件包含了 '关注',但是:
- 数据类型不一致可能导致索引失效
- 不同数据库版本对字符串比较的处理可能不同
- 字段定义为
tinyint(4)但存储了字符串值
解决方案
方案 1:统一关注状态值(推荐)
执行 fix_follow_status.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:修改查询条件
如果不想修改数据,可以修改查询条件:
后端修改:
// 修改前
WHERE follow_status IN ('1', '关注')
// 修改后
WHERE (follow_status = '1' OR follow_status = '关注')
但这不是最佳实践,因为:
- 性能较差
- 数据不规范
- 可能导致其他问题
执行步骤
1. 备份数据(重要!)
CREATE TABLE eb_follow_record_backup AS
SELECT * FROM eb_follow_record;
2. 执行修复脚本
mysql -u root -p zhibo < fix_follow_status.sql
3. 验证修复结果
执行 test_user_43_follow.sql 验证:
mysql -u root -p zhibo < test_user_43_follow.sql
预期结果:
- 用户 43 应该能看到用户 41 的关注记录
- 应该能看到用户 41 的 3 个直播间
- 应该能看到正在直播的"火影忍者"房间
4. 重启后端服务
cd /root/zhibo/Zhibo/zhibo-h/crmeb-front
./restart.sh
5. 测试 Android 应用
- 登录用户 43 (xiaofeng)
- 进入"关注"标签页
- 应该能看到用户 41 的直播间"火影忍者"
预防措施
1. 修改数据库表定义
确保 follow_status 字段使用数字类型:
ALTER TABLE eb_follow_record
MODIFY COLUMN follow_status TINYINT(4) NOT NULL DEFAULT 1
COMMENT '关注状态:1-已关注 0-已取消';
2. 添加数据库约束
ALTER TABLE eb_follow_record
ADD CONSTRAINT chk_follow_status
CHECK (follow_status IN (0, 1));
3. 后端代码规范
在插入/更新关注记录时,统一使用数字:
record.setFollowStatus("1"); // 关注
record.setFollowStatus("0"); // 取消关注
4. 添加单元测试
测试关注功能的各种场景,确保数据一致性。
其他发现
1. 直播间表缺少字段
eb_live_room 表缺少 cover_url 字段,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 字段用于存储用户头像。
检查:
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 正在直播的"火影忍者"房间。