# 关注页面问题总结 ## 问题现象 用户 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 正在直播的"火影忍者"房间。