180 lines
5.6 KiB
Vue
180 lines
5.6 KiB
Vue
|
<template>
|
|||
|
<swiper class="swiper" circular :autoplay="autoplaySwiper" :indicator-dots="dotsShow" :current="swiperCurrent" @change="swiperChange">
|
|||
|
<swiper-item v-for="(item,index) in list" :key="index">
|
|||
|
<image class="swiper-image" v-if="isImageUrl(item.image)" @click="click(item.url)" :src="item.image" mode="scaleToFill" lazy-load />
|
|||
|
<div style="height: 100%;width: 100%;position: relative;" v-else>
|
|||
|
<!-- #ifdef APP -->
|
|||
|
<MyVideo :item="item" :isPlay="!isShow && videoId == item.id" @onEnded="endVideo(item.id)" />
|
|||
|
<view v-if="isShow"
|
|||
|
style="z-index:99;position: absolute;width:100%;height:100%;top:0;left:0;display:flex; justify-content:center; align-items:center;">
|
|||
|
<image @click.stop="plays(item.id,index)" src="@/static/bofang.png"
|
|||
|
style="width: 40px;height: 40px;"></image>
|
|||
|
</view>
|
|||
|
<!-- #endif -->
|
|||
|
<!-- #ifdef MP-WEIXIN -->
|
|||
|
<video class="swiper-video" :id="`Video${item.id}`" :src="item.image" :autoplay="true"
|
|||
|
:controls="true" :show-center-play-btn="false" :enable-progress-gesture="false"
|
|||
|
@ended="endVideo(item.id)" @loadedmetadata="loadVideo(item.id)" />
|
|||
|
<cover-view v-if="isShow"
|
|||
|
style="z-index:99;position: absolute;width:100%;height:100%;top:0;left:0;display:flex; justify-content:center; align-items:center;">
|
|||
|
<cover-image @click.stop="plays(item.id,index)" src="@/static/bofang.png"
|
|||
|
style="width: 40px;height: 40px;"></cover-image>
|
|||
|
</cover-view>
|
|||
|
<!-- #endif -->
|
|||
|
<!-- #ifdef H5 -->
|
|||
|
<video class="swiper-video" :id="`Video${item.id}`" :src="item.image" :autoplay="true" :controls="false"
|
|||
|
:show-center-play-btn="false" :enable-progress-gesture="false" @ended="endVideo(item.id)" />
|
|||
|
<view v-if="isShow"
|
|||
|
style="z-index:99;position: absolute;width:100%;height:100%;top:0;left:0;display:flex; justify-content:center; align-items:center;">
|
|||
|
<image @click.stop="plays(item.id,index)" src="@/static/bofang.png"
|
|||
|
style="width: 40px;height: 40px;"></image>
|
|||
|
</view>
|
|||
|
<!-- #endif -->
|
|||
|
</div>
|
|||
|
</swiper-item>
|
|||
|
</swiper>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
// #ifdef APP
|
|||
|
import MyVideo from '@/components/fuyu-MixSwiper/MyVideo.vue'
|
|||
|
// #endif
|
|||
|
export default {
|
|||
|
components: {
|
|||
|
// #ifdef APP
|
|||
|
MyVideo
|
|||
|
// #endif
|
|||
|
},
|
|||
|
props: {
|
|||
|
list: {
|
|||
|
type: Array,
|
|||
|
default: () => []
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
swiperCurrent: 0, //轮播下标
|
|||
|
autoplaySwiper: true,
|
|||
|
isShow: true,
|
|||
|
videoIndex: null,
|
|||
|
videoId: null,
|
|||
|
dotsShow:true,
|
|||
|
currentItemType:''
|
|||
|
}
|
|||
|
},
|
|||
|
created() {
|
|||
|
// #ifdef MP-WEIXIN
|
|||
|
const regex = /^(http|https):\/\//;
|
|||
|
this.list.forEach(v => {
|
|||
|
const bool = regex.test(v.url);
|
|||
|
if (!bool) {
|
|||
|
const fs = uni.getFileSystemManager();
|
|||
|
const res = new Promise((resolve, reject) => {
|
|||
|
fs.readFile({
|
|||
|
filePath: v.url, // 相对于static目录的路径
|
|||
|
encoding: 'base64',
|
|||
|
success: (res) => {
|
|||
|
v.url = res.data
|
|||
|
// 为临时文件生成一个文件名,您可以根据需要自定义文件名
|
|||
|
const fileName = `temp_video_${Date.now()}.mp4`;
|
|||
|
// 指定临时文件的完整路径
|
|||
|
const tempFilePath = `${uni.env.USER_DATA_PATH}/${fileName}`;
|
|||
|
// 将Base64编码的数据写入临时文件
|
|||
|
fs.writeFile({
|
|||
|
filePath: tempFilePath, // 临时文件路径
|
|||
|
data: v.url, // Base64数据(去掉数据URI部分)
|
|||
|
encoding: 'base64', // 指定编码格式为base64
|
|||
|
success: () => {
|
|||
|
v.url = tempFilePath
|
|||
|
},
|
|||
|
fail: (err) => {
|
|||
|
console.error('写入文件失败:', err);
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
fail: (err) => {
|
|||
|
console.error('读取视频文件失败:', err);
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
// #endif
|
|||
|
},
|
|||
|
methods: {
|
|||
|
swiperChange(e) {
|
|||
|
this.swiperCurrent = e.detail.current;
|
|||
|
const currentItem = this.list[this.swiperCurrent];
|
|||
|
this.currentItemType = currentItem.showtype;
|
|||
|
if (this.currentItemType === 'video') {
|
|||
|
this.dotsShow = false
|
|||
|
} else {
|
|||
|
this.dotsShow = true
|
|||
|
}
|
|||
|
if (e.detail.current != this.videoIndex) {
|
|||
|
this.endVideo(this.videoId, 'swiper')
|
|||
|
}
|
|||
|
},
|
|||
|
click(e){
|
|||
|
uni.navigateTo({
|
|||
|
url: e
|
|||
|
});
|
|||
|
},
|
|||
|
isImageUrl(url) {
|
|||
|
// 定义常见的图片文件后缀
|
|||
|
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg'];
|
|||
|
// 获取URL中的文件后缀
|
|||
|
const ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
|
|||
|
// 检查文件后缀是否在图片文件后缀数组中
|
|||
|
return imageExtensions.includes(ext)
|
|||
|
},
|
|||
|
//当video播放得时候 覆盖曾隐藏,不能轮播
|
|||
|
plays(id, index) {
|
|||
|
// #ifndef APP
|
|||
|
let videoContext = uni.createVideoContext(`Video${id}`, this);
|
|||
|
videoContext.play()
|
|||
|
// #endif
|
|||
|
this.videoId = id
|
|||
|
this.videoIndex = index
|
|||
|
this.isShow = false
|
|||
|
this.autoplaySwiper = false
|
|||
|
},
|
|||
|
//加载视频时触发,解决小程序加载报错问题
|
|||
|
loadVideo(id) {
|
|||
|
let videoContext = uni.createVideoContext(`Video${id}`, this);
|
|||
|
videoContext.pause()
|
|||
|
videoContext.seek(0)
|
|||
|
},
|
|||
|
//当video播放结束得时候 进行初始化,恢复轮播
|
|||
|
endVideo(id, type) {
|
|||
|
// #ifndef APP
|
|||
|
let videoContext = uni.createVideoContext(`Video${id}`, this);
|
|||
|
videoContext.pause()
|
|||
|
// #endif
|
|||
|
this.isShow = true
|
|||
|
this.videoIndex = null
|
|||
|
this.videoId = null
|
|||
|
this.autoplaySwiper = true
|
|||
|
if (!type) {
|
|||
|
setTimeout(v => {
|
|||
|
this.swiperCurrent++
|
|||
|
}, 500)
|
|||
|
}
|
|||
|
},
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
<style scoped>
|
|||
|
.swiper {
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
}
|
|||
|
|
|||
|
.swiper-image,
|
|||
|
.swiper-video {
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
border-radius: 10rpx;
|
|||
|
object-fit: contain;
|
|||
|
}
|
|||
|
</style>
|