From 1124ce7d82bb332cfea13706ef09b0abd876e59d Mon Sep 17 00:00:00 2001 From: xiao12feng8 <16507319+xiao12feng8@user.noreply.gitee.com> Date: Tue, 6 Jan 2026 10:25:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=EF=BC=9A=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=86=97=E4=BD=99=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android端API路径修复指南.md | 285 --------- Log/2-项目功能与部署指南.md | 2 +- add_dynamic_test_data.sql | 19 - android-app/app/build.gradle.kts | 4 +- android-app/app/src/main/AndroidManifest.xml | 3 + .../example/livestreaming/MainActivity.java | 42 +- .../location/TianDiTuLocationService.java | 12 +- .../app/src/main/res/drawable/ic_back.xml | 10 + .../app/src/main/res/drawable/ic_empty.xml | 13 + .../main/res/layout/activity_broadcast.xml | 7 +- .../main/res/layout/activity_room_detail.xml | 13 +- check_and_complete_fan_group.sql | 133 ---- check_fan_group_data.sql | 44 -- check_fan_group_menu.sql | 35 -- check_report_data.sql | 43 -- check_sensitive_word.sql | 56 -- complete_fan_group_system.sql | 77 --- fan_group_complete_setup.sql | 80 --- fan_group_real_data.sql | 120 ---- fan_group_system_check.sql | 60 -- fix_customer_service_group.sql | 45 -- insert_fan_group_data.sql | 11 - remove_fangroup_menu.sql | 13 - remove_fangroup_toplevel.sql | 5 - setup_fan_group_data.sql | 200 ------ update_signin_data.sql | 19 - 封禁系统功能说明.md | 188 ------ 直播平台功能交互逻辑报告.md | 592 ------------------ 观看历史功能-zhibo-h后台说明.md | 277 -------- 观看历史功能-完成报告.md | 371 ----------- 观看历史功能-快速指南.md | 177 ------ 观看历史功能-最终修复方案.md | 270 -------- 观看历史功能-最终总结.md | 243 ------- 观看历史功能-检查结果.md | 217 ------- 观看历史功能实现说明.md | 122 ---- 观看历史重复问题修复指南.md | 305 --------- 36 files changed, 70 insertions(+), 4043 deletions(-) delete mode 100644 Android端API路径修复指南.md delete mode 100644 add_dynamic_test_data.sql create mode 100644 android-app/app/src/main/res/drawable/ic_back.xml create mode 100644 android-app/app/src/main/res/drawable/ic_empty.xml delete mode 100644 check_and_complete_fan_group.sql delete mode 100644 check_fan_group_data.sql delete mode 100644 check_fan_group_menu.sql delete mode 100644 check_report_data.sql delete mode 100644 check_sensitive_word.sql delete mode 100644 complete_fan_group_system.sql delete mode 100644 fan_group_complete_setup.sql delete mode 100644 fan_group_real_data.sql delete mode 100644 fan_group_system_check.sql delete mode 100644 fix_customer_service_group.sql delete mode 100644 insert_fan_group_data.sql delete mode 100644 remove_fangroup_menu.sql delete mode 100644 remove_fangroup_toplevel.sql delete mode 100644 setup_fan_group_data.sql delete mode 100644 update_signin_data.sql delete mode 100644 封禁系统功能说明.md delete mode 100644 直播平台功能交互逻辑报告.md delete mode 100644 观看历史功能-zhibo-h后台说明.md delete mode 100644 观看历史功能-完成报告.md delete mode 100644 观看历史功能-快速指南.md delete mode 100644 观看历史功能-最终修复方案.md delete mode 100644 观看历史功能-最终总结.md delete mode 100644 观看历史功能-检查结果.md delete mode 100644 观看历史功能实现说明.md delete mode 100644 观看历史重复问题修复指南.md diff --git a/Android端API路径修复指南.md b/Android端API路径修复指南.md deleted file mode 100644 index 5a7713da..00000000 --- a/Android端API路径修复指南.md +++ /dev/null @@ -1,285 +0,0 @@ -# Android端API路径修复指南 - -## 🎯 目标 - -将Android端的观看历史API调用路径修改为与zhibo-h后台匹配。 - ---- - -## 📝 需要修改的文件 - -### 文件1: ApiService.java - -**位置**: `android-app/app/src/main/java/com/zbkj/front/net/ApiService.java` - -#### 修改内容 - -找到以下接口定义并修改: - -```java -// ==================== 用户活动记录 ==================== - -/** - * 获取观看历史 - */ -@GET("api/front/activity/view/history") // ← 修改这里:view-history 改为 view/history -Call>>> getViewHistory( - @Query("targetType") String targetType, // ← 修改这里:type 改为 targetType - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 清除观看历史 - */ -@DELETE("api/front/activity/view/history") // ← 修改这里:view-history 改为 view/history -Call> clearViewHistory(@Query("targetType") String targetType); // ← 修改这里:type 改为 targetType - -/** - * 获取点赞记录 - */ -@GET("api/front/activity/like/records") // ← 修改这里:like-records 改为 like/records -Call>>> getLikeRecords( - @Query("targetType") String targetType, // ← 修改这里:type 改为 targetType - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 获取收藏的作品 - */ -@GET("api/front/activity/collect/works") // ← 修改这里:collected-works 改为 collect/works -Call>>> getCollectedWorks( - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 获取关注记录 - */ -@GET("api/front/activity/follow/records") // ← 修改这里:follow-records 改为 follow/records -Call>>> getFollowRecords( - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 记录观看历史(新版) - */ -@POST("api/front/activity/view/record") // ← 修改这里:record-view 改为 view/record -Call>> recordViewHistoryNew(@Body Map body); - -/** - * 调试Token - */ -@GET("api/front/activity/debug/token") // ← 修改这里:debug-token 改为 debug/token -Call>> debugToken(); -``` - ---- - -### 文件2: RoomDetailActivity.java - -**位置**: `android-app/app/src/main/java/com/zbkj/front/livestreaming/RoomDetailActivity.java` - -#### 修改内容 - -找到 `recordWatchHistory()` 方法,确保参数名正确: - -```java -private void recordWatchHistory() { - try { - if (!AuthHelper.isLoggedIn(this)) { - return; // 未登录用户不记录 - } - - if (TextUtils.isEmpty(roomId)) { - return; - } - - ApiService apiService = ApiClient.getService(getApplicationContext()); - - // 使用新的统一观看历史API - java.util.Map body = new java.util.HashMap<>(); - body.put("targetType", "room"); // ✅ 正确:targetType - body.put("targetId", roomId); - body.put("targetTitle", "直播间"); - body.put("duration", 0); // ✅ 正确:duration(不是viewDuration) - - Call>> call = apiService.recordViewHistoryNew(body); - - call.enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - android.util.Log.d("RoomDetail", "观看历史记录成功"); - // 房间信息加载后更新观看历史 - updateWatchHistoryWithRoomInfo(); - } else { - android.util.Log.w("RoomDetail", "记录观看历史失败: " + - (response.body() != null ? response.body().getMessage() : "unknown")); - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - // 忽略错误,不影响直播观看 - android.util.Log.w("RoomDetail", "记录观看历史失败: " + t.getMessage()); - } - }); - } catch (Exception e) { - // 忽略所有异常,不影响直播观看 - android.util.Log.w("RoomDetail", "记录观看历史失败: " + e.getMessage()); - } -} -``` - -找到 `updateWatchHistoryWithRoomInfo()` 方法,确保参数名正确: - -```java -private void updateWatchHistoryWithRoomInfo() { - if (room == null || !AuthHelper.isLoggedIn(this)) { - return; - } - - try { - ApiService apiService = ApiClient.getService(getApplicationContext()); - - java.util.Map body = new java.util.HashMap<>(); - body.put("targetType", "room"); // ✅ 正确:targetType - body.put("targetId", roomId); - body.put("targetTitle", room.getTitle() != null ? room.getTitle() : "直播间"); - body.put("duration", 0); // ✅ 正确:duration(不是viewDuration) - - apiService.recordViewHistoryNew(body).enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - android.util.Log.d("RoomDetail", "观看历史更新成功"); - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - // 忽略错误 - } - }); - } catch (Exception e) { - // 忽略所有异常 - } -} -``` - ---- - -## 🔍 修改对比表 - -| 功能 | 旧路径(错误) | 新路径(正确) | 参数变化 | -|------|--------------|--------------|---------| -| 记录观看历史 | `/activity/record-view` | `/activity/view/record` | - | -| 获取观看历史 | `/activity/view-history` | `/activity/view/history` | `type` → `targetType` | -| 清除观看历史 | `/activity/view-history` | `/activity/view/history` | `type` → `targetType` | -| 获取点赞记录 | `/activity/like-records` | `/activity/like/records` | `type` → `targetType` | -| 获取收藏记录 | `/activity/collected-works` | `/activity/collect/works` | - | -| 获取关注记录 | `/activity/follow-records` | `/activity/follow/records` | - | -| Token调试 | `/activity/debug-token` | `/activity/debug/token` | - | - ---- - -## ✅ 修改检查清单 - -- [ ] 修改 `ApiService.java` 中的所有API路径 -- [ ] 修改 `ApiService.java` 中的参数名(`type` → `targetType`) -- [ ] 检查 `RoomDetailActivity.java` 中的参数名(`duration` 不是 `viewDuration`) -- [ ] 重新编译Android应用 -- [ ] 测试记录观看历史功能 -- [ ] 测试查看观看历史功能 -- [ ] 检查日志输出 - ---- - -## 🧪 测试步骤 - -### 1. 编译应用 - -```bash -cd android-app -./gradlew assembleDebug -``` - -### 2. 安装并运行 - -```bash -adb install -r app/build/outputs/apk/debug/app-debug.apk -``` - -### 3. 测试流程 - -1. **登录应用** - - 确保使用有效的账号登录 - -2. **进入直播间** - - 选择任意直播间进入 - - 查看Logcat日志,搜索 "观看历史" - -3. **检查日志** - ``` - RoomDetail: 观看历史记录成功 - RoomDetail: 观看历史更新成功 - ``` - -4. **查看历史记录** - - 返回首页 - - 进入"我的" → "我的记录" - - 切换到"观看历史"标签页 - - 应该能看到刚才观看的直播间 - -### 4. 调试Token(如果有问题) - -使用Postman或curl测试: - -```bash -curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -## 🐛 常见问题 - -### 问题1:401 未登录 - -**原因**: Token未正确传递 - -**解决**: -1. 检查 `ApiClient.java` 中的Token拦截器 -2. 确保Token格式正确:`Bearer {token}` -3. 使用 `/activity/debug/token` 接口验证 - -### 问题2:404 Not Found - -**原因**: API路径错误 - -**解决**: -1. 检查 `ApiService.java` 中的路径是否正确 -2. 确保使用 `/` 而不是 `-` -3. 检查后台服务是否运行在8081端口 - -### 问题3:参数错误 - -**原因**: 参数名不匹配 - -**解决**: -1. 确保使用 `targetType` 而不是 `type` -2. 确保使用 `duration` 而不是 `viewDuration` -3. 检查后台日志 - ---- - -## 📚 相关文档 - -- [观看历史功能-zhibo-h后台说明.md](./观看历史功能-zhibo-h后台说明.md) -- [观看历史功能-快速指南.md](./观看历史功能-快速指南.md) - ---- - -**最后更新**: 2026-01-05 -**状态**: 📝 待修改 diff --git a/Log/2-项目功能与部署指南.md b/Log/2-项目功能与部署指南.md index 9890c177..bb076e71 100644 --- a/Log/2-项目功能与部署指南.md +++ b/Log/2-项目功能与部署指南.md @@ -20,4 +20,4 @@ APK: android-app/app/build/outputs/apk/release/ 前端: Zhibo/admin/dist/ -将前端访问的服务改成8083,本地改回8081 \ No newline at end of file +将app部署改成8083,本地开发改成8081 \ No newline at end of file diff --git a/add_dynamic_test_data.sql b/add_dynamic_test_data.sql deleted file mode 100644 index 6a42f3bc..00000000 --- a/add_dynamic_test_data.sql +++ /dev/null @@ -1,19 +0,0 @@ --- 添加社会动态测试数据 --- 先检查表是否存在 -SELECT COUNT(*) as count FROM eb_dynamic; - --- 插入测试数据(使用已有用户) -INSERT INTO `eb_dynamic` (`uid`, `nickname`, `avatar`, `content`, `images`, `location`, `like_count`, `comment_count`, `share_count`, `view_count`, `is_top`, `status`, `create_time`) VALUES -(41, '夏至已至', 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKq2CRmib1mpu4hOFYtPNLkpU5ILwYTYsvVYB0WYQ0hL4sKAGicicO0OicYCT1/132', '今天天气真好,出来直播啦!大家快来看我~', '["https://picsum.photos/400/300?random=101"]', '北京市', 128, 32, 8, 560, 0, 1, NOW() - INTERVAL 2 HOUR), -(42, '测试用户', '', '分享一下我的日常生活,希望大家喜欢❤️', '["https://picsum.photos/400/300?random=102","https://picsum.photos/400/300?random=103"]', '上海市', 256, 45, 12, 890, 0, 1, NOW() - INTERVAL 5 HOUR), -(43, 'xiaofeng', '', '新的一天,新的开始!今晚8点准时开播,不见不散~', '["https://picsum.photos/400/300?random=104"]', '广州市', 89, 18, 5, 320, 0, 1, NOW() - INTERVAL 1 DAY), -(100, '吉惟同学', 'https://img.zcool.cn/community/01a9a65d143edaa8012187f447cfef.jpg', '周末愉快!有没有想一起玩游戏的小伙伴?', '[]', '深圳市', 167, 28, 9, 450, 1, 1, NOW() - INTERVAL 3 HOUR), -(101, '国瑞哥', 'https://img.zcool.cn/community/01b72057a7e0790000018c1bf4fce0.png', '感谢大家的支持,粉丝破万啦!撒花🎉', '["https://picsum.photos/400/300?random=105","https://picsum.photos/400/300?random=106","https://picsum.photos/400/300?random=107"]', '成都市', 512, 89, 35, 1580, 0, 1, NOW() - INTERVAL 6 HOUR), -(102, '玖书小姐姐', '', '今天学了一首新歌,晚上直播间唱给大家听~', '["https://picsum.photos/400/300?random=108"]', '杭州市', 78, 15, 3, 210, 0, 1, NOW() - INTERVAL 8 HOUR); - --- 查看插入的数据 -SELECT d.*, u.avatar as user_avatar -FROM eb_dynamic d -LEFT JOIN eb_user u ON d.uid = u.uid -ORDER BY d.id DESC -LIMIT 10; diff --git a/android-app/app/build.gradle.kts b/android-app/app/build.gradle.kts index 0194f30c..48376a55 100644 --- a/android-app/app/build.gradle.kts +++ b/android-app/app/build.gradle.kts @@ -71,8 +71,8 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } buildFeatures { diff --git a/android-app/app/src/main/AndroidManifest.xml b/android-app/app/src/main/AndroidManifest.xml index 8ed62854..f9563590 100644 --- a/android-app/app/src/main/AndroidManifest.xml +++ b/android-app/app/src/main/AndroidManifest.xml @@ -4,6 +4,9 @@ + + + diff --git a/android-app/app/src/main/java/com/example/livestreaming/MainActivity.java b/android-app/app/src/main/java/com/example/livestreaming/MainActivity.java index 1f4d24cb..b29319dc 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/MainActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/MainActivity.java @@ -1749,16 +1749,16 @@ public class MainActivity extends AppCompatActivity { allBackendCategories.addAll(categories); runOnUiThread(() -> { - // 从"我的频道"加载用户保存的频道列表 - List myChannelList = loadMyChannels(); - // 清空现有标签 binding.categoryTabs.removeAllTabs(); - // 只显示"我的频道"里的内容 - for (ChannelManagerAdapter.ChannelItem channel : myChannelList) { - if (channel != null && channel.getName() != null) { - binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText(channel.getName())); + // 添加"推荐"作为第一个标签 + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("推荐")); + + // 直接使用后端返回的分类 + for (com.example.livestreaming.net.CategoryResponse cat : categories) { + if (cat != null && cat.getName() != null) { + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText(cat.getName())); } } @@ -1766,7 +1766,7 @@ public class MainActivity extends AppCompatActivity { String lastCategory = CategoryFilterManager.getLastCategory(this); restoreCategoryTabSelection(); - Log.d(TAG, "updateCategoryTabs() 分类标签更新完成,共 " + binding.categoryTabs.getTabCount() + " 个标签(只显示我的频道)"); + Log.d(TAG, "updateCategoryTabs() 分类标签更新完成,共 " + binding.categoryTabs.getTabCount() + " 个标签(直接使用后端分类)"); }); } @@ -1777,23 +1777,33 @@ public class MainActivity extends AppCompatActivity { if (binding == null || binding.categoryTabs == null) return; runOnUiThread(() -> { - // 从"我的频道"加载用户保存的频道列表 - List myChannelList = loadMyChannels(); - // 清空现有标签 binding.categoryTabs.removeAllTabs(); - // 只显示"我的频道"里的内容 - for (ChannelManagerAdapter.ChannelItem channel : myChannelList) { - if (channel != null && channel.getName() != null) { - binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText(channel.getName())); + // 使用后端分类(如果已加载) + if (!allBackendCategories.isEmpty()) { + // 添加"推荐"作为第一个标签 + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("推荐")); + + // 添加后端分类 + for (com.example.livestreaming.net.CategoryResponse cat : allBackendCategories) { + if (cat != null && cat.getName() != null) { + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText(cat.getName())); + } } + } else { + // 后端分类未加载,使用硬编码默认值 + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("推荐")); + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("娱乐")); + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("游戏")); + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("音乐")); + binding.categoryTabs.addTab(binding.categoryTabs.newTab().setText("户外")); } // 恢复上次选中的分类 restoreCategoryTabSelection(); - Log.d(TAG, "useDefaultCategories() 使用我的频道,共 " + binding.categoryTabs.getTabCount() + " 个标签"); + Log.d(TAG, "useDefaultCategories() 使用默认分类,共 " + binding.categoryTabs.getTabCount() + " 个标签"); }); } diff --git a/android-app/app/src/main/java/com/example/livestreaming/location/TianDiTuLocationService.java b/android-app/app/src/main/java/com/example/livestreaming/location/TianDiTuLocationService.java index 99ef0970..e1744c67 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/location/TianDiTuLocationService.java +++ b/android-app/app/src/main/java/com/example/livestreaming/location/TianDiTuLocationService.java @@ -59,20 +59,13 @@ public class TianDiTuLocationService { this.context = context.getApplicationContext(); this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); } - + /** * 开始定位 */ public void startLocation(OnLocationResultListener listener) { this.resultListener = listener; - // 测试模式:直接使用固定坐标(已禁用) - // if (TEST_MODE) { - // Log.d(TAG, "【测试模式】使用固定坐标 - 纬度: " + TEST_LATITUDE + ", 经度: " + TEST_LONGITUDE); - // reverseGeocode(TEST_LONGITUDE, TEST_LATITUDE); - // return; - // } - // 检查权限 if (!checkLocationPermission()) { if (resultListener != null) { @@ -210,7 +203,7 @@ public class TianDiTuLocationService { return null; } } - + /** * 逆地理编码 - 将经纬度转换为地址 */ @@ -236,7 +229,6 @@ public class TianDiTuLocationService { Log.d(TAG, "坐标检查通过,在中国境内"); // 构建请求URL - // 天地图逆地理编码API: http://api.tianditu.gov.cn/geocoder?postStr={'lon':116.397128,'lat':39.916527,'ver':1}&type=geocode&tk=您的密钥 JSONObject postData = new JSONObject(); postData.put("lon", longitude); postData.put("lat", latitude); diff --git a/android-app/app/src/main/res/drawable/ic_back.xml b/android-app/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 00000000..37d1cc41 --- /dev/null +++ b/android-app/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,10 @@ + + + diff --git a/android-app/app/src/main/res/drawable/ic_empty.xml b/android-app/app/src/main/res/drawable/ic_empty.xml new file mode 100644 index 00000000..37c25049 --- /dev/null +++ b/android-app/app/src/main/res/drawable/ic_empty.xml @@ -0,0 +1,13 @@ + + + + diff --git a/android-app/app/src/main/res/layout/activity_broadcast.xml b/android-app/app/src/main/res/layout/activity_broadcast.xml index 0a830728..b1a234d0 100644 --- a/android-app/app/src/main/res/layout/activity_broadcast.xml +++ b/android-app/app/src/main/res/layout/activity_broadcast.xml @@ -5,12 +5,11 @@ android:layout_height="match_parent" android:background="#000000"> - - + @@ -83,7 +86,11 @@ + android:layout_height="match_parent" + android:layout_gravity="center" + app:resize_mode="fit" + app:show_buffering="when_playing" + app:use_controller="true" /> >> recordViewHistoryNew(@Body Map body); - -// 修改为(正确) -@POST("api/front/activity/view/record") -Call>> recordViewHistoryNew(@Body Map body); -``` - -同时修改获取观看历史的API: - -```java -// 当前(错误) -@GET("api/front/activity/view-history") -Call>>> getViewHistory( - @Query("type") String type, - @Query("page") int page, - @Query("pageSize") int pageSize); - -// 修改为(正确) -@GET("api/front/activity/view/history") -Call>>> getViewHistory( - @Query("targetType") String targetType, // 参数名改为targetType - @Query("page") int page, - @Query("pageSize") int pageSize); -``` - -#### 方案2:在后台添加兼容路由(不推荐) - -在 `UserActivityRecordController` 中添加兼容的路由映射,但这会增加维护成本。 - ---- - -## 📊 API接口详细说明 - -### 1. 记录观看历史 - -**请求**: -```http -POST /api/front/activity/view/record -Content-Type: application/json -Authorization: Bearer {token} - -{ - "targetType": "room", // 类型:room-直播间, work-作品, profile-用户主页 - "targetId": "room-123", // 目标ID - "targetTitle": "精彩直播间", // 标题 - "duration": 120 // 观看时长(秒) -} -``` - -**响应**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "记录成功" - } -} -``` - -### 2. 获取观看历史 - -**请求**: -```http -GET /api/front/activity/view/history?targetType=room&page=1&pageSize=20 -Authorization: Bearer {token} -``` - -**响应**: -```json -{ - "code": 200, - "message": "success", - "data": { - "list": [ - { - "id": 1, - "userId": 43, - "targetType": "room", - "targetId": "8", - "targetTitle": "火影忍者", - "createTime": "2026-01-05 10:00:00", - "updateTime": "2026-01-05 10:30:00" - } - ], - "total": 10, - "pageNum": 1, - "pageSize": 20 - } -} -``` - -### 3. 清空观看历史 - -**请求**: -```http -DELETE /api/front/activity/view/history?targetType=room -Authorization: Bearer {token} -``` - -**响应**: -```json -{ - "code": 200, - "message": "清空成功", - "data": null -} -``` - ---- - -## 🗄️ 数据库表结构 - -观看历史数据存储在数据库表中(不是JSON文件): - -**表名**: `eb_user_activity_record` 或 `eb_watch_history` - -**字段**: -- `id` - 主键 -- `user_id` - 用户ID -- `target_type` - 目标类型(room/work/profile) -- `target_id` - 目标ID -- `target_title` - 目标标题 -- `duration` - 观看时长 -- `create_time` - 创建时间 -- `update_time` - 更新时间 - ---- - -## ✅ 优势 - -使用zhibo-h后台的优势: - -1. **统一管理**: 所有用户数据都在同一个数据库中 -2. **完整功能**: 不仅有观看历史,还有点赞、关注、收藏等记录 -3. **数据持久化**: 使用MySQL数据库,不是JSON文件 -4. **已经实现**: 代码已经写好,只需要调整Android端的API路径 -5. **日志完善**: 有详细的日志记录,方便调试 - ---- - -## 🚀 快速修复步骤 - -### 步骤1:修改Android端ApiService.java - -找到文件:`android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java` - -修改以下接口: - -```java -// 记录观看历史(新版) -@POST("api/front/activity/view/record") // 修改路径 -Call>> recordViewHistoryNew(@Body Map body); - -// 获取观看历史 -@GET("api/front/activity/view/history") // 修改路径 -Call>>> getViewHistory( - @Query("targetType") String targetType, // 修改参数名 - @Query("page") int page, - @Query("pageSize") int pageSize); - -// 清除观看历史 -@DELETE("api/front/activity/view/history") // 修改路径 -Call> clearViewHistory(@Query("targetType") String targetType); -``` - -### 步骤2:修改RoomDetailActivity.java - -找到 `recordWatchHistory()` 方法,确保参数名正确: - -```java -body.put("targetType", "room"); // 确保是targetType,不是type -body.put("targetId", roomId); -body.put("targetTitle", "直播间"); -body.put("duration", 0); // 确保是duration,不是viewDuration -``` - -### 步骤3:测试 - -1. 重新编译Android应用 -2. 登录应用 -3. 进入直播间 -4. 查看日志,确认API调用成功 -5. 进入"我的记录" -> "观看历史"查看 - ---- - -## 📝 注意事项 - -1. ⚠️ **不要修改live-streaming项目**:所有功能都在zhibo-h中 -2. ⚠️ **确保后台服务运行**:zhibo-h后台需要在8081端口运行 -3. ⚠️ **Token认证**:确保Android端正确传递Token -4. ⚠️ **参数名称**:注意参数名是 `targetType` 和 `duration`,不是 `type` 和 `viewDuration` - ---- - -## 🔍 调试方法 - -如果遇到问题,可以使用调试接口: - -```http -GET /api/front/activity/debug/token -Authorization: Bearer {token} -``` - -这个接口会返回: -- Token状态 -- 用户ID -- 是否登录 - ---- - -**最后更新**: 2026-01-05 -**状态**: ✅ 后台已实现,需要调整Android端API路径 diff --git a/观看历史功能-完成报告.md b/观看历史功能-完成报告.md deleted file mode 100644 index c334cc1b..00000000 --- a/观看历史功能-完成报告.md +++ /dev/null @@ -1,371 +0,0 @@ -# 观看历史功能 - 完成报告 - -## ✅ 修复完成! - -观看历史功能已经完全修复,可以正常使用了! - ---- - -## 🎯 问题总结 - -### 发现的问题 - -在 `RoomDetailActivity.java` 的 `updateWatchHistoryWithRoomInfo()` 方法中,参数名使用错误: - -```java -// ❌ 错误 -body.put("viewDuration", 0); - -// ✅ 正确 -body.put("duration", 0); -``` - -### 修复内容 - -**修改文件**: `android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java` - -**修改位置**: 第1172行左右 - -**修改内容**: 将 `viewDuration` 改为 `duration` - ---- - -## ✅ 检查结果 - -### API路径 - 完全正确 ✅ - -| 功能 | API路径 | 状态 | -|------|---------|------| -| 记录观看历史 | `POST /api/front/activity/view/record` | ✅ | -| 获取观看历史 | `GET /api/front/activity/view/history` | ✅ | -| 清除观看历史 | `DELETE /api/front/activity/view/history` | ✅ | -| 获取点赞记录 | `GET /api/front/activity/like/records` | ✅ | -| 获取关注记录 | `GET /api/front/activity/follow/records` | ✅ | -| 获取收藏记录 | `GET /api/front/activity/collect/works` | ✅ | -| Token调试 | `GET /api/front/activity/debug/token` | ✅ | - -### 参数名 - 完全正确 ✅ - -| 参数 | 状态 | -|------|------| -| `targetType` | ✅ | -| `targetId` | ✅ | -| `targetTitle` | ✅ | -| `duration` | ✅ (已修复) | -| `coverImage` | ✅ | -| `streamerName` | ✅ | - -### 代码质量 - 无错误 ✅ - -- ✅ 编译检查通过 -- ✅ 无语法错误 -- ✅ 无类型错误 - ---- - -## 🏗️ 架构说明 - -### 后台实现(zhibo-h项目) - -``` -Zhibo/zhibo-h/ -├── crmeb-front/ -│ └── controller/ -│ └── UserActivityRecordController.java ✅ 已实现 -├── crmeb-service/ -│ └── service/ -│ └── UserActivityRecordService.java ✅ 已实现 -└── 数据库表: eb_user_activity_record ✅ 已创建 -``` - -### Android端实现 - -``` -android-app/ -└── app/src/main/java/com/example/livestreaming/ - ├── net/ - │ └── ApiService.java ✅ API定义正确 - ├── RoomDetailActivity.java ✅ 已修复 - └── MyRecordsActivity.java ✅ 显示功能已实现 -``` - ---- - -## 🚀 功能说明 - -### 1. 自动记录观看历史 - -**触发时机**: 用户进入直播间时 - -**记录内容**: -- 直播间ID -- 直播间标题 -- 主播名称 -- 封面图片 -- 观看时长 - -**实现方法**: -- `recordWatchHistory()` - 进入时记录基本信息 -- `updateWatchHistoryWithRoomInfo()` - 房间信息加载后更新详细信息 - -### 2. 查看观看历史 - -**入口**: "我的" → "我的记录" → "观看历史"标签页 - -**显示内容**: -- 直播间封面 -- 直播间标题 -- 主播名称 -- 观看时间 -- 直播状态(直播中/已结束) - -**功能**: -- 点击可跳转到对应的直播间 -- 支持分页加载 -- 按最后观看时间倒序排列 - -### 3. 其他记录功能 - -同时支持: -- ✅ 点赞记录 -- ✅ 收藏记录 -- ✅ 关注记录 - ---- - -## 📊 数据流程 - -``` -用户进入直播间 - ↓ -recordWatchHistory() 被调用 - ↓ -发送 POST /api/front/activity/view/record - ↓ -后台 UserActivityRecordController 接收 - ↓ -UserActivityRecordService 处理业务逻辑 - ↓ -保存到数据库 eb_user_activity_record - ↓ -房间信息加载完成 - ↓ -updateWatchHistoryWithRoomInfo() 被调用 - ↓ -更新观看历史的详细信息 - ↓ -用户可以在"我的记录"中查看 -``` - ---- - -## 🧪 测试指南 - -### 1. 编译应用 - -```bash -cd android-app -./gradlew assembleDebug -``` - -### 2. 安装应用 - -```bash -adb install -r app/build/outputs/apk/debug/app-debug.apk -``` - -### 3. 测试步骤 - -1. **登录应用** - - 使用有效的账号登录 - -2. **进入直播间** - - 选择任意直播间进入 - - 等待几秒钟 - -3. **查看日志** - ```bash - adb logcat | grep -E "RoomDetail|观看历史" - ``` - - **期望看到**: - ``` - RoomDetail: 观看历史记录成功 - RoomDetail: 房间加载成功: 火影忍者 - RoomDetail: 观看历史更新成功 - ``` - -4. **查看观看历史** - - 返回首页 - - 进入"我的" → "我的记录" - - 切换到"观看历史"标签页 - - 应该能看到刚才观看的直播间 - -5. **测试跳转** - - 点击历史记录 - - 应该能跳转到对应的直播间 - ---- - -## 🔍 调试方法 - -### 使用调试接口 - -```bash -# 1. 测试Token状态 -curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" - -# 2. 测试记录观看历史 -curl -X POST "http://1.15.149.240:8081/api/front/activity/view/record" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -d '{ - "targetType": "room", - "targetId": "8", - "targetTitle": "火影忍者", - "duration": 120 - }' - -# 3. 测试获取观看历史 -curl -X GET "http://1.15.149.240:8081/api/front/activity/view/history?page=1&pageSize=20" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -### 查看后台日志 - -```bash -# 实时查看日志 -tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" - -# 查看错误日志 -tail -f Zhibo/zhibo-h/crmeb_front_log/log_error.log -``` - ---- - -## 📝 相关文档 - -已创建的文档: - -1. ✅ `观看历史功能-zhibo-h后台说明.md` - 后台API详细说明 -2. ✅ `Android端API路径修复指南.md` - 修复指南(已过时) -3. ✅ `观看历史功能-最终修复方案.md` - 修复方案 -4. ✅ `观看历史功能-检查结果.md` - 检查结果 -5. ✅ `观看历史功能-完成报告.md` - 本文档 - -不需要使用的文档(基于live-streaming): -- ⚠️ `观看历史功能-快速指南.md` -- ⚠️ `观看历史功能实现说明.md` -- ⚠️ `live-streaming/test-view-history.md` - ---- - -## ⚠️ 注意事项 - -### 1. 后台服务 - -确保zhibo-h后台服务正在运行: -- 本地开发:http://localhost:8081 -- 生产环境:http://1.15.149.240:8083 - -### 2. 数据库 - -确保数据库表 `eb_user_activity_record` 已创建 - -### 3. Token认证 - -确保Android端正确传递Token: -- 格式:`Bearer {token}` 或直接 `{token}` -- 位置:请求头 `Authorization` 或 `Authori-zation` - -### 4. 不要使用live-streaming - -- ❌ 不要使用 `live-streaming/server/routes/viewHistory.js` -- ❌ 不要使用 `live-streaming/server/store/viewHistoryStore.js` -- ✅ 所有功能都在 `zhibo-h` 项目中 - ---- - -## 🎉 总结 - -### 修改内容 - -**只修改了1个参数名**:`viewDuration` → `duration` - -### 修改结果 - -- ✅ 编译通过 -- ✅ 无语法错误 -- ✅ API路径正确 -- ✅ 参数名正确 -- ✅ 功能完整 - -### 预期效果 - -1. ✅ 进入直播间自动记录观看历史 -2. ✅ 房间信息加载后更新详细信息 -3. ✅ 在"我的记录"页面显示观看历史 -4. ✅ 点击可跳转到对应的直播间 -5. ✅ 显示直播状态(直播中/已结束) -6. ✅ 支持分页加载 -7. ✅ 按时间倒序排列 - ---- - -## 📞 技术支持 - -如果遇到问题: - -1. **检查后台日志** - ```bash - tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" - ``` - -2. **检查Android日志** - ```bash - adb logcat | grep -E "RoomDetail|观看历史" - ``` - -3. **使用调试接口** - ```bash - curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" - ``` - ---- - -**完成时间**: 2026-01-05 -**修改文件**: 1个 -**修改行数**: 1行 -**修改内容**: 1个参数名 -**状态**: ✅ 完成,可以测试使用 - ---- - -## 🚀 下一步 - -1. **编译应用** - ```bash - cd android-app - ./gradlew assembleDebug - ``` - -2. **安装测试** - ```bash - adb install -r app/build/outputs/apk/debug/app-debug.apk - ``` - -3. **测试功能** - - 登录 → 进入直播间 → 查看"我的记录" - -4. **验证成功** - - 观看历史能正常显示 - - 点击能跳转到直播间 - - 显示直播状态正确 - -**预计测试时间**: 5分钟 - ---- - -**🎊 恭喜!观看历史功能已经完全修复并可以正常使用了!** diff --git a/观看历史功能-快速指南.md b/观看历史功能-快速指南.md deleted file mode 100644 index 2237d31a..00000000 --- a/观看历史功能-快速指南.md +++ /dev/null @@ -1,177 +0,0 @@ -# 观看历史功能 - 快速指南 - -## 🎯 功能说明 - -用户在观看直播时,系统会自动记录观看历史,并可以在"我的记录"页面查看历史记录。 - -## ✅ 已实现的功能 - -### 后台功能 -- ✅ 自动记录用户观看直播间的历史 -- ✅ 支持分页查询观看历史 -- ✅ 支持按类型过滤(直播间/作品/用户主页) -- ✅ 自动去重(同一用户观看同一内容会更新记录) -- ✅ 记录观看次数和最后观看时间 -- ✅ 数据持久化存储 - -### Android端功能 -- ✅ 进入直播间自动记录观看历史 -- ✅ 在"我的记录"页面显示观看历史 -- ✅ 点击历史记录可跳转到对应直播间 -- ✅ 显示直播间封面、标题、主播名称等信息 -- ✅ 显示直播状态(直播中/已结束) - -## 📁 新增/修改的文件 - -### 后台文件 -``` -live-streaming/ -├── server/ -│ ├── store/ -│ │ └── viewHistoryStore.js [新增] 观看历史数据存储 -│ ├── routes/ -│ │ └── viewHistory.js [新增] 观看历史API路由 -│ └── index.js [修改] 添加路由 -├── data/ -│ └── viewHistory.json [自动生成] 数据存储文件 -└── test-api.bat [新增] API测试脚本 -``` - -### Android端文件 -``` -android-app/app/src/main/java/com/example/livestreaming/ -└── RoomDetailActivity.java [修改] 添加观看历史记录功能 -``` - -## 🚀 快速测试 - -### 1. 启动后台服务 -```bash -cd live-streaming -npm install -npm start -``` - -### 2. 测试API(Windows) -```bash -cd live-streaming -test-api.bat -``` - -### 3. Android端测试 -1. 启动Android应用 -2. 登录账号 -3. 进入任意直播间 -4. 返回首页 -> "我的" -> "我的记录" -5. 查看"观看历史"标签页 - -## 📊 API接口 - -### 记录观看历史 -``` -POST /api/front/activity/record-view -Headers: Authorization: {userId} -Body: { - "targetType": "room", - "targetId": "room-id", - "targetTitle": "直播间标题", - "coverImage": "封面URL", - "streamerName": "主播名称", - "viewDuration": 120 -} -``` - -### 获取观看历史 -``` -GET /api/front/activity/view-history?page=1&pageSize=20&type=room -Headers: Authorization: {userId} -``` - -### 清除观看历史 -``` -DELETE /api/front/activity/view-history?type=room -Headers: Authorization: {userId} -``` - -## 💡 使用场景 - -1. **用户观看直播** - - 用户进入直播间 → 自动记录观看历史 - - 用户再次进入同一直播间 → 更新观看时间和次数 - -2. **查看历史记录** - - 用户打开"我的记录" → 查看"观看历史"标签 - - 显示最近观看的直播间列表 - - 点击可快速进入直播间 - -3. **数据统计** - - 记录用户观看次数 - - 记录最后观看时间 - - 支持按时间排序 - -## 🔧 技术细节 - -### 数据存储格式 -```json -{ - "id": 1704441600000, - "userId": 1, - "targetType": "room", - "targetId": "room-123", - "targetTitle": "精彩直播间", - "coverImage": "https://example.com/cover.jpg", - "streamerName": "主播名称", - "viewDuration": 120, - "createTime": "2024-01-05T10:00:00.000Z", - "updateTime": "2024-01-05T10:02:00.000Z", - "viewCount": 3 -} -``` - -### 认证方式 -- 使用 `Authorization` 请求头传递用户ID -- 格式:`Authorization: {userId}` 或 `Authorization: Bearer {userId}` -- 未登录用户不记录观看历史 - -## 📝 注意事项 - -1. ⚠️ 用户必须登录才能记录观看历史 -2. ⚠️ 数据目前存储在JSON文件中,生产环境建议使用数据库 -3. ⚠️ 观看历史仅用户本人可见 -4. ⚠️ 同一用户观看同一内容会更新记录而不是创建新记录 - -## 🎨 界面展示 - -### 我的记录页面 -``` -┌─────────────────────────────────┐ -│ ← 我的记录 │ -├─────────────────────────────────┤ -│ 观看历史 | 点赞记录 | 收藏记录 | 关注记录 │ -├─────────────────────────────────┤ -│ ┌─────────────────────────────┐ │ -│ │ [封面图] 精彩直播间 [直播中] │ │ -│ │ 主播:测试主播 │ │ -│ │ 2024-01-05 10:00 │ │ -│ └─────────────────────────────┘ │ -│ ┌─────────────────────────────┐ │ -│ │ [封面图] 游戏直播间 │ │ -│ │ 主播:游戏主播 │ │ -│ │ 2024-01-04 20:30 │ │ -│ └─────────────────────────────┘ │ -└─────────────────────────────────┘ -``` - -## 🔮 后续优化建议 - -1. 添加观看时长的实时更新 -2. 支持用户手动删除单条历史 -3. 添加时间筛选功能(今天/本周/本月) -4. 支持导出观看历史 -5. 添加隐私设置开关 -6. 迁移到数据库存储 - -## 📚 相关文档 - -- 详细实现说明:`观看历史功能实现说明.md` -- API测试指南:`live-streaming/test-view-history.md` diff --git a/观看历史功能-最终修复方案.md b/观看历史功能-最终修复方案.md deleted file mode 100644 index fb0a5a3f..00000000 --- a/观看历史功能-最终修复方案.md +++ /dev/null @@ -1,270 +0,0 @@ -# 观看历史功能 - 最终修复方案 - -## 🎯 问题定位 - -经过详细检查,发现了**唯一需要修复的问题**: - -### ❌ 问题:参数名不一致 - -在 `RoomDetailActivity.java` 的 `updateWatchHistoryWithRoomInfo()` 方法中: - -```java -body.put("viewDuration", 0); // ❌ 错误:应该是 duration -``` - -而后台期望的参数名是: - -```java -Integer duration = body.get("duration") // ✅ 正确 -``` - ---- - -## ✅ 其他检查结果 - -### API路径 - 完全正确 ✅ - -| 功能 | Android端 | 后台 | 状态 | -|------|----------|------|------| -| 记录观看历史 | `/activity/view/record` | `/activity/view/record` | ✅ | -| 获取观看历史 | `/activity/view/history` | `/activity/view/history` | ✅ | -| 清除观看历史 | `/activity/view/history` | `/activity/view/history` | ✅ | -| 获取点赞记录 | `/activity/like/records` | `/activity/like/records` | ✅ | -| 获取关注记录 | `/activity/follow/records` | `/activity/follow/records` | ✅ | -| 获取收藏记录 | `/activity/collect/works` | `/activity/collect/works` | ✅ | - -### 参数名 - 部分正确 ⚠️ - -| 方法 | 参数 | 状态 | -|------|------|------| -| `recordWatchHistory()` | `duration` | ✅ 正确 | -| `updateWatchHistoryWithRoomInfo()` | `viewDuration` | ❌ 错误 | - ---- - -## 🔧 修复方案 - -### 需要修改的文件 - -**文件**: `android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java` - -**位置**: `updateWatchHistoryWithRoomInfo()` 方法 - -### 修改内容 - -找到第1172行左右的代码: - -```java -// ❌ 修改前(错误) -body.put("viewDuration", 0); - -// ✅ 修改后(正确) -body.put("duration", 0); -``` - -### 完整的修改代码 - -```java -private void updateWatchHistoryWithRoomInfo() { - if (room == null || !AuthHelper.isLoggedIn(this)) { - return; - } - - try { - ApiService apiService = ApiClient.getService(getApplicationContext()); - - java.util.Map body = new java.util.HashMap<>(); - body.put("targetType", "room"); - body.put("targetId", roomId); - body.put("targetTitle", room.getTitle() != null ? room.getTitle() : "直播间"); - body.put("coverImage", room.getCoverImage()); - body.put("streamerName", room.getStreamerName()); - body.put("duration", 0); // ✅ 修改这里:viewDuration → duration - - apiService.recordViewHistoryNew(body).enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - android.util.Log.d("RoomDetail", "观看历史更新成功"); - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - // 忽略错误 - } - }); - } catch (Exception e) { - // 忽略所有异常 - } -} -``` - ---- - -## 📝 修改步骤 - -### 步骤1:打开文件 - -```bash -# 使用你喜欢的编辑器打开文件 -code android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java -``` - -### 步骤2:查找并修改 - -1. 搜索 `viewDuration` -2. 找到 `updateWatchHistoryWithRoomInfo()` 方法中的这一行 -3. 将 `viewDuration` 改为 `duration` - -### 步骤3:保存并编译 - -```bash -cd android-app -./gradlew assembleDebug -``` - -### 步骤4:安装测试 - -```bash -adb install -r app/build/outputs/apk/debug/app-debug.apk -``` - ---- - -## 🧪 测试步骤 - -### 1. 启动应用并登录 - -确保使用有效的账号登录 - -### 2. 进入直播间 - -选择任意直播间进入 - -### 3. 查看日志 - -使用adb logcat查看日志: - -```bash -adb logcat | grep -E "RoomDetail|观看历史" -``` - -**期望看到的日志**: -``` -RoomDetail: 观看历史记录成功 -RoomDetail: 房间加载成功: 火影忍者 -RoomDetail: 观看历史更新成功 ← 这个是关键 -``` - -### 4. 查看观看历史 - -1. 返回首页 -2. 进入"我的" → "我的记录" -3. 切换到"观看历史"标签页 -4. 应该能看到刚才观看的直播间 - ---- - -## 🔍 后台验证 - -### 检查后台日志 - -```bash -# 查看zhibo-h后台日志 -tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" -``` - -**期望看到的日志**: -``` -【观看历史API】参数: userId=43, targetType=room, page=1, pageSize=20 -【观看历史API】成功: userId=43, total=1, listSize=1 -``` - -### 使用调试接口 - -```bash -# 测试Token状态 -curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" - -# 测试记录观看历史 -curl -X POST "http://1.15.149.240:8081/api/front/activity/view/record" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -d '{ - "targetType": "room", - "targetId": "8", - "targetTitle": "火影忍者", - "duration": 120 - }' - -# 测试获取观看历史 -curl -X GET "http://1.15.149.240:8081/api/front/activity/view/history?page=1&pageSize=20" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -## 📊 修改对比 - -### 修改前 - -```java -// recordWatchHistory() 方法 -body.put("duration", 0); // ✅ 正确 - -// updateWatchHistoryWithRoomInfo() 方法 -body.put("viewDuration", 0); // ❌ 错误 -``` - -### 修改后 - -```java -// recordWatchHistory() 方法 -body.put("duration", 0); // ✅ 正确 - -// updateWatchHistoryWithRoomInfo() 方法 -body.put("duration", 0); // ✅ 正确 -``` - ---- - -## ✅ 修改检查清单 - -- [x] ✅ API路径正确(无需修改) -- [x] ✅ `targetType` 参数名正确(无需修改) -- [x] ✅ `recordWatchHistory()` 中的 `duration` 正确(无需修改) -- [ ] ⚠️ `updateWatchHistoryWithRoomInfo()` 中的 `viewDuration` 需要改为 `duration` - ---- - -## 🎉 预期结果 - -修改完成后: - -1. ✅ 进入直播间时自动记录观看历史 -2. ✅ 房间信息加载后更新观看历史(包含标题、封面、主播名称) -3. ✅ 在"我的记录"页面能看到观看历史 -4. ✅ 点击历史记录能跳转到对应的直播间 -5. ✅ 显示直播间的实时状态(直播中/已结束) - ---- - -## 💡 总结 - -**只需要修改一个参数名,从 `viewDuration` 改为 `duration`,功能就能完全正常工作!** - -- ✅ API路径:完全正确 -- ✅ 参数名:99%正确 -- ⚠️ 需要修改:1个参数名(`viewDuration` → `duration`) - -**预计修改时间**: 1分钟 -**预计测试时间**: 5分钟 -**总计**: 6分钟即可完成 - ---- - -**最后更新**: 2026-01-05 -**状态**: 🔧 需要修改1个参数名 diff --git a/观看历史功能-最终总结.md b/观看历史功能-最终总结.md deleted file mode 100644 index cd4bad6e..00000000 --- a/观看历史功能-最终总结.md +++ /dev/null @@ -1,243 +0,0 @@ -# 观看历史功能 - 最终总结 - -## 🎉 重要发现 - -**zhibo-h后台项目已经完整实现了观看历史功能!** - -不需要在 `live-streaming` 项目中添加任何代码。 - ---- - -## ✅ 当前状态 - -### 后台(zhibo-h) -- ✅ **已完成**:观看历史功能已在 `UserActivityRecordController.java` 中实现 -- ✅ **已完成**:数据库表已创建 -- ✅ **已完成**:Service层已实现 -- ✅ **已完成**:包含观看历史、点赞记录、关注记录、收藏记录等完整功能 - -### Android端 -- ⚠️ **需要修改**:API路径不匹配 -- ⚠️ **需要修改**:参数名称不匹配 - ---- - -## 🔧 需要做的修改 - -### 唯一需要修改的地方:Android端API路径 - -**文件**: `android-app/app/src/main/java/com/zbkj/front/net/ApiService.java` - -**修改内容**: - -| 旧路径 | 新路径 | 说明 | -|--------|--------|------| -| `/activity/record-view` | `/activity/view/record` | 记录观看历史 | -| `/activity/view-history` | `/activity/view/history` | 获取观看历史 | -| `/activity/like-records` | `/activity/like/records` | 获取点赞记录 | -| `/activity/follow-records` | `/activity/follow/records` | 获取关注记录 | -| `/activity/collected-works` | `/activity/collect/works` | 获取收藏记录 | - -**参数名修改**: -- `type` → `targetType` -- `viewDuration` → `duration` - ---- - -## 📁 项目结构说明 - -``` -Zhibo/zhibo-h/ ← 主后台项目(Spring Boot) -├── crmeb-front/ ← 前端API模块 -│ └── src/main/java/com/zbkj/front/ -│ └── controller/ -│ ├── UserActivityRecordController.java ← 观看历史等功能 ✅ -│ └── WatchHistoryController.java ← 备用实现 ✅ -├── crmeb-service/ ← 业务逻辑层 -│ └── src/main/java/com/zbkj/service/ -│ └── service/ -│ └── UserActivityRecordService.java ← Service实现 ✅ -└── crmeb-common/ ← 公共模块 - -live-streaming/ ← 独立的Node.js项目 -├── server/ -│ ├── routes/ -│ │ └── viewHistory.js ← ❌ 不需要使用 -│ └── store/ -│ └── viewHistoryStore.js ← ❌ 不需要使用 -└── ... -``` - ---- - -## 🚀 快速修复步骤 - -### 步骤1:修改ApiService.java - -打开文件:`android-app/app/src/main/java/com/zbkj/front/net/ApiService.java` - -找到并修改以下接口: - -```java -// 记录观看历史 -@POST("api/front/activity/view/record") // 修改路径 -Call>> recordViewHistoryNew(@Body Map body); - -// 获取观看历史 -@GET("api/front/activity/view/history") // 修改路径 -Call>>> getViewHistory( - @Query("targetType") String targetType, // 修改参数名 - @Query("page") int page, - @Query("pageSize") int pageSize); -``` - -### 步骤2:重新编译 - -```bash -cd android-app -./gradlew assembleDebug -``` - -### 步骤3:测试 - -1. 安装应用 -2. 登录账号 -3. 进入直播间 -4. 查看"我的记录" → "观看历史" - ---- - -## 📊 API对比 - -### zhibo-h后台(正确) - -``` -POST /api/front/activity/view/record 记录观看历史 -GET /api/front/activity/view/history 获取观看历史 -DELETE /api/front/activity/view/history 清空观看历史 -GET /api/front/activity/like/records 获取点赞记录 -GET /api/front/activity/follow/records 获取关注记录 -GET /api/front/activity/collect/works 获取收藏记录 -``` - -### live-streaming(不使用) - -``` -POST /api/front/activity/record-view ❌ 不使用 -GET /api/front/activity/view-history ❌ 不使用 -DELETE /api/front/activity/view-history ❌ 不使用 -``` - ---- - -## 💡 为什么不使用live-streaming - -1. **数据隔离**: live-streaming使用JSON文件存储,zhibo-h使用MySQL数据库 -2. **功能完整**: zhibo-h已经实现了完整的用户活动记录功能 -3. **统一管理**: 所有用户数据都在zhibo-h中,便于管理 -4. **已经实现**: zhibo-h的代码已经写好并测试通过 - ---- - -## 🗄️ 数据存储 - -### zhibo-h(使用) -- **存储方式**: MySQL数据库 -- **表名**: `eb_user_activity_record` -- **优势**: - - 数据持久化 - - 支持复杂查询 - - 支持事务 - - 易于备份 - -### live-streaming(不使用) -- **存储方式**: JSON文件 -- **文件**: `live-streaming/data/viewHistory.json` -- **缺点**: - - 并发性能差 - - 不支持复杂查询 - - 数据容易丢失 - ---- - -## 📝 文档清单 - -已创建的文档: - -1. ✅ `观看历史功能-zhibo-h后台说明.md` - 后台实现详细说明 -2. ✅ `Android端API路径修复指南.md` - Android端修改指南 -3. ✅ `观看历史功能-最终总结.md` - 本文档 -4. ⚠️ `观看历史功能-快速指南.md` - 基于live-streaming的指南(不使用) -5. ⚠️ `观看历史功能实现说明.md` - 基于live-streaming的说明(不使用) - ---- - -## ⚠️ 注意事项 - -1. **不要修改live-streaming项目** - - 已创建的 `viewHistoryStore.js` 和 `viewHistory.js` 不需要使用 - - 可以保留作为参考,但不要在生产环境中使用 - -2. **只修改Android端** - - 只需要修改 `ApiService.java` 中的API路径 - - 确保参数名正确(`targetType` 和 `duration`) - -3. **确保后台运行** - - zhibo-h后台需要运行在8081端口(本地)或8083端口(生产) - - 检查数据库连接是否正常 - -4. **Token认证** - - 确保Android端正确传递Token - - 使用 `/activity/debug/token` 接口验证Token状态 - ---- - -## 🎯 下一步行动 - -### 立即执行 -1. [ ] 修改 `ApiService.java` 中的API路径 -2. [ ] 重新编译Android应用 -3. [ ] 测试观看历史功能 - -### 可选操作 -1. [ ] 删除或归档 `live-streaming/server/routes/viewHistory.js` -2. [ ] 删除或归档 `live-streaming/server/store/viewHistoryStore.js` -3. [ ] 更新 `live-streaming/server/index.js`,移除观看历史路由 - ---- - -## 📞 技术支持 - -如果遇到问题: - -1. **检查后台日志** - - 位置:`Zhibo/zhibo-h/crmeb_front_log/` - - 搜索关键词:"观看历史"、"UserActivityRecord" - -2. **检查Android日志** - - 使用Logcat搜索:"RoomDetail"、"观看历史" - -3. **使用调试接口** - ```bash - curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" - ``` - ---- - -## ✨ 总结 - -**观看历史功能已经在zhibo-h后台完整实现,只需要修改Android端的API路径即可使用!** - -- ✅ 后台:完全实现,无需修改 -- ⚠️ Android:需要修改API路径 -- ❌ live-streaming:不需要使用 - -**预计修改时间**: 10分钟 -**预计测试时间**: 5分钟 -**总计**: 15分钟即可完成 - ---- - -**最后更新**: 2026-01-05 -**状态**: ✅ 已分析完成,等待Android端修改 diff --git a/观看历史功能-检查结果.md b/观看历史功能-检查结果.md deleted file mode 100644 index 6ee64c04..00000000 --- a/观看历史功能-检查结果.md +++ /dev/null @@ -1,217 +0,0 @@ -# 观看历史功能 - 检查结果 - -## ✅ 好消息:API路径已经正确! - -经过检查,发现 `ApiService.java` 中的API路径**已经是正确的**! - ---- - -## 📊 当前API配置(正确) - -### ApiService.java 中的定义 - -```java -// ==================== 用户活动记录 ==================== - -/** - * 获取观看历史 - */ -@GET("api/front/activity/view/history") // ✅ 正确 -Call>>> getViewHistory( - @Query("targetType") String targetType, // ✅ 正确 - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 清除观看历史 - */ -@DELETE("api/front/activity/view/history") // ✅ 正确 -Call> clearViewHistory(@Query("targetType") String targetType); // ✅ 正确 - -/** - * 获取点赞记录 - */ -@GET("api/front/activity/like/records") // ✅ 正确 -Call>>> getLikeRecords( - @Query("targetType") String targetType, // ✅ 正确 - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 获取收藏的作品 - */ -@GET("api/front/activity/collect/works") // ✅ 正确 -Call>>> getCollectedWorks( - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 获取关注记录 - */ -@GET("api/front/activity/follow/records") // ✅ 正确 -Call>>> getFollowRecords( - @Query("page") int page, - @Query("pageSize") int pageSize); - -/** - * 记录观看历史(新版) - */ -@POST("api/front/activity/view/record") // ✅ 正确 -Call>> recordViewHistoryNew(@Body Map body); - -/** - * 调试Token - */ -@GET("api/front/activity/debug/token") // ✅ 正确 -Call>> debugToken(); -``` - ---- - -## ✅ 对比结果 - -| 功能 | ApiService.java | zhibo-h后台 | 状态 | -|------|----------------|-------------|------| -| 记录观看历史 | `/activity/view/record` | `/activity/view/record` | ✅ 匹配 | -| 获取观看历史 | `/activity/view/history` | `/activity/view/history` | ✅ 匹配 | -| 清除观看历史 | `/activity/view/history` | `/activity/view/history` | ✅ 匹配 | -| 获取点赞记录 | `/activity/like/records` | `/activity/like/records` | ✅ 匹配 | -| 获取关注记录 | `/activity/follow/records` | `/activity/follow/records` | ✅ 匹配 | -| 获取收藏记录 | `/activity/collect/works` | `/activity/collect/works` | ✅ 匹配 | -| 参数名 | `targetType` | `targetType` | ✅ 匹配 | - ---- - -## 🔍 需要检查的地方 - -虽然API路径正确,但还需要检查以下几点: - -### 1. RoomDetailActivity.java 中的参数 - -检查 `recordWatchHistory()` 和 `updateWatchHistoryWithRoomInfo()` 方法中的参数名: - -**需要确认的参数**: -- ✅ `targetType` (不是 `type`) -- ✅ `targetId` -- ✅ `targetTitle` -- ⚠️ **`duration`** (不是 `viewDuration`) - -### 2. 后台服务状态 - -确认zhibo-h后台服务: -- [ ] 是否正在运行 -- [ ] 端口是否正确(8081本地,8083生产) -- [ ] 数据库连接是否正常 - -### 3. Token认证 - -确认Token传递: -- [ ] Android端是否正确传递Token -- [ ] Token格式是否正确(`Bearer {token}`) -- [ ] Token是否有效 - ---- - -## 🔧 需要修改的地方 - -### RoomDetailActivity.java - -检查参数名是否正确,特别是 `duration` 字段: - -```java -// 当前代码(需要确认) -body.put("targetType", "room"); // ✅ 正确 -body.put("targetId", roomId); // ✅ 正确 -body.put("targetTitle", "直播间"); // ✅ 正确 -body.put("duration", 0); // ⚠️ 需要确认是duration还是viewDuration -``` - -**后台期望的参数名**(根据UserActivityRecordController.java): -```java -String targetType = body.get("targetType") -String targetId = body.get("targetId") -String targetTitle = body.get("targetTitle") -Integer duration = body.get("duration") // ← 注意是duration -``` - ---- - -## 📝 检查清单 - -### API路径 -- [x] ✅ `getViewHistory` 路径正确 -- [x] ✅ `clearViewHistory` 路径正确 -- [x] ✅ `getLikeRecords` 路径正确 -- [x] ✅ `getFollowRecords` 路径正确 -- [x] ✅ `getCollectedWorks` 路径正确 -- [x] ✅ `recordViewHistoryNew` 路径正确 -- [x] ✅ `debugToken` 路径正确 - -### 参数名 -- [x] ✅ `targetType` 参数名正确 -- [x] ✅ `page` 参数名正确 -- [x] ✅ `pageSize` 参数名正确 - -### 需要确认 -- [ ] ⚠️ RoomDetailActivity中使用的是 `duration` 还是 `viewDuration` -- [ ] ⚠️ 后台服务是否运行 -- [ ] ⚠️ Token是否正确传递 - ---- - -## 🚀 下一步行动 - -### 1. 检查RoomDetailActivity.java - -查看 `recordWatchHistory()` 方法中的参数: - -```bash -# 搜索关键代码 -grep -n "body.put" RoomDetailActivity.java | grep -E "duration|viewDuration" -``` - -### 2. 测试API连接 - -使用curl测试后台API: - -```bash -# 测试调试接口 -curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \ - -H "Authorization: Bearer YOUR_TOKEN" - -# 测试记录观看历史 -curl -X POST "http://1.15.149.240:8081/api/front/activity/view/record" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -d '{ - "targetType": "room", - "targetId": "8", - "targetTitle": "测试直播间", - "duration": 120 - }' -``` - -### 3. 查看后台日志 - -检查zhibo-h的日志文件: -```bash -tail -f Zhibo/zhibo-h/crmeb_front_log/log_info.log | grep "观看历史" -``` - ---- - -## 💡 结论 - -**API路径配置完全正确!** - -现在需要: -1. ✅ 确认RoomDetailActivity中的参数名(特别是`duration`) -2. ✅ 确认后台服务正在运行 -3. ✅ 测试功能是否正常工作 - -如果参数名也正确,那么功能应该已经可以正常使用了! - ---- - -**检查时间**: 2026-01-05 -**状态**: ✅ API路径正确,需要确认参数和后台服务 diff --git a/观看历史功能实现说明.md b/观看历史功能实现说明.md deleted file mode 100644 index 95ebc944..00000000 --- a/观看历史功能实现说明.md +++ /dev/null @@ -1,122 +0,0 @@ -# 观看历史功能实现说明 - -## 功能概述 - -已成功实现观看历史记录功能,用户在观看直播时会自动记录观看历史,并可以在"我的记录"页面查看。 - -## 实现的功能 - -### 1. 后台功能 - -#### 新增文件 -- `live-streaming/server/store/viewHistoryStore.js` - 观看历史数据存储 -- `live-streaming/server/routes/viewHistory.js` - 观看历史API路由 - -#### 修改文件 -- `live-streaming/server/index.js` - 添加观看历史路由 - -#### API接口 -1. **记录观看历史** - - 接口:`POST /api/front/activity/record-view` - - 功能:记录用户观看直播间、作品等内容 - - 参数: - ```json - { - "targetType": "room", // 类型:room/work/profile - "targetId": "room-id", // 目标ID - "targetTitle": "直播间标题", - "coverImage": "封面图片URL", - "streamerName": "主播名称", - "viewDuration": 120 // 观看时长(秒) - } - ``` - -2. **获取观看历史** - - 接口:`GET /api/front/activity/view-history` - - 功能:分页获取用户的观看历史 - - 参数:`page`, `pageSize`, `type`(可选,过滤类型) - -3. **清除观看历史** - - 接口:`DELETE /api/front/activity/view-history` - - 功能:清除用户的观看历史 - - 参数:`type`(可选,清除指定类型) - -4. **删除单条记录** - - 接口:`DELETE /api/front/activity/view-history/:id` - - 功能:删除指定的观看历史记录 - -### 2. Android端功能 - -#### 修改文件 -- `android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java` - -#### 实现功能 -1. **自动记录观看历史** - - 用户进入直播间时自动记录 - - 房间信息加载后更新详细信息 - - 未登录用户不记录 - -2. **显示观看历史** - - 在"我的记录"页面的"观看历史"标签页显示 - - 支持点击跳转到对应的直播间 - - 显示直播间封面、标题、主播名称、观看时间等信息 - -## 数据存储 - -观看历史数据保存在:`live-streaming/data/viewHistory.json` - -数据格式: -```json -[ - { - "id": 1704441600000, - "userId": 1, - "targetType": "room", - "targetId": "room-123", - "targetTitle": "精彩直播间", - "coverImage": "https://example.com/cover.jpg", - "streamerName": "主播名称", - "viewDuration": 120, - "createTime": "2024-01-05T10:00:00.000Z", - "updateTime": "2024-01-05T10:02:00.000Z", - "viewCount": 3 - } -] -``` - -## 特性说明 - -1. **自动去重**:同一用户观看同一内容会更新记录而不是创建新记录 -2. **观看次数统计**:记录用户观看同一内容的次数 -3. **时间排序**:按最后观看时间倒序排列 -4. **分页支持**:支持分页加载,避免一次加载过多数据 -5. **类型过滤**:支持按类型(直播间/作品/用户主页)过滤 -6. **实时状态**:直播间的在线状态会实时更新 - -## 使用方式 - -### 用户端操作 -1. 登录应用 -2. 进入任意直播间观看 -3. 系统自动记录观看历史 -4. 进入"我的" -> "我的记录" -5. 切换到"观看历史"标签页查看 - -### 开发者测试 -参考 `live-streaming/test-view-history.md` 文件中的测试步骤 - -## 注意事项 - -1. 用户必须登录才能记录观看历史 -2. 观看历史仅在用户端可见,不会公开 -3. 数据持久化存储在本地JSON文件中 -4. 生产环境建议使用数据库存储 - -## 后续优化建议 - -1. 添加观看时长的实时更新(目前仅记录初始值) -2. 支持用户手动删除单条观看历史 -3. 添加观看历史的时间筛选功能 -4. 支持导出观看历史数据 -5. 添加隐私设置(是否记录观看历史) -6. 迁移到数据库存储(MySQL/PostgreSQL) diff --git a/观看历史重复问题修复指南.md b/观看历史重复问题修复指南.md deleted file mode 100644 index 326cabdd..00000000 --- a/观看历史重复问题修复指南.md +++ /dev/null @@ -1,305 +0,0 @@ -# 观看历史重复问题修复指南 - -## 🎯 问题描述 - -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> 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清理数据库