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

5.2 KiB
Raw Blame History

关注页面问题总结

问题现象

用户 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 = "关注" (字符串)

后端查询条件

WHERE follow_status IN ('1', '关注')

Android 端查询条件

WHERE follow_status IN ('1', '关注')

虽然查询条件包含了 '关注',但是:

  1. 数据类型不一致可能导致索引失效
  2. 不同数据库版本对字符串比较的处理可能不同
  3. 字段定义为 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 应用

  1. 登录用户 43 (xiaofeng)
  2. 进入"关注"标签页
  3. 应该能看到用户 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 正在直播的"火影忍者"房间。