zhibo/观看历史重复问题修复指南.md

306 lines
8.4 KiB
Markdown
Raw Normal View 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脚本推荐
```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<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. **检查数据库**
```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清理数据库