From 8e003d317da31c555c5c746f62bd74c8dd46638b Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 27 五月 2025 13:57:20 +0800
Subject: [PATCH] 视频播放记录完善

---
 pages/tabbar/index/home.vue |  161 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 123 insertions(+), 38 deletions(-)

diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue
index 418f1c7..8d25e61 100644
--- a/pages/tabbar/index/home.vue
+++ b/pages/tabbar/index/home.vue
@@ -9,17 +9,28 @@
       @change="onSwiperChange"
     >
       <swiper-item v-for="(item, index) in videoList" :key="item.id">
+		<!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� -->
+		<view 
+		  class="play-icon" 
+		  @click="togglePlay(index)"
+		  v-if="currentVideoIsPlaying != null && !currentVideoIsPlaying"
+		>
+		  <image src="/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image>
+		</view>
         <video 
           :id="'video'+index"
+		  :ref="'video'+index"
           :src="item.videoUrl"
           :autoplay="currentIndex === index"
           :controls="false"
           :loop="true"
 		  :object-fit="item.objectFit"
           class="video-item"
-          @play="onPlay(index)"
+          @play="onPlay(item.id, index)"
           @pause="onPause(index)"
           @ended="onEnded(index)"
+		  @click="togglePlay(index)"
+		  @timeupdate="onTimeUpdate($event)"
         ></video>
 		
 		<!-- 鎮寕鍟嗗搧閾炬帴灞� -->
@@ -85,31 +96,46 @@
 </template>
 
 <script>
-import { getRecommendVideos } from "@/api/video.js";
+import { getRecommendVideos, savePlayRecord } from "@/api/video.js";
 import { changeCollect } from "@/api/collect.js";
 export default {
   data() {
     return {
-	  isFullScreen: false,
-	  windowHeight: 0,
-      currentIndex: 0, // 褰撳墠鎾斁鐨勮棰戠储寮�
-      videoList: [
+		startHidenTime: 0, // 璁板綍鍒囨崲鑷冲叾瀹冮〉闈㈢殑鏃堕棿锛岀敤浜庤绠楄棰戣鐪嬫椂闂村噺鍘荤殑閮ㄥ垎
+		totalHidenTime: 0, // 鎬诲叡闅愯棌椤甸潰鐨勬椂闂�
+		startPauseTime: 0, // 寮�濮嬫殏鍋滅殑鏃堕棿
+		totalPauseTime: 0, // 鎬诲叡鏆傚仠鐨勬椂闂�
+		playRecord: {
+			videoId: null,
+			viewDuration: 0, // 杩欎釜瑙嗛鎬诲叡瑙傜湅浜嗗涔�
+			playAt: 0 ,// 杩欎釜瑙嗛鎾斁鍒板摢浜�
+			startPlayTime: 0 // 杩欎釜瑙嗛浠庝粈涔堟椂鍊欏紑濮嬫挱鏀剧殑
+		},
+		currentVideoIsPlaying: null, // 褰撳墠瑙嗛鏄惁姝e湪鎾斁
+		isFullScreen: false,
+		windowHeight: 0,
+		currentIndex: 0, // 褰撳墠鎾斁鐨勮棰戠储寮�
+		videoList: [
 		  
-	  ],   // 瑙嗛鍒楄〃鏁版嵁
-      videoContexts: [], // 瑙嗛涓婁笅鏂囧璞¢泦鍚�
-      loading: false,  // 鏄惁姝e湪鍔犺浇
-      page: 1,         // 褰撳墠椤电爜
-      pageSize: 10     // 姣忛〉鏁伴噺
+		],   // 瑙嗛鍒楄〃鏁版嵁
+		videoContexts: [], // 瑙嗛涓婁笅鏂囧璞¢泦鍚�
+		loading: false,  // 鏄惁姝e湪鍔犺浇
+		page: 1,         // 褰撳墠椤电爜
+		pageSize: 10     // 姣忛〉鏁伴噺
     }
   },
   onShow() {
-    this.loadVideos();
+	  // 濡傛灉瑙嗛鎸変笅鏆傚仠鍚庡垏鎹㈤〉闈㈠啀鍥炲埌椤甸潰鏃讹紝鍙畻鏆傚仠鏃堕棿锛堝洜涓烘殏鍋滄椂闂村拰绂诲紑椤甸潰鏃堕棿鏄噸澶嶇殑锛屽彧绠椾竴涓級
+	  if(this.startHidenTime !== 0 && this.currentVideoIsPlaying) {
+		  const duration = Date.now() - this.startHidenTime
+		  this.totalHidenTime += duration
+	  }
+  },
+  onHide() {
+  	this.startHidenTime = Date.now()
   },
   onLoad() {
-	  if(!this.videoList || this.videoList.length < 1) {
-		  this.loadVideos();
-	  }
-    
+	  this.loadVideos();
   },
   onReady() {
     // 鍒濆鍖栬棰戜笂涓嬫枃
@@ -147,18 +173,29 @@
     
     // 婊戝姩鍒囨崲瑙嗛
     onSwiperChange(e) {
-      const oldIndex = this.currentIndex;
-      this.currentIndex = e.detail.current;
-      
-      // 鏆傚仠涓婁竴涓棰�
-      if (this.videoContexts[oldIndex]) {
-        this.videoContexts[oldIndex].pause();
-      }
-      
-      // 鎾斁褰撳墠瑙嗛
-      if (this.videoContexts[this.currentIndex]) {
-        this.videoContexts[this.currentIndex].play();
-      }
+		// 濡傛灉瑙嗛澶勪簬鏆傚仠鐘舵�佸線涓嬪埛瑙嗛锛岄偅涔堥渶瑕佸啀璁$畻涓�娆℃殏鍋滄椂闂�
+		if(!this.currentVideoIsPlaying) {
+			if(this.startPauseTime !== 0) {
+				const duration = Date.now() - this.startPauseTime
+				this.totalPauseTime += duration
+			}
+		}
+		// 淇濆瓨涓婁竴涓棰戠殑鎾斁璁板綍
+		this.savePlayRecord()
+		const oldIndex = this.currentIndex;
+		console.log("瑙嗛涓婁笅鏂�",this.videoContexts[oldIndex]);
+		this.currentIndex = e.detail.current;
+
+		// 鏆傚仠涓婁竴涓棰�
+		if (this.videoContexts[oldIndex]) {
+			this.videoContexts[oldIndex].pause();
+		}
+		this.currentVideoIsPlaying = true;
+		this.startPauseTime = 0;
+		// 鎾斁褰撳墠瑙嗛
+		if (this.videoContexts[this.currentIndex]) {
+			this.videoContexts[this.currentIndex].play();
+		}
     },
     
     // 鏀惰棌/鍙栨秷鏀惰棌
@@ -183,25 +220,63 @@
 		  }
 	  })
     },
-    
+    // 鍗曞嚮灞忓箷锛氭殏鍋滄垨缁х画鎾斁
+	togglePlay(index) {
+		if(this.currentVideoIsPlaying) {
+			this.videoContexts[index].pause();
+		} else {
+			this.videoContexts[index].play();
+		}
+	},
     // 瑙嗛鎾斁浜嬩欢
-    onPlay(index) {
-      console.log(`瑙嗛 ${index} 寮�濮嬫挱鏀綻);
+    onPlay(id, index) {
+		this.currentVideoIsPlaying = true;
+		this.playRecord.videoId = id;
+		// 娌″垵濮嬪寲鎵嶈祴鍊硷紝鍥犱负涓�涓棰戦噸澶嶆挱鏀緊nPlay浼氶噸澶嶈Е鍙�
+		if(this.playRecord.startPlayTime === 0) {
+			this.playRecord.startPlayTime = Date.now();
+		}
+		if(this.startPauseTime !== 0) {
+			const duration = Date.now() - this.startPauseTime
+			this.totalPauseTime += duration
+		}
     },
     
     // 瑙嗛鏆傚仠浜嬩欢
     onPause(index) {
-      console.log(`瑙嗛 ${index} 鏆傚仠`);
+      this.currentVideoIsPlaying = false;
+	  this.startPauseTime = Date.now()
     },
     
     // 瑙嗛缁撴潫浜嬩欢
     onEnded(index) {
-      console.log(`瑙嗛 ${index} 鎾斁缁撴潫`);
-      // // 鑷姩鎾斁涓嬩竴涓紙濡傛灉涓嶅湪鏈�鍚庝竴涓級
-      // if (index < this.videoList.length - 1) {
-      //   this.currentIndex = index + 1;
-      // }
-    }
+      // this.currentVideoIsPlaying = false;
+    },
+	
+	// 璁板綍鎾斁鏃堕暱
+	onTimeUpdate(e) {
+		this.playRecord.playAt = e.detail.currentTime
+	},
+	
+	// 淇濆瓨鎾斁璁板綍
+	async savePlayRecord() {
+		console.log(Date.now(), this.playRecord.startPlayTime, this.totalHidenTime);
+		
+		const data = {
+			videoId: this.playRecord.videoId,
+			viewDuration: Date.now() - this.playRecord.startPlayTime - this.totalHidenTime - this.totalPauseTime,
+			playAt: this.playRecord.playAt
+		}
+		this.playRecord = {
+			videoId: null,
+			viewDuration: 0, // 杩欎釜瑙嗛鎬诲叡瑙傜湅浜嗗涔�
+			playAt: 0 ,// 杩欎釜瑙嗛鎾斁鍒板摢浜�
+			startPlayTime: 0 // 杩欎釜瑙嗛浠庝粈涔堟椂鍊欏紑濮嬫挱鏀剧殑
+		}
+		this.totalHidenTime = 0
+		this.totalPauseTime = 0
+		savePlayRecord(data)
+	}
   }
 }
 </script>
@@ -226,6 +301,16 @@
 	  height: 100%;
 	  object-fit: cover;
 	}
+	.play-icon {
+	  position: absolute;
+	  top: 50%;
+	  left: 50%;
+	  transform: translate(-50%, -50%);
+	  width: 45px;
+	  height: 45px;
+	  z-index: 10;
+	  opacity: 0.6;
+	}
 	
 	.video-info {
 	  width: 70%;

--
Gitblit v1.8.0