8.4 KiB
8.4 KiB
观看历史重复问题修复指南
🎯 问题描述
- 观看历史出现重复记录 - 同一个直播间显示多次
- 界面布局需要优化 - 封面在左边,标题、主播名、观看时间在右边
✅ 已完成的修复
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脚本(推荐)
# 连接到数据库
mysql -u root -p zhibo
# 执行清理脚本
source Zhibo/zhibo-h/sql/fix_duplicate_view_history.sql
方法2:手动执行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应用
cd android-app
./gradlew assembleDebug
步骤3:安装并测试
# 安装应用
adb install -r app/build/outputs/apk/debug/app-debug.apk
# 清除应用数据(可选,确保使用新布局)
adb shell pm clear com.example.livestreaming
🔍 验证修复
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;
-- 应该返回空结果
-- 查看唯一索引是否创建成功
SHOW INDEX FROM eb_view_history WHERE Key_name = 'idx_user_target';
2. 验证应用界面
- 打开应用
- 登录账号
- 进入"我的" → "我的记录" → "观看历史"
- 检查:
- ✅ 没有重复记录
- ✅ 封面在左边(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
解决: 使用子查询的临时表
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缓存
解决:
# 清理缓存
cd android-app
./gradlew clean
# 重新编译
./gradlew assembleDebug
# 卸载旧版本
adb uninstall com.example.livestreaming
# 安装新版本
adb install app/build/outputs/apk/debug/app-debug.apk
📝 后台去重逻辑说明
后台已经实现了去重逻辑(UserActivityRecordServiceImpl.java):
// 检查是否已存在相同记录(同一用户、同一目标)
String checkSql = "SELECT id FROM eb_view_history WHERE user_id = ? AND target_type = ? AND target_id = ?";
List<Map<String, Object>> 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);
}
工作原理:
- 每次记录观看历史时,先检查是否已存在
- 如果存在,更新记录(更新时间、累加观看时长)
- 如果不存在,插入新记录
- 唯一索引确保不会插入重复数据
✅ 预期效果
修复完成后:
-
数据库:
- ✅ 每个用户对每个直播间只有一条记录
- ✅ 有唯一索引防止重复
- ✅ 记录按最后观看时间排序
-
应用界面:
- ✅ 观看历史列表无重复
- ✅ 封面在左边(100x100dp)
- ✅ 标题在右边(最多2行)
- ✅ 主播名称清晰显示
- ✅ 观看时间格式正确
- ✅ 直播中标签显示在封面上
-
用户体验:
- ✅ 界面更清晰美观
- ✅ 信息层次分明
- ✅ 点击可跳转到直播间
- ✅ 下拉刷新正常工作
📞 技术支持
如果遇到问题:
-
检查数据库
SELECT * FROM eb_view_history WHERE user_id = 43 ORDER BY update_time DESC; -
检查后台日志
tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" -
检查Android日志
adb logcat | grep -E "MyRecords|观看历史"
完成时间: 2026-01-05
修改文件: 2个(布局文件 + SQL脚本)
状态: ✅ 已完成,需要执行SQL清理数据库