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

306 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 观看历史重复问题修复指南
## 🎯 问题描述
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清理数据库