Files
new_app/components/my-video-list/list-item.vue
2025-01-09 09:28:23 +08:00

337 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="item" @appear="appear" @disappear="disappear">
<video class="u-flex-1 video" :show-fullscreen-btn="false" @controlstoggle="controlstoggles"
v-if="showVideo" @waiting="waiting()" object-fit="cover"
@play="videoPlay('myVideo'+item.courseDetailsId,item.courseDetailsId)" :play-strategy="2"
:show-loading="true" codec="software" :muted="false" :show-center-play-btn="true" :loop="false"
:enable-progress-gesture="false" :poster="item.titleImg" :ref="'myVideo'+item.courseDetailsId"
:autoplay="autoplay" @ended="ended" :id="'myVideo'+item.courseDetailsId" :src="item.videoUrl"></video>
<image class="poster" v-else @click="popupShow('pay')" :src="item.titleImg" mode="aspectFill"></image>
<view class="info">
<text class="color-fff" v-if="item.courseDetailsName">{{item.courseDetailsName}}</text>
<view v-if="item.content" v-html="item.content"></view>
<view class="u-m-t-20 color-fff" @click="popupShow('show')">
<text class="color-fff">
{{item.courseDetailsName}}{{total}}选集 >
</text>
</view>
</view>
<view class="right">
<view class="love u-flex u-flex-xy-center u-flex-col u-m-b-40 u-text-center" @click="dianzanClick">
<up-icon name="heart-fill" v-if="item.isGood==1" color="red" size="30"></up-icon>
<up-icon name="heart-fill" v-else color="#ffffff" size="30"></up-icon>
<text class="text color-fff">{{item.goodNum}}</text>
</view>
<view class="share u-m-b-40 u-flex u-flex-xy-center u-flex-col u-text-center" @click="share">
<image class="icon" src="@/static/images/share.png" mode=""></image>
<text class="text color-fff">分享</text>
</view>
<view class="zhuiju u-m-b-40 u-flex u-flex-xy-center u-flex-col u-text-center" @click="zhuijuClick">
<image class="icon" v-if="isCollect" src="@/static/images/shuqian.png" mode=""></image>
<image class="icon" v-else src="@/static/images/shuqian_s.png" mode=""></image>
<text class="text color-fff">{{isCollect?'已追':'追剧'}}</text>
</view>
</view>
</view>
</template>
<script setup>
import {
computed,
onMounted,
ref
} from 'vue'
const props = defineProps({
item: {
type: Object,
defaulr: () => {
return {videoUrl:''}
}
},
instance: {
type: Object,
defaulr: () => {
return {
proxy: {}
}
}
},
current: {
//h5判断是否是当前项目
type: Number,
default: 0
},
index: {
type: Number,
default: 0
},
nowIndex:{
//app判断是否是当前项目
type: Number,
default: 0
},
total: {
type: Number,
default: 0
},
isCollect: {
type: [Number, Boolean],
default: 0
}
})
let autoplay = ref(props.item.videoUrl?true:false)
const emits = defineEmits(['controlstoggles', 'disappear', 'appear', 'waiting', 'videoPlay', 'ended', 'dianzanClick',
'share', 'zhuijuClick', 'popupShow'
])
function controlstoggles() {
}
function waiting() {
}
function videoPlay() {
}
function ended() {
}
function dianzanClick() {
emits('dianzanClick')
}
function share() {
emits('share')
}
function zhuijuClick() {
emits('zhuijuClick')
}
function popupShow(key) {
emits('popupShow', key)
}
function appear() {
video && video.play()
emits('appear')
}
let video = null
function disappear() {
video && video.pause()
emits('disappear')
}
const showVideo=computed(()=>{
// #ifdef H5
return props.current === props.index && props.item.videoUrl
// #endif
// #ifdef APP
return props.nowIndex === props.index && props.item.videoUrl
// #endif
})
onMounted(() => {
console.log('onMounted');
try {
if(props.item.videoUrl){
video = uni.createVideoContext('myVideo' + props.item.courseDetailsId)
}
} catch (error) {
console.error('------')
//TODO handle the exception
}
})
</script>
<style lang="scss" scoped>
.item {
flex: 1;
height: 100%;
position: relative;
}
.box {
/* #ifdef H5 */
flex: 1;
/* #endif */
}
.u-flex-1 {
flex: 1;
width: 100%;
height: 100%;
}
.u-popup {
position: fixed !important;
}
::v-deep .u-popup {
position: fixed !important;
}
.video {
width: 750rpx;
flex: 1;
}
.poster {
/* #ifdef H5 */
position: absolute;
width: 100%;
height: 90%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* #endif */
/* #ifdef APP */
width: 750rpx;
flex: 1;
/* #endif */
}
.u-text-center {
text-align: center;
}
.u-flex-row {
flex-direction: row !important;
}
.info {
/* #ifdef H5 */
width: 80%;
/* #endif */
height: auto;
position: absolute !important;
bottom: 50px;
left: 10px;
color: #ffffff;
font-size: 15px;
z-index: 9999;
}
.u-flex-y-center {
align-items: center !important;
}
.swipers-items {
width: 750rpx;
flex: 1;
position: relative;
background-color: #000;
}
.right {
position: absolute !important;
right: 20rpx;
/* #ifdef H5 */
top: 50%;
transform: translateY(-50%);
/* #endif */
/* #ifdef APP */
top: 500px;
/* #endif */
z-index: 999;
color: #fff;
font-size: 24rpx;
.icon {
width: 60rpx;
height: 60rpx;
}
.share {
.text {
white-space: nowrap;
}
}
.zhuiju {}
}
.poster-popup {
position: fixed !important;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 9999;
justify-content: center;
align-items: center;
}
.ji-list {
.ji-item {
width: 210rpx;
margin-bottom: 20rpx;
margin-right: 30rpx;
height: 88rpx;
font-size: 28rpx;
color: #333;
border-radius: 12rpx;
background-color: #F5F7FF;
position: relative;
&.active {
background-color: $my-main-color;
color: #fff;
}
.lock {
position: absolute;
border-radius: 0px 6px 0px 6px;
background-color: #ccc;
padding: 2rpx 4rpx;
top: 0;
right: 0;
}
.playing {
position: absolute;
width: 32rpx;
height: 24rpx;
bottom: 5px;
right: 7px;
}
}
}
.ji-item:nth-of-type(3n) {
margin-right: 0;
}
.hot {
width: 40rpx;
height: 40rpx;
}
.pay-list {
.pay-list-item {
flex-direction: row;
justify-content: center;
background-color: #F2F2F2;
padding: 24rpx;
border-radius: 20rpx;
margin-bottom: 40rpx;
}
}
.zhifubao {
width: 56rpx;
height: 56rpx;
}
</style>