From 1076d3e64cfb8648e429b3d7a3399e4593affc0c Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期一, 26 五月 2025 18:11:03 +0800 Subject: [PATCH] 发布视频时获取视频时长、视频暂停功能 --- pages/tabbar/index/home.vue | 172 +++++++++++++++++++++++++++----------------------------- 1 files changed, 83 insertions(+), 89 deletions(-) diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue index 6e9643b..0fb56be 100644 --- a/pages/tabbar/index/home.vue +++ b/pages/tabbar/index/home.vue @@ -9,9 +9,18 @@ @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" - :src="item.url" + :ref="'video'+index" + :src="item.videoUrl" :autoplay="currentIndex === index" :controls="false" :loop="true" @@ -20,6 +29,7 @@ @play="onPlay(index)" @pause="onPause(index)" @ended="onEnded(index)" + @click="togglePlay(index)" ></video> <!-- 鎮寕鍟嗗搧閾炬帴灞� --> @@ -27,7 +37,7 @@ <view class="goods-link"> <view class="goods-container"> <!-- 鍟嗗搧鍥剧墖 --> - <image class="goods-image" :src="item.goods.image" mode="aspectFill"></image> + <image class="goods-image" :src="item.goods.imageUrl" mode="aspectFill"></image> <!-- 鍟嗗搧淇℃伅 --> <view class="goods-info"> @@ -36,7 +46,7 @@ <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.sales}}浜哄凡璐�</text> + <text class="sales-count">{{item.goods.saleNum}}浜哄凡璐�</text> </view> <!-- 璐拱鎸夐挳 --> @@ -51,11 +61,11 @@ <!-- 瑙嗛淇℃伅灞� --> <view class="video-info"> <view> - <text class="video-author">@{{item.author}}</text> + <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.tags" :key="tag">#{{tag}}</text> + <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag">#{{tag.tagName}}</text> </view> </view> @@ -68,67 +78,34 @@ <text class="iconfont"></text> </view> </view> - <view class="action-item" @click="toggleCollect(item)"> - <!-- <image :src="item.isCollected ? '/static/collected.png' : '/static/collect.png'"></image> --> + <view class="action-item" @click="toggleCollect(item, index)"> <text class="iconfont" v-if="item.collected"></text> <text class="iconfont" v-else></text> - <text style="font-size: 10px;font-weight: lighter;">{{item.collectCount}}</text> + <text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text> </view> <view class="action-item" @click="showComments(item)"> <text class="iconfont"></text> - <text style="font-size: 10px;font-weight: lighter;">{{item.commentCount}}</text> + <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text> </view> </view> </swiper-item> </swiper> - <custom-tabbar bgColor="#333333" :selected="0" selectedTextColor="#ffffff"></custom-tabbar> + <custom-tabbar bgColor="#333333" selected="index" selectedTextColor="#ffffff"></custom-tabbar> </view> </template> <script> +import { getRecommendVideos } from "@/api/video.js"; +import { changeCollect } from "@/api/collect.js"; export default { data() { return { + currentVideoIsPlaying: false, // 褰撳墠瑙嗛鏄惁姝e湪鎾斁 isFullScreen: false, windowHeight: 0, currentIndex: 0, // 褰撳墠鎾斁鐨勮棰戠储寮� videoList: [ - { - url: 'http://vjs.zencdn.net/v/oceans.mp4', - objectFit: 'contain', - title: '鎴戜簡涓�', - author: 'xp', - authorAvatar: 'https://picsum.photos/200/200?random=2', - collected: true, - commentCount: 12, - collectCount: 45, - tags: ["浜斾竴", "鐖辩編椋�", "澹ぇ澶�熷害鍜岀矇绾㈣壊鐨勬仮澶嶉�熷害鐨勫彛琚嬬┖绌�"], - goods: { - name: '鎺ㄦ祦', - price: '10', - originalPrice: '48.9', - sales: 1988, - image: 'https://picsum.photos/200/200?random=2' - } - }, - { - url: 'https://videos.pexels.com/video-files/30900524/13210612_1080_1920_30fps.mp4', - objectFit: 'cover', - title: '鎴戜簡涓�', - author: 'xp', - authorAvatar: 'https://picsum.photos/200/200?random=2', - collected: false, - commentCount: 6, - collectCount: 45, - tags: ["鎴戝枩娆�"], - goods: { - name: '鎺ㄦ祦', - price: '10', - originalPrice: '48.9', - sales: 1988, - image: 'https://picsum.photos/200/200?random=2' - } - }, + ], // 瑙嗛鍒楄〃鏁版嵁 videoContexts: [], // 瑙嗛涓婁笅鏂囧璞¢泦鍚� loading: false, // 鏄惁姝e湪鍔犺浇 @@ -136,8 +113,11 @@ pageSize: 10 // 姣忛〉鏁伴噺 } }, + onShow() { + this.loadVideos(); + }, onLoad() { - // this.loadVideos(); + this.loadVideos(); }, onReady() { // 鍒濆鍖栬棰戜笂涓嬫枃 @@ -148,7 +128,6 @@ initVideoContexts() { this.videoContexts = this.videoList.map((_, index) => { let videoContent = uni.createVideoContext(`video${index}`, this); - // videoContent.requestFullScreen({ direction: 0 }); return videoContent; }); }, @@ -158,30 +137,20 @@ if (this.loading) return; this.loading = true; - try { - const res = await uni.request({ - url: 'https://your-api.com/videos', - data: { - page: this.page, - pageSize: this.pageSize - } - }); - - if (this.page === 1) { - this.videoList = res.data.list; - } else { - this.videoList = [...this.videoList, ...res.data.list]; - } - - this.page++; - this.$nextTick(() => { - this.initVideoContexts(); - }); - } catch (e) { - console.error('鍔犺浇瑙嗛澶辫触', e); - } finally { - this.loading = false; - } + getRecommendVideos({pageNumber: this.page, pageSize: this.pageSize}).then(res => { + console.log(res, "瑙嗛鏁版嵁"); + if (this.page === 1) { + this.videoList = res.data.data; + } else { + this.videoList = [...this.videoList, ...res.data.data]; + } + + this.page++; + this.$nextTick(() => { + this.initVideoContexts(); + }); + this.loading = false; + }) }, // 婊戝姩鍒囨崲瑙嗛 @@ -200,34 +169,49 @@ } }, - // 鐐硅禐/鍙栨秷鐐硅禐 - toggleLike(item) { - item.isLiked = !item.isLiked; - item.likeCount += item.isLiked ? 1 : -1; - - uni.request({ - url: `https://your-api.com/video/${item.id}/like`, - method: item.isLiked ? 'POST' : 'DELETE' - }); + // 鏀惰棌/鍙栨秷鏀惰棌 + toggleCollect(item, index) { + let data = { + refId: item.id, + collectType: 'video' + } + const beforeCollected = item.collected + const beforeCollectNum = item.collectNum + if(item.collected) { + this.videoList[index].collected = false + this.videoList[index].collectNum -= 1 + } else { + this.videoList[index].collected = true + this.videoList[index].collectNum += 1 + } + changeCollect(data).then(res => { + if(res.data.code !== 200) { + this.videoList[index].collected = beforeCollected + this.videoList[index].collectNum = beforeCollectNum + } + }) }, - + // 鍗曞嚮灞忓箷锛氭殏鍋滄垨缁х画鎾斁 + togglePlay(index) { + if(this.currentVideoIsPlaying) { + this.videoContexts[index].pause(); + } else { + this.videoContexts[index].play(); + } + }, // 瑙嗛鎾斁浜嬩欢 onPlay(index) { - console.log(`瑙嗛 ${index} 寮�濮嬫挱鏀綻); + this.currentVideoIsPlaying = true; }, // 瑙嗛鏆傚仠浜嬩欢 onPause(index) { - console.log(`瑙嗛 ${index} 鏆傚仠`); + this.currentVideoIsPlaying = false; }, // 瑙嗛缁撴潫浜嬩欢 onEnded(index) { - console.log(`瑙嗛 ${index} 鎾斁缁撴潫`); - // 鑷姩鎾斁涓嬩竴涓紙濡傛灉涓嶅湪鏈�鍚庝竴涓級 - if (index < this.videoList.length - 1) { - this.currentIndex = index + 1; - } + this.currentVideoIsPlaying = false; } } } @@ -253,6 +237,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