# 观看历史重复问题修复指南 ## 🎯 问题描述 1. **观看历史出现重复记录** - 同一个直播间显示多次 2. **界面布局需要优化** - 封面在左边,标题、主播名、观看时间在右边 --- ## ✅ 已完成的修复 ### 1. 优化布局文件 **文件**: `android-app/app/src/main/res/layout/item_record.xml` **修改内容**: - ✅ 封面图从80dp增大到100dp,更清晰 - ✅ 封面固定在左边,使用 `layout_constraintStart_toStartOf="parent"` - ✅ 右侧内容区域:标题(2行)、主播名、观看时间 - ✅ 移除底部分割线,使用卡片间距 - ✅ 增加卡片阴影效果 **布局结构**: ``` ┌─────────────────────────────────────────┐ │ ┌────────┐ 标题标题标题标题标题标题 │ │ │ │ 标题标题标题 │ │ │ 封面 │ [直播间] 主播名称 │ │ │ │ │ │ │ 100x100│ 2024-01-05 15:30 │ │ └────────┘ │ └─────────────────────────────────────────┘ ``` ### 2. 创建数据库清理脚本 **文件**: `Zhibo/zhibo-h/sql/fix_duplicate_view_history.sql` **功能**: - ✅ 查看重复数据 - ✅ 删除重复记录,保留最新的一条 - ✅ 添加唯一索引,防止将来再次出现重复 --- ## 🔧 修复步骤 ### 步骤1:清理数据库中的重复数据 #### 方法1:使用SQL脚本(推荐) ```bash # 连接到数据库 mysql -u root -p zhibo # 执行清理脚本 source Zhibo/zhibo-h/sql/fix_duplicate_view_history.sql ``` #### 方法2:手动执行SQL ```sql -- 1. 查看重复数据 SELECT user_id, target_type, target_id, COUNT(*) as count FROM eb_view_history GROUP BY user_id, target_type, target_id HAVING COUNT(*) > 1; -- 2. 删除重复数据,保留最新的一条 DELETE FROM eb_view_history WHERE id NOT IN ( SELECT * FROM ( SELECT MAX(id) as id FROM eb_view_history GROUP BY user_id, target_type, target_id ) AS temp ); -- 3. 添加唯一索引,防止将来再次出现重复 ALTER TABLE eb_view_history ADD UNIQUE INDEX idx_user_target (user_id, target_type, target_id); ``` ### 步骤2:重新编译Android应用 ```bash cd android-app ./gradlew assembleDebug ``` ### 步骤3:安装并测试 ```bash # 安装应用 adb install -r app/build/outputs/apk/debug/app-debug.apk # 清除应用数据(可选,确保使用新布局) adb shell pm clear com.example.livestreaming ``` --- ## 🔍 验证修复 ### 1. 验证数据库 ```sql -- 检查是否还有重复数据 SELECT user_id, target_type, target_id, COUNT(*) as count FROM eb_view_history GROUP BY user_id, target_type, target_id HAVING COUNT(*) > 1; -- 应该返回空结果 -- 查看唯一索引是否创建成功 SHOW INDEX FROM eb_view_history WHERE Key_name = 'idx_user_target'; ``` ### 2. 验证应用界面 1. **打开应用** 2. **登录账号** 3. **进入"我的" → "我的记录" → "观看历史"** 4. **检查**: - ✅ 没有重复记录 - ✅ 封面在左边(100x100dp) - ✅ 标题在右边(最多2行) - ✅ 主播名称显示正确 - ✅ 观看时间显示正确 - ✅ 直播中标签显示在封面右上角 --- ## 📊 布局对比 ### 修改前 ``` ┌─────────────────────────────────────────┐ │ ┌──────┐ 标题标题标题标题标题标题标题 │ │ │ │ [直播间] 主播名称 │ │ │ 封面 │ ❤ 1.2万 │ │ │ 80x80│ 2024-01-04 · 观看32分钟 │ │ └──────┘ │ │ ───────────────────────────────────── │ ← 分割线 └─────────────────────────────────────────┘ ``` ### 修改后 ``` ┌─────────────────────────────────────────┐ │ ┌────────┐ 标题标题标题标题标题标题 │ │ │ │ 标题标题标题 │ │ │ 封面 │ [直播间] 主播名称 │ │ │ │ │ │ │ 100x100│ 2024-01-05 15:30 │ │ └────────┘ │ └─────────────────────────────────────────┘ ``` **改进点**: - ✅ 封面更大(80dp → 100dp) - ✅ 标题可以显示2行 - ✅ 布局更清晰,信息层次分明 - ✅ 移除分割线,使用卡片间距 - ✅ 增加阴影效果 --- ## 🐛 问题排查 ### 问题1:数据库清理失败 **错误**: `You can't specify target table 'eb_view_history' for update in FROM clause` **解决**: 使用子查询的临时表 ```sql DELETE FROM eb_view_history WHERE id NOT IN ( SELECT * FROM ( SELECT MAX(id) as id FROM eb_view_history GROUP BY user_id, target_type, target_id ) AS temp -- 必须使用临时表 ); ``` ### 问题2:唯一索引创建失败 **错误**: `Duplicate entry '43-room-8' for key 'idx_user_target'` **原因**: 数据库中仍有重复数据 **解决**: 先执行删除重复数据的SQL,再创建索引 ### 问题3:布局没有更新 **原因**: Android Studio缓存 **解决**: ```bash # 清理缓存 cd android-app ./gradlew clean # 重新编译 ./gradlew assembleDebug # 卸载旧版本 adb uninstall com.example.livestreaming # 安装新版本 adb install app/build/outputs/apk/debug/app-debug.apk ``` --- ## 📝 后台去重逻辑说明 后台已经实现了去重逻辑(`UserActivityRecordServiceImpl.java`): ```java // 检查是否已存在相同记录(同一用户、同一目标) String checkSql = "SELECT id FROM eb_view_history WHERE user_id = ? AND target_type = ? AND target_id = ?"; List> existing = jdbcTemplate.queryForList(checkSql, userId, targetType, targetId); if (!existing.isEmpty()) { // 更新已有记录 String updateSql = "UPDATE eb_view_history SET target_title = ?, view_duration = COALESCE(view_duration, 0) + ?, " + "update_time = NOW() WHERE user_id = ? AND target_type = ? AND target_id = ?"; jdbcTemplate.update(updateSql, targetTitle, duration != null ? duration : 0, userId, targetType, targetId); } else { // 插入新记录 String insertSql = "INSERT INTO eb_view_history (user_id, target_type, target_id, target_title, view_duration, create_time, update_time) " + "VALUES (?, ?, ?, ?, ?, NOW(), NOW())"; jdbcTemplate.update(insertSql, userId, targetType, targetId, targetTitle, duration != null ? duration : 0); } ``` **工作原理**: 1. 每次记录观看历史时,先检查是否已存在 2. 如果存在,更新记录(更新时间、累加观看时长) 3. 如果不存在,插入新记录 4. 唯一索引确保不会插入重复数据 --- ## ✅ 预期效果 修复完成后: 1. **数据库**: - ✅ 每个用户对每个直播间只有一条记录 - ✅ 有唯一索引防止重复 - ✅ 记录按最后观看时间排序 2. **应用界面**: - ✅ 观看历史列表无重复 - ✅ 封面在左边(100x100dp) - ✅ 标题在右边(最多2行) - ✅ 主播名称清晰显示 - ✅ 观看时间格式正确 - ✅ 直播中标签显示在封面上 3. **用户体验**: - ✅ 界面更清晰美观 - ✅ 信息层次分明 - ✅ 点击可跳转到直播间 - ✅ 下拉刷新正常工作 --- ## 📞 技术支持 如果遇到问题: 1. **检查数据库** ```sql SELECT * FROM eb_view_history WHERE user_id = 43 ORDER BY update_time DESC; ``` 2. **检查后台日志** ```bash tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" ``` 3. **检查Android日志** ```bash adb logcat | grep -E "MyRecords|观看历史" ``` --- **完成时间**: 2026-01-05 **修改文件**: 2个(布局文件 + SQL脚本) **状态**: ✅ 已完成,需要执行SQL清理数据库