修改视频

master
xcw 2023-02-21 14:20:06 +08:00
parent 19718e29b4
commit 1c6e8206ad
11 changed files with 624 additions and 23 deletions

View File

@ -2,9 +2,13 @@
<view class="banner-box">
<swiper :current="bcurrent" @change="changeBanner" :style="{height: newHeight}" :autoplay="ifAutoplay" :circular="true" :interval="3000" :duration="500">
<swiper-item v-for="(item,index) in bannerList" :key="index">
<view @tap="chooseImg(index,item.url)" class="img-box">
<image :style="{borderRadius:newRadius,height:newHeight}" class="img animated fadeIn" :src="item.imgSrc" mode="aspectFill"></image>
<image @tap.stop="playVideo(index)" v-if="item.isVideo && isVideo" class="posia animated bounceIn" style="width: 126rpx;height: 126rpx;z-index: 1;" src="/static/public/video.png" mode=""></image>
<view @tap="chooseImg(index,item.url,item.type)" class="img-box">
<!-- 图片 -->
<image :style="{borderRadius:newRadius,height:newHeight}" class="img animated fadeIn" :src="item.imgSrc" mode="aspectFill" v-if="item.type === 'img'"></image>
<!-- 视频 -->
<video :id="`video${index}`" style="width: 100%;" v-if="item.type === 'video'"
:videoAutoplay="videoAutoPlay" :enable-progress-gesture="false" :src="item.imgSrc"
@play="handleVideoPlay" @pause="handleVideoPause" @ended="handleVideoEnd" class="banner-video"></video>
</view>
</swiper-item>
</swiper>
@ -30,9 +34,9 @@
type:Array,
default:function(){
return [
{imgSrc:'https://s6.jpg.cm/2022/02/14/L4oDhy.jpg',url:'',isVideo:false,poster:''},
{imgSrc:'https://s6.jpg.cm/2022/02/14/L4oDhy.jpg',url:'',isVideo:false,poster:''},
{imgSrc:'https://s6.jpg.cm/2022/02/14/L4oDhy.jpg',url:'',isVideo:false,poster:''},
{imgSrc:'https://s6.jpg.cm/2022/02/14/L4oDhy.jpg',url:'',isVideo:false,poster:'',type:'image'},
{imgSrc:'https://www.runoob.com/try/demo_source/movie.mp4',url:'',isVideo:false,poster:'',type:'video'},
{imgSrc:'https://s6.jpg.cm/2022/02/14/L4oDhy.jpg',url:'',isVideo:false,poster:'',type:'image'},
]
}
},
@ -51,15 +55,25 @@
browseP:{//
type:Boolean,
default:false
}
},
ifAutoplays: { //banner
type: Boolean,
default: true,
},
videoAutoPlays: { //
type: Boolean,
default: true,
},
},
computed: {
...mapState({
ifAutoplay: state => state.moduleA.ifAutoplay
})
// ...mapState({
// ifAutoplay: state => state.moduleA.ifAutoplay
// })
},
data() {
return {
videoAutoPlay: this.videoAutoPlays,
ifAutoplay: this.ifAutoplays,
bcurrent: 0, //
isShowVideo:false, //
isVideo:uni.getStorageSync('is_video') //
@ -67,7 +81,7 @@
},
methods:{
//
chooseImg(index,url){
chooseImg(index,url,type){
// console.log('banner',index);
this.bcurrent = index
if(this.browseP){
@ -97,7 +111,9 @@
current:this.bcurrent,
sources:imgList
})
} else {
} else if(type == 'video') {
return false
}else {
//
uni.navigateTo({
url:`/${url}`
@ -106,8 +122,20 @@
},
//
changeBanner(e){
this.bcurrent = e.detail.current//
// console.log(this.bcurrent);
this.bcurrent = e.detail.current;//
let videoIndex = e.detail.current;
//
uni.createVideoContext("video" + (videoIndex),this).pause()
},
handleVideoPlay() {
this.ifAutoplay = false
this.videoAutoPlay = true;
},
handleVideoPause() {
this.ifAutoplay = true
},
handleVideoEnd() {
this.ifAutoplay = true;
},
//
chooseDot(index){
@ -118,16 +146,22 @@
uni.navigateTo({
url:`/pagesB/video/playVideo?src=${this.bannerList[index].url}&posterSrc=${this.bannerList[index].poster}`
})
}
},
}
}
</script>
<style scoped>
.banner-box{position: relative;}
.img-box{position: relative;display: flex;justify-content: center;align-items: center;}
.img-box{position: relative;display: flex;justify-content: center;align-items: center;width: 100%;height: 100%;}
.img{width:100%;vertical-align: bottom;}
.dot-box{position: absolute;bottom: 36rpx;display: flex;justify-content: center;width: 100%;}
.dotActive{width: 16rpx;height: 16rpx;margin-right: 16rpx;border-radius: 100%; background-color: rgba(255, 255, 255, 1);}
.dotMo{width: 16rpx;height: 16rpx;margin-right: 16rpx;border-radius: 100%;background-color: rgba(0, 0, 0, 0.5);}
.banner-video {
width: 100%;
height: 100%;
object-fit: fill;
display: block;
}
</style>

View File

@ -119,6 +119,24 @@
"enablePullDownRefresh": false
}
}
,{
"path" : "my-share/my-share",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "my-watch/my-watch",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
]
},
@ -214,6 +232,26 @@
"enablePullDownRefresh": false
}
}
,{
"path" : "course-list/course-list",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
,{
"path" : "course-video/course-video",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
]
}

View File

@ -65,7 +65,9 @@
{src:'/static/tabbar/icon-coupon.png',title:'我的优惠券'},
{src:'/static/tabbar/icon-score.png',title:'我的积分'},
{src:'/static/tabbar/icon-address.png',title:'我的地址'},
{src:'/static/tabbar/icon-znz.png',title:'观看记录'},
{src:'/static/tabbar/icon-znz.png',title:'我的推广'},
{src:'/static/tabbar/icon-znz.png',title:'我的分享'},
], //
userInfo:{}, //
}
@ -100,10 +102,12 @@
'/pagesA/my-coupon/my-coupon',
'/pagesA/my-integral/my-integral',
'/pagesA/my-address/my-address',
'/pagesA/my-watch/my-watch',
'',
'',
]
if(index==7){
list[7] = ['/pagesA/my-extend/my-extend','/pagesB/second-level/second-level?level=1','/pagesB/second-level/second-level?level=2' ][this.userInfo.position]
if(index==8){
list[8] = ['/pagesA/my-extend/my-extend','/pagesB/second-level/second-level?level=1','/pagesB/second-level/second-level?level=2' ][this.userInfo.position]
}
uni.navigateTo({
url:list[index]

View File

@ -80,7 +80,9 @@
data() {
return {
newtop:uni.getSystemInfoSync().statusBarHeight + 40,
bannerList:[],//
bannerList:[
],//
current:0,
dataList:[],//
classId:'',//id
@ -136,6 +138,7 @@
if(res.data.length){
res.data.forEach(item=>{
let obj = {
type:item.type,
imgSrc:item.src,
url:item.url,
isVideo:false,

View File

@ -12,7 +12,7 @@
</view>
<view class="disjbac width100">
<view class="fon24">{{item.price}}</view>
<view @tap="$toolAll.tools.goPage(`/pagesB/course-detail/course-detail?id=${item.spu_id}`)" class="disjcac fon22 radius26" style="width: 144rpx;height: 52rpx;color: #f37717;border: 2rpx solid #f37717;">点击学习</view>
<view @tap="$toolAll.tools.goPage(`/pagesB/course-list/course-list?id=${item.spu_id}`)" class="disjcac fon22 radius26" style="width: 144rpx;height: 52rpx;color: #f37717;border: 2rpx solid #f37717;">点击学习</view>
</view>
</view>
</view>

View File

@ -1,7 +1,16 @@
<template>
<view>
<status-container titlet="我的推广" returnc="#FFFFFF">
<!-- 我的推广 -->
<view slot="content" style="margin-top: -20rpx;" v-if="loading">
<!-- <view class="extend-list">
<view class="text curr">我的推广</view>
<view class="text" @tap="share()"></view>
</view> -->
<view class="bacf pad-zy20 boxshow2 posi-sticky" :style="{top:newtop+'px'}">
<view class="disjcac pad-sx30 bbot">
<view v-if="personCode" class="">
@ -122,11 +131,36 @@
}
})
}
},
share() {
uni.navigateTo({
url:`/pagesA/my-share/my-share`
})
}
}
}
</script>
<style>
.extend-list {
margin: 30rpx 0;
background-color: #fff;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
}
.extend-list .text {
line-height: 70rpx;
font-size: 30rpx;
color: #333;
margin: 0 40rpx;
text-align: center;
border-bottom: 3px solid transparent;
}
.extend-list .text.curr {
font-weight: bold;
border-bottom: 3px solid #e42417;
}
</style>

View File

@ -0,0 +1,92 @@
<template>
<view>
<status-container titlet="我的分享" returnc="#FFFFFF"></status-container>
<!-- 分享图 -->
<image :src="shareImg" mode="widthFix" lazy-load></image>
<!-- 底部按钮 -->
<view class="bottom-btn">
<view @tap="downloadImgEv"></view>
</view>
</view>
</template>
<script>
import pitera from '@/components/nothing/pitera.vue';
import yzQr from '@/components/yz-qr/yz-qr.vue';
import {base64ToPath} from '@/jsFile/base64-src.js';
export default {
components:{
pitera,
yzQr
},
data() {
return {
shareImg:'',
}
},
onLoad() {
uni.showToast({
title:'正在生成推广码',
icon:'loading',
duration:10000
})
// 广
createPoster({introducer:wx.getStorageSync('introducer')}).then(res=>{
this.shareImg = res.data.path;
uni.hideLoading();
}).catch(err=>{
uni.hideLoading();
uni.showToast({
title:'生成失败',
icon:'none',
position:'bottom'
})
setTimeout(()=>{
uni.navigateBack({delta:1})
},1000)
})
},
methods: {
//
downloadImgEv(){
uni.downloadFile({
url: this.shareImg,
success: (res) => {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: ()=> {
console.log('save success');
},
fail: () => {
uni.showToast({title:'保存失败',icon:'error'})
}
});
}
})
}
}
}
</script>
<style>
image {
width: 100%;
}
.bottom-btn {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 20rpx;
display: flex;
justify-content: flex-end;
box-shadow: 0rpx -3rpx 20rpx rgba(0,0,0,.05);
}
.bottom-btn view {
background-color: #eb5d10;
color: #FFFFFF;
padding: 20rpx 40rpx;
border-radius: 80rpx;
font-size: 36rpx;
}
</style>

View File

@ -0,0 +1,91 @@
<template>
<view>
<status-container titlet="观影记录" returnc="#FFFFFF">
<view slot="content" style="margin-top: -20rpx;">
<view class="pad-zy30 bacf pad-x30" v-if="total">
<view class="pad-sx30 disac fon24 bbot" v-for="(item,index) in dataList" :key="index">
<image class="flexs" :src="item.cover" mode="aspectFill" style="width: 228rpx;height: 160rpx;"></image>
<view class="disjbac fc width100 mar-z20" style="height: 160rpx;">
<view class="fon26 col26 width100">
<view class="clips2">{{item.name}}</view>
<view class="fon20 mar-s10" style="color: #7f7f7f;">{{item.created_at}}</view>
</view>
<view class="disjbac width100">
<view class="fon24">{{item.price}}</view>
<view @tap="$toolAll.tools.goPage(`/pagesB/course-detail/course-detail?id=${item.spu_id}`)" class="disjcac fon22 radius26" style="width: 144rpx;height: 52rpx;color: #f37717;border: 2rpx solid #f37717;">点击学习</view>
</view>
</view>
</view>
</view>
<view class="" v-if="loading">
<pitera :textStr="`${noMore && total > dataList.length?'上滑加载更多':'到底了'}~~`" textColor="#b0aaa9" paddingStr="40rpx 0 20rpx 0"></pitera>
</view>
</view>
</status-container>
</view>
</template>
<script>
import swiperTab from '@/components/swiper-tab/swiper-tab.vue';
import pitera from '@/components/nothing/pitera.vue';
export default {
components:{
swiperTab,
pitera
},
data() {
return {
dataList:[],
page:1,
size:20,
total:0,
noMore:false,
loading:false
}
},
onLoad() {
//
this.getCouresList();
},
onReachBottom() {
if(this.total!=this.dataList.length){
this.page++;
this.getCouresList();
}
},
methods: {
//
getCouresList(){
this.loading = false;
let params = {
page:this.page,
size:this.size
}
this.$requst.get('/api/course/course-browse-records',params).then(res=>{
this.total = res.data.total;
if(this.page==1){this.dataList=[];}
this.dataList = [...this.dataList,...res.data.list];
if(this.total==this.dataList.length && this.page!=1){
this.noMore = true;
}
this.loading = true;
})
},
}
}
</script>
<style>
.used-item{
border-top: 2rpx solid ;
}
.noshow{
transform: rotate(-90deg);
transition: all .3s linear;
}
.isshow{
transform: rotate(90deg);
transition: all .3s linear;
}
</style>

View File

@ -0,0 +1,113 @@
<template>
<view>
<status-container titlet="课程列表" returnc="#FFFFFF">
<view slot="content" style="margin-top: -20rpx;">
<view class="pad-zy30 bacf pad-x30" v-if="total">
<view class="pad-sx30 disac fon24 bbot" v-for="(item,index) in dataList" :key="index">
<image class="flexs" :src="hostapi + item.cover" mode="aspectFill" style="width: 228rpx;height: 160rpx;"></image>
<view class="disjbac fc width100 mar-z20" style="height: 160rpx;">
<view class="fon26 col26 width100">
<view class="clips2">{{item.title}}</view>
<view class="fon20 mar-s10" style="color: #7f7f7f;">{{item.summary}}</view>
</view>
<view class="disjbac width100" style="justify-content: flex-end;">
<view @tap="getVideoInfo(item.id)" class="disjcac fon22 radius26" style="width: 144rpx;height: 52rpx;color: #f37717;border: 2rpx solid #f37717;">点击查看</view>
</view>
</view>
</view>
</view>
<view class="" v-if="loading">
<pitera :textStr="`${noMore && total > dataList.length?'上滑加载更多':'到底了'}~~`" textColor="#b0aaa9" paddingStr="40rpx 0 20rpx 0"></pitera>
</view>
</view>
</status-container>
</view>
</template>
<script>
import swiperTab from '@/components/swiper-tab/swiper-tab.vue';
import pitera from '@/components/nothing/pitera.vue';
export default {
components:{
swiperTab,
pitera
},
data() {
return {
dataList:[],
course_id:'',
hostapi:'',
page:1,
size:20,
total:0,
noMore:false,
loading:false
}
},
onLoad(e) {
this.course_id = e.id;
this.hostapi = getApp().globalData.hostapi;
//
this.getCouresList();
},
onReachBottom() {
if(this.total!=this.dataList.length){
this.page++;
this.getCouresList();
}
},
methods: {
//
getCouresList(){
this.loading = false;
let params = {
page:this.page,
size:this.size,
course_id:this.course_id,
}
this.$requst.get('/api/course/get-course-video',params).then(res=>{
this.total = res.data.list;
if(this.page==1){this.dataList=[];}
this.dataList = [...this.dataList,...res.data.list];
if(this.total==this.dataList.length && this.page!=1){
this.noMore = true;
}
this.loading = true;
})
},
getVideoInfo(id) {
this.$requst.get('/api/course/get-course-video-info',{course_video_id:id}).then(res=>{
console.log(res.code,'课程视频')
if(res.code == 0) {
uni.navigateTo({
url:`/pagesB/course-video/course-video?id=${id}`
})
}else {
uni.showToast({
title: res.msg,//
icon: 'error',//
})
}
})
}
}
}
</script>
<style>
.used-item{
border-top: 2rpx solid ;
}
.noshow{
transform: rotate(-90deg);
transition: all .3s linear;
}
.isshow{
transform: rotate(90deg);
transition: all .3s linear;
}
</style>

View File

@ -0,0 +1,172 @@
<template>
<view>
<status-container titlet="课程详情" returnc="#FFFFFF">
<view v-if="isLoading" slot="content" style="margin-top: -20rpx;">
<view class="bacf">
<view class="fon32 tcenter pad-s50">{{couresDetail.title}}</view>
<view class="pad30 posir disjcac">
<image :src="hostapi + couresDetail.cover" style="height: 388rpx;" mode="aspectFill" class="width100" lazy-load></image>
<image v-if="couresDetail.video.includes('.mp4')" @tap="playVideo" class="posia" src="/static/tabbar/icon-play.png" mode="" style="width: 70rpx;height: 70rpx;" lazy-load></image>
</view>
<view class="mar-zy30 bbot pad-x10">
<span class="fon28 bold posir pad-x10">
<text>课程介绍</text>
<view class="posia-xzy" style="height: 6rpx;background-color: #e42417;bottom: -2rpx;"></view>
</span>
</view>
<view class="mar-zy30 pad-sx20 bbot">
<view class="disjbac ae pad-x20" style="color: #262626;display: block;">
<view class="fon24">介绍{{couresDetail.summary}}</view>
<view class="fon20 pad-s20">{{couresDetail.create_time.slice(0,10).split('-').join('.')}}</view>
</view>
<view class="rich-text fon24" style="line-height: 1.8;">
<rich-text :nodes="couresDetail.content" style="color: #5a5a5a;"></rich-text>
</view>
</view>
</view>
<!-- <view class="pad-zy20">
<view class="disjb ae mar-s40">
<view class="fon32 bold colb">推荐课程</view>
<view class="fon20" style="color: #bbb4b3;" @tap="$toolAll.tools.goPage('/pages/tabbar/course/course')">+</view>
</view>
<list ref="refcourse" @goDetail="goDetail"></list>
</view> -->
<!-- 登录弹框 start -->
<view class="posAll disjc" v-if="ifLogin">
<view class="bacf radius10 posir disjcac fc pad-zy60" style="height: 256rpx;margin-top: 304rpx;">
<image src="/static/tabbar/icon-password.png" mode="" lazy-load style="width: 86rpx;height: 102rpx;"></image>
<view class="fon28 mar-s20">请登录后查看课程<span style="color:#e42417;" @tap="goLogin"></span></view>
<view class="posia-sy20" @tap="ifLogin=false"><i class="icon icon-del-white fon24" style="color: #9d9d9d;"></i></view>
</view>
</view>
<!-- 登录弹框 end -->
</view>
</status-container>
</view>
</template>
<script>
//
import footTab from '@/components/foot-tabs/foot-tab.vue';
import list from '@/components/list.vue';
export default {
components:{'foot-tab' :footTab,list},
data() {
return {
richText:'', //
ifLogin:false, //
isLoading:false, //
couresRecommend:[], //
couresDetail:'',//
classId:'', //id
course_video_id:'', //id
page:1, //
size:1000, //
duration:0,//
hostapi:'',//
}
},
onLoad(op) {
if(op.id){
if(op.invite_code) {
//
this.$store.commit('setFristIn',true);
uni.setStorageSync('invite_code',op.invite_code);
} else {
this.$store.commit('setFristIn',false);
}
this.hostapi = getApp().globalData.hostapi;
this.course_video_id = op.id;
//
this.getCouresDetail(this.course_video_id);
}
},
onShareAppMessage(res) {
var shareObj = {
     title: ``, // (slogan)
     path: `/pagesB/course-detail/course-detail?id=${this.id}&category_id=${this.classId}&invite_code=${uni.getStorageSync('invite_code')}`, // /
     imageUrl: ``//PNGJPG imageUrl 使 5:4
  };
  return shareObj;
},
onShow() {
uni.removeStorageSync('courseInfo');
uni.removeStorageSync('skuList');
},
methods: {
//
getCouresDetail(course_video_id){
uni.showLoading({
title:'加载中'
});
this.$requst.get('/api/course/get-course-video-info',{course_video_id:course_video_id}).then(res=>{
console.log(res,'课程视频')
if(res.code == 0) {
this.couresDetail = res.data;
}
uni.hideLoading();
this.isLoading = true;
})
},
//
getCouresRecommend(){
let params = {
page:this.page,
size:this.size,
category_id:this.classId,
id:this.id
}
this.$requst.get('/api/spu/course-recommend',params).then(res=>{
if(res.code==0) {
this.$refs.refcourse.list = res.data.list;
}
})
},
//
goDetail(id){
uni.navigateTo({
url:`/pagesB/course-detail/course-detail?id=${id}&category_id=${this.classId}`
})
},
//
playVideo(){
if(this.couresDetail.type=="video_number"){
// #ifdef MP-WEIXIN
wx.openChannelsActivity({
finderUserName:this.couresDetail.video_number,
feedId:this.couresDetail.video_id,
success:(res)=>{},fail:()=>{
// this.$toolAll.tools.showToast('')
}
})
// #endif
} else {
if(uni.getStorageSync('is_active')){
let newArr = [];
let videoSrc = this.hostapi + this.couresDetail.video;
newArr.push({
src:videoSrc,
course_video_id:this.course_video_id,
})
uni.setStorageSync('videoList',newArr);
uni.navigateTo({
url:`/pagesB/play-video/play-video?current=${0}`
})
} else {
this.ifLogin = true;
}
}
},
//
goLogin(){
uni.navigateTo({
url:`/pages/login/login`
})
}
}
}
</script>
<style></style>

View File

@ -7,7 +7,7 @@
<video :id="`video${index}`" :ref="`refvideo_${index}`" style="width: 100%;" :style="{height:newHeight+'px'}" :autoplay="item.autoplay"
:src="item.src" :enable-play-gesture="dans"
:controls="item.isControls" :show-center-play-btn="isCenterImg" :show-play-btn="isBottomImg" :show-fullscreen-btn="isFull"
@play="comePlay(index)" @pause="comePause(index)"></video>
@play="comePlay(index)" @pause="comePause(index)" @timeupdate='timeupdate'></video>
<!-- 封面图 -->
<image v-if="item.isPlayImg" @tap.stop="playEv(index)" src="/static/tabbar/icon-play.png" style="position: fixed;top: 50%;left: 50%;
width: 126rpx;height: 126rpx;transform: translate(-50%, -50%);" mode="aspectFill"></image>
@ -33,7 +33,8 @@
isCenterImg:false,//是否显示视频中间的播放按钮
isBottomImg:true,//是否显示视频底部控制栏的播放按钮
isFull:true,//是否显示全屏按钮
count:0
count:0,
currentTime:'' //记录观看时长
}
},
onReady: (res)=> {
@ -56,6 +57,21 @@
},
onHide() {
uni.removeStorageSync('videoList');
},
onUnload() {
console.log('页面销毁了')
let course_video_id = this.videoList[this.currentIndex].course_video_id;
let params = {
course_video_id:course_video_id,
duration:this.currentTime,
}
this.$requst.get('/api/course/create-browse-records',params).then(res=>{
if(res.code == 0) {
console.log('观影记录提交成功',this.currentTime)
}
})
},
methods:{
// 视频滑动结束
@ -113,6 +129,10 @@
comePause(index){
this.videoList[index].isPlayImg = true;
this.videoList[index].isControls = false;
},
//记录观看时长
timeupdate(e) {
this.currentTime = Number(e.detail.currentTime);
}
}
}