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