From 4e9d7c0e363d313a273700865afb8b0d665e6c69 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期三, 18 六月 2025 14:11:23 +0800
Subject: [PATCH] 视频相关页面优化、功能bug

---
 /dev/null                    |  144 -------------
 components/dropdown-menu.vue |    2 
 pages.json                   |    6 
 pages/video/video-play.vue   |  433 +++++++++++++++++++++++++++++++-------
 pages/tabbar/index/home.vue  |    2 
 pages/video/home-page.vue    |   44 ++--
 6 files changed, 370 insertions(+), 261 deletions(-)

diff --git a/components/dropdown-menu.vue b/components/dropdown-menu.vue
index 6dee7c9..066a6d6 100644
--- a/components/dropdown-menu.vue
+++ b/components/dropdown-menu.vue
@@ -149,7 +149,7 @@
 
 .dropdown-menu {
   position: absolute;
-  left: 0;
+  left: -50rpx;
   display: inline-block;
   white-space: nowrap;
   background-color: #fff;
diff --git a/pages.json b/pages.json
index ea4a9f3..71ab3f6 100644
--- a/pages.json
+++ b/pages.json
@@ -26,12 +26,6 @@
 				"navigationStyle": "custom" // 闅愯棌椤堕儴瀵艰埅鏍�
 			}
 		},
-		// {
-		// 	"path": "pages/tabbar/index/home1",
-		// 	"style": {
-		// 		"navigationBarTitleText": ""
-		// 	}
-		// },
 		{
 			"path": "pages/tabbar/home/index",
 			"style": {
diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue
index df33ed7..ade53fe 100644
--- a/pages/tabbar/index/home.vue
+++ b/pages/tabbar/index/home.vue
@@ -916,7 +916,7 @@
 	.video-info {
 	  width: 70%;
 	  position: absolute;
-	  bottom: 70px;
+	  bottom: 20px;
 	  left: 20px;
 	  color: #f8f8f8;
 	  z-index: 10;
diff --git a/pages/tabbar/index/home1.vue b/pages/tabbar/index/home1.vue
deleted file mode 100644
index 1a5edcc..0000000
--- a/pages/tabbar/index/home1.vue
+++ /dev/null
@@ -1,144 +0,0 @@
-<template>
-  <!-- 鑷畾涔夋帶鍒舵潯 -->
-  <view 
-  	@touchstart="handleTouchStart"
-  	@touchmove="handleTouchMove"
-  	@touchend="handleTouchEnd"
-  	class="container">
-    <!-- 杩涘害鏉� - 鏁翠釜鍖哄煙鍙嫋鍔� -->
-    <view class="process-warp" :style="{ opacity: showProcess ? 1 : 0 }">
-  	  <!-- 鏄剧ず褰撳墠杩涘害 -->
-  	  <view class="progress-text">{{ hasPlayTime }}/{{formartDuration}}</view>
-  	  <view 
-  	    class="progress-bar" 
-  	    id="progressBar"
-  	  >
-  	  			  
-  	    <!-- 宸插~鍏呴儴鍒� -->
-  	    <view class="progress-fill" :style="{ width: progress + '%' }"></view>
-  	  </view>
-    </view>
-  </view>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      startX: 0,
-      progress: 0, // 瑙嗛杩涘害
-      startProgress : 0, // 寮�濮嬫粦鍔ㄦ椂鐨勮繘搴�
-      barLeft: 0, // 杩涘害鏉″乏杈圭晫浣嶇疆
-      barWidth: 0, // 杩涘害鏉″搴�
-      isDragging: false, // 鏄惁姝e湪鎷栧姩
-      processHidenTimer: null, // 杩涘害鏉¢殣钘忓畾鏃跺櫒
-      showProcess: false, // 鏄惁鏄剧ず杩涘害鏉�
-    };
-  },
-  mounted() {
-    // 鑾峰彇杩涘害鏉$殑灏哄鍜屼綅缃俊鎭�
-    this.getBarRect();
-  },
-  methods: {
-    // 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
-    getBarRect() {
-      const query = uni.createSelectorQuery().in(this);
-      query.select('#progressBar').boundingClientRect(rect => {
-        if (rect) {
-          this.barLeft = rect.left;
-          this.barWidth = rect.width;
-        }
-      }).exec();
-    },
-    
-    // 瑙︽懜寮�濮�
-    handleTouchStart(e) {
-      this.isDragging = true;
-      this.showProcess = true;
-      this.startProgress = this.progress; // 璁板綍寮�濮嬫椂鐨勮繘搴�
-      this.startX = e.touches[0].pageX;
-      console.log("璁板綍寮�濮嬫椂鐨勮繘搴�", this.startProgress);
-      this.videoContexts[this.currentIndex].pause()
-      // this.updateProgress(e);
-    },
-    
-    // 瑙︽懜绉诲姩
-    handleTouchMove(e) {
-      if (!this.isDragging || !this.barWidth) return;
-      clearTimeout(this.processHidenTimer)
-      this.videoContexts[this.currentIndex].pause()
-      this.updateProgress(e);
-    },
-    
-    // 瑙︽懜缁撴潫
-    handleTouchEnd() {
-      this.isDragging = false;
-      console.log("婊戝姩缁撴潫", this.duration * this.progress);
-      this.videoContexts[this.currentIndex].seek(this.duration * this.progress / 100)
-      this.videoContexts[this.currentIndex].play()
-      this.processHidenTimer = setTimeout(() => {
-    	  this.showProcess = false;
-    	}, 1000);
-    },
-    
-    // 鏇存柊杩涘害
-    updateProgress(e) {
-    	// 鑾峰彇褰撳墠瑙︽懜鐐筙鍧愭爣
-    	const currentX = e.touches[0].pageX;
-    	
-    	// 璁$畻婊戝姩璺濈(鍍忕礌)
-    	const deltaX = currentX - this.startX;
-    	
-    	// 灏嗗儚绱犺窛绂昏浆鎹负杩涘害澧為噺
-    	const deltaProgress = (deltaX / this.barWidth) * 100;
-    	console.log("杩涘害澧為噺", deltaProgress);
-    	// 璁$畻鏂拌繘搴� = 寮�濮嬫椂鐨勮繘搴� + 婊戝姩澧為噺
-    	let newProgress = this.startProgress + deltaProgress;
-    	
-    	// 闄愬埗鑼冨洿鍦�0-100涔嬮棿
-    	newProgress = Math.max(0, Math.min(100, newProgress));
-    	
-    	this.progress = newProgress;
-    }
-  }
-};
-</script>
-
-<style>
-.container {
-	  display: flex;
-	  flex-direction: column;
-	  align-items: center;
-	  position: absolute;
-	  bottom: 0;
-	  width: 100%;
-	}
-	
-	.progress-bar {
-	  position: relative;
-	  width: 100%;
-	  height: 16px;
-	  background-color: #eee;
-	  overflow: hidden;
-	}
-	
-	.progress-fill {
-	  position: absolute;
-	  left: 0;
-	  top: 0;
-	  height: 100%;
-	  background-color: lightgray;
-	  transition: width 0.1s;
-	}
-	.process-warp {
-		width: 100%;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-	}
-	.progress-text {
-	  margin-top: 10px;
-	  font-size: 14px;
-	  color: #666;
-	}
-</style>
\ No newline at end of file
diff --git a/pages/video/home-page.vue b/pages/video/home-page.vue
index 1e29861..76ca651 100644
--- a/pages/video/home-page.vue
+++ b/pages/video/home-page.vue
@@ -61,12 +61,13 @@
         
         <!-- 瑙嗛鍒楄〃 -->
 		<scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'works' && videoList.length > 0">
+			<view class="video-container">
 				<view
 				  class="video-item" 
 				  v-for="(item, index) in videoList" 
 				  :key="item.id"
 				>
-				  <image class="video-cover" @click="playAuthorVideo(index)" :src="item.coverUrl" mode="aspectFill"></image>
+				  <image class="video-cover" @click="playAuthorVideo(index)" :src="item.videoContentType === 'video' ? item.coverUrl : item.imgs[0]" mode="aspectFill"></image>
 				  <view class="video-info">
 				    <view class="video-stats">
 				      <view class="stat">
@@ -83,6 +84,7 @@
 				      </view>
 				    </view>
 				  </view>
+				</view>
 			</view>
 		</scroll-view>
 		<scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'likes' && collectVideoList.length > 0">
@@ -93,7 +95,7 @@
 				  :key="item.id"
 				  @click="playCollectVideo(index)"
 				>
-				  <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image>
+				  <image class="video-cover" :src="item.videoContentType === 'video' ? item.coverUrl : item.imgs[0]" mode="aspectFill"></image>
 				  <view class="video-info">
 				    <view class="video-stats">
 				      <view class="stat">
@@ -301,7 +303,7 @@
       });
     },
     // 鎾斁鏀惰棌瑙嗛
-    playAuthorVideo(index) {
+    playCollectVideo(index) {
       const playInfo = {
     	  videoList: this.collectVideoList,
     	  nomore: this.nomoreCollectVideo,
@@ -460,16 +462,21 @@
 }
 
 .video-list {
-  width: calc(100% - 20rpx);
-  padding: 0 10rpx;
-  height: calc(100vh - 554rpx);
-  background-color: #fff;
+  width: 100%;
+    padding: 0 10rpx;
+    height: calc(100vh - 554rpx);
+    background-color: #fff;
+}
+
+.video-container {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
 }
 
 .video-item {
-  width: 50%;
-  padding: 10rpx;
-  box-sizing: border-box;
+  width: 49%;
+  margin-bottom: 20rpx;
   position: relative;
 }
 
@@ -481,15 +488,12 @@
 }
 
 .video-info {
-  display: flex;
-  height: 60rpx;
-  align-items: center;
-  font-size: 24rpx;
-  width: 100%;
-  padding-right: 20rpx;
-  box-sizing: border-box;
   position: absolute;
-  bottom: 20rpx;
+  bottom: 10rpx;
+  left: 0;
+  right: 0;
+  padding: 0 10rpx;
+  box-sizing: border-box;
 }
 
 .video-title {
@@ -569,8 +573,4 @@
   }
 }
 
-.video-container {
-	display: flex;
-	flex-wrap: wrap
-}
 </style>
\ No newline at end of file
diff --git a/pages/video/video-play.vue b/pages/video/video-play.vue
index d98f74e..4cf61c2 100644
--- a/pages/video/video-play.vue
+++ b/pages/video/video-play.vue
@@ -9,89 +9,141 @@
       @change="onSwiperChange"
     >
       <swiper-item v-for="(item, index) in videoList" :key="item.id">
-		<!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� -->
-		<view 
-		  class="play-icon" 
-		  @click="togglePlay(index)"
-		  v-if="!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(item.id, index)"
-          @pause="onPause(index)"
-          @ended="onEnded(index)"
-		  @click="togglePlay(index)"
-		  @timeupdate="onTimeUpdate($event)"
-        ></video>
-		
-		<!-- 鎮寕鍟嗗搧閾炬帴灞� -->
-		<view class="goods-link-warp">
-			<view class="goods-link">
-			  <view class="goods-container">
-			    <!-- 鍟嗗搧鍥剧墖 -->
-			    <image class="goods-image" :src="item.goods.imageUrl" mode="aspectFill"></image>
-			    
-			    <!-- 鍟嗗搧淇℃伅 -->
-			    <view class="goods-info">
-			      <text class="goods-name">{{item.goods.name}}</text>
-			      <view class="price-section">
-			        <text class="current-price">楼{{item.goods.price}}</text>
-			        <text class="original-price" v-if="item.goods.originalPrice">楼{{item.goods.originalPrice}}</text>
-			      </view>
-			      <text class="sales-count">{{item.goods.saleNum}}浜哄凡璐�</text>
-			    </view>
-			    
-			    <!-- 璐拱鎸夐挳 -->
-			    <view class="buy-button">
-			      <text>璐拱</text>
-			    </view>
-			  </view>
-			</view>
-		</view>
-		
-        
-        <!-- 瑙嗛淇℃伅灞� -->
-        <view class="video-info">
-		  <view>
-			  <text class="video-author">@{{item.authorName}}</text>
-		  </view>
-          <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
-			  <text class="video-title">{{item.title}}</text>
-			  <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text>
-		  </view>
-        </view>
-        
-        <!-- 鍙充晶浜掑姩鎸夐挳 -->
-       <view class="action-buttons">
-		   <view class="avatar-container">
-			   <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
-			   <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 -->
-			   <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
-				 <text class="iconfont">&#xe629;</text>
-			   </view>
-		   </view>
-          <view class="action-item" @click="toggleCollect(item, index)">
-			<text class="iconfont" v-if="item.collected">&#xe605;</text>
-			<text class="iconfont" v-else>&#xe601;</text>
-			<text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text>
+      	<view style="width: 100%;height: 100%;" v-if="item.videoContentType === 'video'">
+      		  <!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� -->
+      		  <view 
+      			class="play-icon" 
+      			@click="togglePlay(index)"
+      			v-if="!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"
+      			:enable-progress-gesture="false"
+      			class="video-item"
+      			@play="onPlay(item.id, index)"
+      			@pause="onPause(index)"
+      			@ended="onEnded(index)"
+      			@click="togglePlay(index)"
+      			@timeupdate="onTimeUpdate($event)"
+      			@loadedmetadata="onLoadedMetadata($event)"
+      			
+      		  ></video>
+      		  <!-- 鑷畾涔夋帶鍒舵潯 -->
+      		  <view 
+      			@touchstart="handleTouchStart"
+      			@touchmove="handleTouchMove"
+      			@touchend="handleTouchEnd"
+      			class="container">
+      			<!-- 杩涘害鏉� - 鏁翠釜鍖哄煙鍙嫋鍔� -->
+      			<view class="process-warp" :style="{ opacity: showProcess ? 1 : 0 }">
+      			  <!-- 鏄剧ず褰撳墠杩涘害 -->
+      			  <view class="progress-text">{{ hasPlayTime }}/{{formartDuration}}</view>
+      			  <view 
+      				class="progress-bar" 
+      				id="progressBar"
+      			  >
+      						  
+      				<!-- 宸插~鍏呴儴鍒� -->
+      				<view class="progress-fill" :style="{ width: progress + '%' }"></view>
+      			  </view>
+      			</view>
+      		  </view>
+      	</view>
+      	<view style="width: 100%; height: 100%;" v-else-if="item.videoContentType === 'img'">
+      	  <uni-swiper-dot 
+      		:info="item.imgs" 
+      		:current="currentImgIndex" 
+      		mode="round" 
+      		style="width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;"
+      		:dots-styles="{width: 24, bottom: 24,selectedBackgroundColor: 'green', backgroundColor: 'gray'}"
+      		>
+      	    <swiper class="swiper-box" @change="imgChange" :autoplay="true" :interval="3000">
+      	      <swiper-item v-for="img in item.imgs" :key="img">
+      	        <view class="swiper-item">
+      	          <!-- 璋冩暣 image 鏍峰紡锛屼娇鍏跺眳涓笖鎸夋瘮渚嬬缉鏀� -->
+      	          <image 
+      	            :src="img" 
+      	            mode="aspectFit" 
+      	            style="width: 100%; height: 100%; display: block; margin: 0 auto;"
+      	          ></image>
+      	        </view>
+      	      </swiper-item>
+      	    </swiper>
+      	  </uni-swiper-dot>
+      	</view>
+      	
+      	
+      	<!-- 鎮寕鍟嗗搧閾炬帴灞� -->
+      	<view class="goods-link-warp" v-if="item.goodsList.length > 0">
+      		<view class="goods-link">
+      		  <swiper @change="goodsChange" :autoplay="true" :interval="4000" style="height: 120rpx;">
+      			<swiper-item v-for="goods in item.goodsList" :key="goods.goodsId">
+      			  <view class="goods-container" @click="jumpToPay(item.id)">
+      				<!-- 鍟嗗搧鍥剧墖 -->
+      				<image class="goods-image" :src="goods.thumbnail" mode="aspectFill"></image>
+      				
+      				<!-- 鍟嗗搧淇℃伅 -->
+      				<view class="goods-info">
+      				  <text class="goods-name">{{goods.goodsName}}</text>
+      				  <view class="price-section">
+      					<text class="current-price">楼{{goods.price}}</text>
+      					<text class="original-price" v-if="goods.originalPrice">楼{{goods.originalPrice}}</text>
+      				  </view>
+      				</view>
+      			  </view>
+      			</swiper-item>
+      		  </swiper>
+      		</view>
+      	</view>
+      	
+          
+          <!-- 瑙嗛淇℃伅灞� -->
+          <view class="video-info">
+      	  <view>
+      		  <text class="video-author">@{{item.authorName}}</text>
+      	  </view>
+            <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
+      		  <text class="video-title">{{item.title}}</text>
+      		  <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text>
+      	  </view>
           </view>
-         <view class="action-item" @click="showComments(item)">
-            <text class="iconfont">&#xe7f7;</text>
-            <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text>
+          
+          <!-- 鍙充晶浜掑姩鎸夐挳 -->
+         <view class="action-buttons">
+      	   <view class="avatar-container">
+      		   <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
+      		   <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 -->
+      		   <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
+      			 <text class="iconfont">&#xe629;</text>
+      		   </view>
+      	   </view>
+            <view class="action-item" @click="toggleCollect(item, index)">
+      		<text class="iconfont" v-if="item.collected">&#xe605;</text>
+      		<text class="iconfont" v-else>&#xe601;</text>
+      		<text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text>
+            </view>
+           <view class="action-item" @click="showComments(item)">
+              <text class="iconfont">&#xe7f7;</text>
+              <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text>
+            </view>
+      	  <view class="action-item">
+      		  <button open-type="share" class="custom-share-btn" :data-obj="item">
+      		        <text class="iconfont">&#xe602;</text>
+      		      </button>
+      	     
+      	  </view>
           </view>
-        </view>
-		
-      </swiper-item>
-    </swiper>
+      	
+        </swiper-item>
+      </swiper>
 	
 	<!-- 璇勮寮圭獥 -->
 	<uni-popup ref="commentPopup" type="bottom" :is-mask-click="true" @maskClick="closeCommentPopup">
@@ -178,9 +230,29 @@
 <script>
 import { getRecommendVideos, savePlayRecord, subscribe, getVideoComments, addVideoComment, thubmsUpComment, cancelThubmsUpComment } from "@/api/video.js";
 import { changeCollect } from "@/api/collect.js";
+import { saveShare } from "@/api/share.js";
+import storage from "@/utils/storage.js";
 export default {
+	computed: {
+		    hasPlayTime() {
+		      return this.sliderFormatTime(this.progress > 0 ? this.duration * this.progress / 100 : 0);
+		    }
+	},
   data() {
     return {
+		currentImgIndex: 0, // 鎾斁鍒扮鍑犲紶鍥�--绱㈠紩
+		currentGoodsIndex: 0, // 鎾斁鍒扮鍑犱釜鍟嗗搧--绱㈠紩
+		currentTime: 0,
+		formartDuration: '',
+		duration: 0,
+		startX: 0,
+		progress: 0, // 瑙嗛杩涘害
+		startProgress : 0, // 寮�濮嬫粦鍔ㄦ椂鐨勮繘搴�
+		barLeft: 0, // 杩涘害鏉″乏杈圭晫浣嶇疆
+		barWidth: 0, // 杩涘害鏉″搴�
+		isDragging: false, // 鏄惁姝e湪鎷栧姩
+		processHidenTimer: null, // 杩涘害鏉¢殣钘忓畾鏃跺櫒
+		showProcess: false, // 鏄惁鏄剧ず杩涘害鏉�
 		videoNoMore: false, // 鏄惁杩樻湁鏇村瑙嗛
 		commentNoMore: false, // 鏄惁杩樻湁鏇村璇勮
 		commentQuery: {
@@ -253,6 +325,7 @@
 	  const playInfo = uni.getStorageSync("playInfo", playInfo);
 	  if(playInfo) {
 		  this.videoList = playInfo.videoList;
+		  console.log("鎷垮埌鏁版嵁浜�",playInfo);
 		  this.videoQuery.pageNumber = playInfo.pageNumber;
 		  this.videoNoMore = playInfo.nomore;
 		  this.videoQuery.authorId = option.authorId;
@@ -267,7 +340,51 @@
     // 鍒濆鍖栬棰戜笂涓嬫枃
     this.initVideoContexts();
   },
+  onShareAppMessage(e) {
+  	const userInfo = storage.getUserInfo();
+  	if(!userInfo) {
+  		console.log("鏈櫥褰曚笉鑳藉垎浜�");
+  		return
+  	}
+  	const videoInfo = e.target.dataset.obj;
+  	// 淇濆瓨鍒嗕韩璁板綍
+  	const data = {
+  		shareType: 'video',
+  		refId: videoInfo.id,
+  		shareUser: userInfo.id
+  	}
+  	saveShare(data)
+  	return {
+  		title: videoInfo.title,
+  		path: `/pages/tabbar/index/home?videoId=${videoInfo.id}&userId=${userInfo.id}`,
+  		imageUrl: videoInfo.coverUrl
+  	}
+  },
   methods: {
+	  // 鐐瑰嚮鍟嗗搧璺宠浆
+	  jumpToPay(videoId) {
+	  		uni.navigateTo({
+	  			url: '/pages/video/video-goods-detail?videoId=' + videoId
+	  		});
+	  },
+	  // 杞挱鍥惧彉鍖�
+	  imgChange(e) {
+	  		  this.currentImgIndex = e.detail.current;
+	  },
+	  // 鍟嗗搧杞挱鍥惧彉鍖�
+	  goodsChange(e) {
+	  		  this.currentGoodsIndex = e.detail.current;
+	  },
+	  // 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
+	  getBarRect() {
+	    const query = uni.createSelectorQuery().in(this);
+	    query.select('#progressBar').boundingClientRect(rect => {
+	      if (rect) {
+	        this.barLeft = rect.left;
+	        this.barWidth = rect.width;
+	      }
+	    }).exec();
+	  },
 		// 璺宠浆涓汉涓婚〉
 		jumpToHomePage(authorId) {
 			uni.navigateTo({
@@ -364,6 +481,12 @@
 			const input = this.$refs.commentInput;
 			if (input) input.focus();
 		  });
+		},
+		// 杩涘害鏉℃椂闂存牸寮忓寲 (00:00)
+		sliderFormatTime(seconds) {
+		  const mins = Math.floor(seconds / 60);
+		  const secs = Math.floor(seconds % 60);
+		  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
 		},
 		// 鏍煎紡鍖栨椂闂�
 	    formatTime(time) {
@@ -561,6 +684,67 @@
 			this.videoContexts[this.currentIndex].play();
 		}
     },
+	
+	// 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
+	getBarRect() {
+	  const query = uni.createSelectorQuery().in(this);
+	  query.select('#progressBar').boundingClientRect(rect => {
+	    if (rect) {
+	      this.barLeft = rect.left;
+	      this.barWidth = rect.width;
+	    }
+	  }).exec();
+	},
+	
+	// 瑙︽懜寮�濮�
+	handleTouchStart(e) {
+	  this.isDragging = true;
+	  this.showProcess = true;
+	  this.startProgress = this.progress; // 璁板綍寮�濮嬫椂鐨勮繘搴�
+	  this.startX = e.touches[0].pageX;
+	  console.log("璁板綍寮�濮嬫椂鐨勮繘搴�", this.startProgress);
+	  this.videoContexts[this.currentIndex].pause()
+	  // this.updateProgress(e);
+	},
+	
+	// 瑙︽懜绉诲姩
+	handleTouchMove(e) {
+	  if (!this.isDragging || !this.barWidth) return;
+	  clearTimeout(this.processHidenTimer)
+	  this.videoContexts[this.currentIndex].pause()
+	  this.updateProgress(e);
+	},
+	
+	// 瑙︽懜缁撴潫
+	handleTouchEnd() {
+	  this.isDragging = false;
+	  console.log("婊戝姩缁撴潫", this.duration * this.progress);
+	  this.videoContexts[this.currentIndex].seek(this.duration * this.progress / 100)
+	  this.videoContexts[this.currentIndex].play()
+	  this.processHidenTimer = setTimeout(() => {
+		  this.showProcess = false;
+		}, 1000);
+	},
+	
+	// 鏇存柊杩涘害
+	updateProgress(e) {
+		// 鑾峰彇褰撳墠瑙︽懜鐐筙鍧愭爣
+		const currentX = e.touches[0].pageX;
+		
+		// 璁$畻婊戝姩璺濈(鍍忕礌)
+		const deltaX = currentX - this.startX;
+		
+		// 灏嗗儚绱犺窛绂昏浆鎹负杩涘害澧為噺
+		const deltaProgress = (deltaX / this.barWidth) * 100;
+		console.log("杩涘害澧為噺", deltaProgress);
+		// 璁$畻鏂拌繘搴� = 寮�濮嬫椂鐨勮繘搴� + 婊戝姩澧為噺
+		let newProgress = this.startProgress + deltaProgress;
+		
+		// 闄愬埗鑼冨洿鍦�0-100涔嬮棿
+		newProgress = Math.max(0, Math.min(100, newProgress));
+		
+		this.progress = newProgress;
+	},
     
     // 鏀惰棌/鍙栨秷鏀惰棌
     toggleCollect(item, index) {
@@ -594,9 +778,15 @@
 	},
     // 瑙嗛鎾斁浜嬩欢
     onPlay(id, index) {
-		console.log(id, index, "瑙﹀彂鎾斁");
+		this.getBarRect()
+		this.progress = 0
 		if(index === this.currentIndex) {
 			this.currentVideoIsPlaying = true;
+			if(! this.duration) {
+				// 璁剧疆褰撳墠鎾斁瑙嗛鐨勬�绘椂闀�
+				this.duration = this.videoList[this.currentIndex].videoDuration;
+				this.formartDuration = this.sliderFormatTime(this.duration);
+			}
 		} else {
 			this.currentVideoIsPlaying = false;
 			return
@@ -632,8 +822,15 @@
 	// 璁板綍鎾斁鏃堕暱
 	onTimeUpdate(e) {
 		this.playRecord.playAt = e.detail.currentTime
+		this.currentTime = e.detail.currentTime;
+		this.progress = (e.detail.currentTime / this.duration) * 100
 	},
-	
+	// 鑾峰彇瑙嗛鎬绘椂闀�
+	onLoadedMetadata(e) {
+	  // this.duration = e.detail.duration;
+	  // this.formartDuration = this.sliderFormatTime(this.duration);
+	  // console.log("瑙嗛鎬绘椂闀�", this.duration);
+	},
 	// 淇濆瓨鎾斁璁板綍
 	async savePlayRecord() {
 		console.log(Date.now(), this.playRecord.startPlayTime, this.totalHidenTime);
@@ -669,7 +866,7 @@
 	
 	.video-swiper {
 	  width: 100%;
-	  height: 100%;
+	  height: calc(100% - 20rpx);
 	}
 	
 	.video-item {
@@ -691,7 +888,7 @@
 	.video-info {
 	  width: 70%;
 	  position: absolute;
-	  bottom: 70px;
+	  bottom: 20px;
 	  left: 20px;
 	  color: #f8f8f8;
 	  z-index: 10;
@@ -765,6 +962,7 @@
 	}
 	.goods-link {
 	  position: relative;
+	  width: 450rpx;
 	  margin: 20rpx 0;
 	  padding: 12rpx;
 	  background-color: rgba(255, 255, 255, 0.9);
@@ -773,6 +971,7 @@
 	}
 	
 	.goods-container {
+	  width: 100%;
 	  display: flex;
 	  align-items: center;
 	}
@@ -795,11 +994,13 @@
 	  font-size: 28rpx;
 	  color: #333;
 	  font-weight: bold;
-	  display: -webkit-box;
 	  -webkit-line-clamp: 2;
 	  -webkit-box-orient: vertical;
-	  overflow: hidden;
 	  margin-bottom: 8rpx;
+	  width: 280rpx; /* 闇�瑕佹寚瀹氬搴� */
+	  overflow: hidden;
+	  white-space: nowrap;
+	  text-overflow: ellipsis;
 	}
 	
 	.price-section {
@@ -1025,4 +1226,62 @@
 	.thumbs-num {
 		margin-left: 4rpx;
 	}
+	.container {
+	  display: flex;
+	  flex-direction: column;
+	  align-items: center;
+	  position: absolute;
+	  bottom: 0;
+	  width: 100%;
+	}
+	
+	.progress-bar {
+	  position: relative;
+	  width: 100%;
+	  height: 16px;
+	  background-color: #eee;
+	  overflow: hidden;
+	}
+	
+	.progress-fill {
+	  position: absolute;
+	  left: 0;
+	  top: 0;
+	  height: 100%;
+	  background-color: lightgray;
+	  transition: width 0.1s;
+	}
+	.process-warp {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+	.progress-text {
+	  margin-top: 10px;
+	  font-size: 14px;
+	  color: #666;
+	}
+	.swiper-box {
+	  width: 100%;
+	  height: 1200rpx;
+	}
+	.swiper-item {
+	  display: flex;
+	  justify-content: center;
+	  align-items: center;
+	  width: 100%;
+	  height: 100%;
+	}
+	.custom-share-btn {
+	  font-size: unset;
+	  background: none;
+	  padding: 0;
+	  margin: 0;
+	  line-height: normal;
+	  border: none;
+	}
+	.custom-share-btn::after {
+	  border: none;
+	}
 </style>
\ No newline at end of file

--
Gitblit v1.8.0