zhibo/观看历史重复问题修复指南.md
xiao12feng8 a619bb1750 修复:首页标签分类+我的挚友处理+历史记录
优化:缘池界面+消息搜索界面
2026-01-05 16:47:07 +08:00

8.4 KiB
Raw Blame History

观看历史重复问题修复指南

🎯 问题描述

  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脚本推荐

# 连接到数据库
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. 验证应用界面

  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

解决: 使用子查询的临时表

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);
}

工作原理:

  1. 每次记录观看历史时,先检查是否已存在
  2. 如果存在,更新记录(更新时间、累加观看时长)
  3. 如果不存在,插入新记录
  4. 唯一索引确保不会插入重复数据

预期效果

修复完成后:

  1. 数据库:

    • 每个用户对每个直播间只有一条记录
    • 有唯一索引防止重复
    • 记录按最后观看时间排序
  2. 应用界面:

    • 观看历史列表无重复
    • 封面在左边100x100dp
    • 标题在右边最多2行
    • 主播名称清晰显示
    • 观看时间格式正确
    • 直播中标签显示在封面上
  3. 用户体验:

    • 界面更清晰美观
    • 信息层次分明
    • 点击可跳转到直播间
    • 下拉刷新正常工作

📞 技术支持

如果遇到问题:

  1. 检查数据库

    SELECT * FROM eb_view_history WHERE user_id = 43 ORDER BY update_time DESC;
    
  2. 检查后台日志

    tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史"
    
  3. 检查Android日志

    adb logcat | grep -E "MyRecords|观看历史"
    

完成时间: 2026-01-05
修改文件: 2个布局文件 + SQL脚本
状态: 已完成需要执行SQL清理数据库