factory_mp_old/video.vue

410 lines
10 KiB
Vue
Raw Permalink 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>
<!-- <view style="height: 80upx;">
<uni-search-bar @confirm="startSearch" v-model="search"></uni-search-bar>
</view> -->
<scroll-view class="nav-scroll" :enable-flex="true" scroll-with-animation :throttle="false"
:scroll-left="scrollToLeft" scroll-x @scroll="handleScroll">
<view class="nav uni-nav">
<view class="nav-item" :class="swiperIndex == index ? 'nav-item-act' : ''" :key="item.title"
v-for="(item, index) in list" @click="taggleNav(index)">
{{ item.title }}
</view>
<view class="nav-line" :style="style"></view>
</view>
</scroll-view>
<view class="swiper">
<swiper :current="swiperIndex" :duration="300" class="swiper-1" easing-function="linear"
@change="swiperChange">
<swiper-item v-for="(item, index) in list" :key="item.title">
<scroll-view :lower-threshold="80" :refresher-triggered="refreStatus"
@refresherrefresh="handleRefre" :refresher-enabled="true" class="swiper-scroll" scroll-y="true"
@scrolltolower="swiperScrollLower">
<view>
<view class="swiper-item-list" v-for="video in item.content" :key="video.id">
<!-- <video class="video" :src="video.mediaurl" controls object-fit="cover"
:id="'video'+video.id" :poster="video.coverurl" @play="doPlay($event, index)"
@pause="doPlay($event, index)" @ended="doPlay($event, index)">
<view class='video-slot' v-if="video.showTitle" :title="video.name">
<span style="margin-left:6px">{{video.name}}</span>
</view>
</video> -->
<u-icon size="80" name="play-right-fill" color="rgb(245,245,245)" @click="videoOpen(video)" class="playIcon"></u-icon>
<view class='video-slot' v-if="video.showTitle" :title="video.name">
<span style="margin-left:6px">{{video.name}}</span>
</view>
<image :src="video.coverurl" class="video"></image>
<view style="color:darkblue;margin-left:4upx">
<text>{{video.name}}</text>
<text style="float:right;color:gray;margin-right: 8upx;">{{video.viewsp}}人观看</text>
</view>
</view>
</view>
<view style="color:gray;text-align: center;margin-top:20upx;">{{loadingText}}</view>
</scroll-view>
</swiper-item>
</swiper>
</view>
<view v-if="videoDialog" id="videoDialog">
<view class="closeIconWrap">
<u-icon size="60" name="close-circle" color="rgb(255,255,255)" @click="closeVideo" class="closeIcon"></u-icon>
</view>
<video class="video" :src="videoUrl" controls object-fit="cover"
:id="videoId" :poster="videoCoverurl" @play="doPlay($event)"
@pause="doPlay($event)" @ended="doPlay($event)">
</video>
</view>
</view>
</template>
<script>
export default {
data() {
return {
playingVideoStr: null,
swiperIndex: 0, //当前的swiperindex
navItemWidth: '', //选中下划线的宽度
navItemLeft: 0, //选中下划线的显示位置
scrollToLeft: 0, //scrollview需要滚动的距离
navInfos: [], //所有navitem的节点信息
parentLeft: 0, //nav盒子的节点信息
componentWidth: 0, //nav盒子的宽度
list: [{
id: 0,
title: '全部',
page: 1,
content: []
}],
refreStatus: false,
videoDialog:false,
loadingText: "加载中",
search:"",
videoCoverurl:'',
videoUrl:'',
videoId:0,
};
},
computed: {
style() {
return `width:${this.navItemWidth}px; left:${this.navItemLeft}px`;
}
},
mounted() {
// this.init();
},
onLoad() {
this.$u.api.getDickey({
pageoff: true,
type__code: 'data_video'
}).then(res => {
let list = [{
id: 0,
title: '全部',
page: 1,
content: []
}]
for (var i = 0; i < res.data.length; i++) {
let data = res.data[i]
list.push({
id: data.id,
title: data.name,
page: 1,
content: []
})
}
this.list = list
this.$nextTick(function() {
this.init()
this.getVideos()
});
})
},
methods: {
videoOpen(video){
debugger;
console.log(video)
this.videoId = video.id;
this.videoUrl = video.mediaurl;
this.videoCoverurl = video.coverurl;
this.videoDialog = true;
},
closeVideo(){
this.videoDialog = false;
},
doPlay(e, index) {
if (e.type == 'play') {
var playingVideoStr = e.target.id
// this.list[this.swiperIndex].content[index].showTitle = false
// this.$u.api.putMyVideoView(this.list[this.swiperIndex].content[index].id).then(res=>{})
this.$u.api.putMyVideoView(this.videoId).then(res=>{})
//暂停其他视频播放
if(this.playingVideoStr==null){
this.playingVideoStr = playingVideoStr
}
else if (playingVideoStr != this.playingVideoStr) {
var videoContextPrev = uni.createVideoContext(this.playingVideoStr)
videoContextPrev.pause()
this.playingVideoStr = playingVideoStr
}
} else {
// this.list[this.swiperIndex].content[index].showTitle = true
}
},
// 获取dom信息
init() {
const query = uni.createSelectorQuery().in(this);
query.select('.uni-nav').fields({
rect: true,
size: true
}, res => {
this.parentLeft = res.left;
this.componentWidth = res.width;
console.log('res==>', res);
});
query.selectAll('.nav-item').fields({
rect: true,
size: true
}, data => {
data.forEach((item, index) => {
if (index == 0) {
this.navItemWidth = item.width;
this.navItemLeft = item.left;
}
this.navInfos.push({
width: item.width,
left: item.left
});
});
});
query.exec();
},
// 点击导航切换swiper
taggleNav(val) {
this.swiperIndex = val;
},
// 滚动tabs以及移动下划线
scrollDom() {
let info = this.navInfos[this.swiperIndex];
let offsetLeft = info.left - this.parentLeft;
let scrollLeft = offsetLeft - (this.componentWidth - info.width) / 2;
this.scrollToLeft = scrollLeft < 0 ? 0 : scrollLeft;
this.navItemLeft = this.navInfos[this.swiperIndex].left;
setTimeout(() => {
this.navItemWidth = info.width;
}, 50);
},
// swiper的index变动
swiperChange(e) {
this.swiperIndex = e.detail.current;
this.scrollDom();
this.$emit('currentIndex', this.swiperIndex);
if (this.list[e.detail.current].content.length == 0) {
this.getVideos()
}
},
// tabs-scrollview触底
handleScroll(e) {
this.scrollDom();
},
// swiper-ScrollLower触底
swiperScrollLower() {
// uni.showToast({
// icon: 'none',
// title: `此时为${this.list[this.swiperIndex].title}触底`
// });
// setTimeout(() => {
// this.getData();
// }, 500);
this.list[this.swiperIndex].page = this.list[this.swiperIndex].page + 1
this.getVideos()
},
getVideos() {
let swiperIndex = this.swiperIndex
let currentData = this.list[swiperIndex]
var params = {
page: currentData.page
}
if (currentData.id == 0) {} else {
params.category = currentData.id
}
this.$u.api.getVideos(params).then(res => {
this.refreStatus = false
let results = res.data.results
for (var i = 0; i < results.length; i++) {
results[i].showTitle = true
}
if (currentData.page == 1) {
if (results == 0) {
this.loadingText = '暂无视频'
} else {
this.loadingText = ''
this.list[swiperIndex].content = results
}
} else {
this.loadingText = ''
this.list[swiperIndex].content.concat(results)
}
}).catch(res => {
this.refreStatus = false
if (res.code == 404) {
this.loadingText = '到底了'
}
})
},
// 生成列表数据
getData() {
uni.showLoading({
title: '加载中'
});
setTimeout(() => {
for (let index = 0; index < 10; index++) {
let arr = this.list[this.swiperIndex].content;
this.$set(arr, arr.length, Math.random() + '-' + index + this.list[this.swiperIndex]
.title);
}
uni.hideLoading();
}, 1000);
console.log(this.list[this.swiperIndex]);
},
// 下拉事件
handleRefre() {
this.refreStatus = true;
// uni.showLoading({
// title: '下拉加载中'
// });
this.list[this.swiperIndex].page = 1
this.getVideos()
// setTimeout(() => {
// this.list[this.swiperIndex].content = [];
// for (var i = 0; i < 5; i++) {
// this.list[this.swiperIndex].content.push([this.list[this.swiperIndex].title + '下拉-' + i]);
// }
// uni.hideLoading();
// }, 1000);
// setTimeout(() => {
// this.refreStatus = false;
// }, 1000);
},
startSearch(e){
console.log(e)
}
}
};
</script>
<style lang="scss" scoped>
.nav-item {
display: inline-block;
margin: 0 16upx;
text-align: center;
transition: color 0.3s ease;
}
.nav {
white-space: nowrap;
position: relative;
height: 80upx;
padding: 20upx 0;
}
/* #ifndef APP-NVUE */
::-webkit-scrollbar {
display: none;
}
/* #endif */
/* #ifdef H5 */
// 通过样式穿透隐藏H5下scroll-view下的滚动条
scroll-view ::v-deep ::-webkit-scrollbar {
display: none;
}
/* #endif */
.nav-item-act {
color: pink;
font-weight: bolder;
}
.nav-line {
position: absolute;
bottom: 0;
height: 10upx;
border-radius: 10upx;
background-color: pink;
transition: left 0.3s ease;
}
swiper {
height: calc(100vh - 80upx);
}
// swiper-item {
// text-align: center;
// color: #000;
// position: relative;
// background-color: skyblue;
// color: #fff;
// }
.swiper-item {
overflow-y: scroll;
}
.swiper-item-list {
margin-top:4upx;
// height: 400upx;
border-bottom: 4upx solid pink;
// line-height: 400upx;
position: relative;
}
.swiper-scroll {
height: 100%;
}
.video {
width: 100%;
height: 380rpx;
}
.video-slot {
width: 100%;
height: 40px;
line-height: 40px;
font-size: 16px;
color: white;
background-color: black;
opacity: 0.6;
position: absolute;
}
.playIcon{
position: absolute;
top: 50%;
left: 50%;
z-index: 100;
transform: translate(-50%, -50%);
}
#videoDialog{
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.5);
}
.closeIconWrap{
position: relative;
text-align: right;
}
.closeIcon{
padding: 20px;
margin-bottom: 10px;
}
</style>