2025-04-01 09:03:51 +08:00

180 lines
5.6 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>
<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>