3 Commits

Author SHA1 Message Date
e9d6f514bd feat: 集成edu-core视频组件并更新版本至2.0.38
- 添加edu-core依赖以使用标准化的课程视频组件
- 将本地common-video组件替换为edu-core的CommonCourseVideo
- 重构章节详情页,移除原有的视频播放逻辑和倒计时功能
- 修复medicaldes页面样式问题,确保布局正确
- 在课程详情页传递课程封面图给视频组件
- 更新应用版本号至2.0.38
2026-02-10 12:34:15 +08:00
5a4f96c195 fix(miniClass): 修复班级信息页学员人数显示错误
修复当 students 或 thisClass.number 为 undefined 时,学员人数显示为 "undefined/undefined人" 的问题。
将获取学员列表和成绩列表的默认值从 undefined 改为空数组,避免后续操作中可能出现的类型错误。
2026-02-09 10:25:17 +08:00
961ca781e8 refactor(video): 移除静态广告组件并添加视频快进快退功能
- 删除未使用的静态广告组件及相关文件(MyComponent.vue、staticadcomponent/、videoDetail.vue等)
- 在视频播放器中添加自定义快进(+15秒)和快退(-15秒)按钮组件
- 移除未使用的iOS视频组件注册
- 优化播放器控制栏布局和样式
2026-02-09 10:22:53 +08:00
18 changed files with 7609 additions and 2248 deletions

10
main.js
View File

@@ -88,8 +88,10 @@ import commonList from '@/pages/component/commonComponents/list.vue'
Vue.component('common-list', commonList); Vue.component('common-list', commonList);
import commonOrderSubmit from '@/pages/component/commonComponents/orderSubmit.vue' import commonOrderSubmit from '@/pages/component/commonComponents/orderSubmit.vue'
Vue.component('common-order-submit', commonOrderSubmit); Vue.component('common-order-submit', commonOrderSubmit);
import commonVideo from '@/pages/component/commonComponents/video/index.vue'
Vue.component('common-video', commonVideo); import CommonCourseVideo from 'edu-core/components/course-video'
Vue.component('CommonCourseVideo', CommonCourseVideo);
import commonCoupon from '@/pages/component/commonComponents/coupon/index.vue' import commonCoupon from '@/pages/component/commonComponents/coupon/index.vue'
Vue.component('common-coupon', commonCoupon); Vue.component('common-coupon', commonCoupon);
import commonGoodsList from '@/pages/component/commonComponents/goodsList.vue' import commonGoodsList from '@/pages/component/commonComponents/goodsList.vue'
@@ -114,8 +116,8 @@ import commonSelectVip from '@/pages/component/commonComponents/selectVip.vue'
Vue.component('common-select-vip', commonSelectVip); Vue.component('common-select-vip', commonSelectVip);
import commonAdvertisement from '@/pages/component/commonComponents/advertisement.vue' import commonAdvertisement from '@/pages/component/commonComponents/advertisement.vue'
Vue.component('common-advertisement', commonAdvertisement); Vue.component('common-advertisement', commonAdvertisement);
import commonVideoIos from '@/pages/component/commonComponents/video/ios.nvue' // import commonVideoIos from '@/pages/component/commonComponents/video/ios.nvue'
Vue.component('common-video-ios', commonVideoIos); // Vue.component('common-video-ios', commonVideoIos);
// import musicPlay from '@/components/music.vue' // import musicPlay from '@/components/music.vue'
// Vue.component('music-play', musicPlay); // Vue.component('music-play', musicPlay);

View File

@@ -12,8 +12,8 @@
"src" : "图片路径" "src" : "图片路径"
} }
], ],
"versionName" : "2.0.37", "versionName" : "2.0.38",
"versionCode" : 2037, "versionCode" : 2038,
"sassImplementationName" : "node-sass", "sassImplementationName" : "node-sass",
"app-plus" : { "app-plus" : {
"nvueCompiler" : "uni-app", "nvueCompiler" : "uni-app",

7487
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,6 +7,7 @@
"dependencies": { "dependencies": {
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"e-peanut": "file:", "e-peanut": "file:",
"edu-core": "git+https://git.nuttyreading.com/chenghuan/edu-core.git#v1.0.3",
"element-plus": "^2.9.6", "element-plus": "^2.9.6",
"epubjs": "^0.3.93", "epubjs": "^0.3.93",
"jquery": "^2.2.4", "jquery": "^2.2.4",

View File

@@ -1,44 +0,0 @@
<template>
<div>{{ message }}</div>
</template>
<script>
import $ from "jquery";
export default class MyComponent {
// data() {
// return {
// message: 'Hello, Vue!'
// }
// }
constructor(adAddress, toAddress) {
this.adAddress = adAddress;
this.toAddress = toAddress;
this.$html = $(html);
}
createEl(el) {
this.$html.find(".ad").attr("src", this.adAddress);
this.$html.attr("href", this.toAddress);
let $adWrapper = this.$html.find(".ad-wrapper");
$adWrapper.attr("href", this.toAddress);
$adWrapper.click(() => {
Aliplayer.util.stopPropagation();
});
this.$html.find(".close").click(() => {
this.$html.hide();
});
$(el).append(this.$html);
}
ready(player, e) {}
play(player, e) {
this.$html.hide();
}
pause(player, e) {
this.$html.show();
}
}
</script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -25,7 +25,8 @@
:change:isSetFirstTime="renderScript.receiveisSetFirstTime" :change:isSetFirstTime="renderScript.receiveisSetFirstTime"
:change:isfresh="renderScript.receiveIsfresh" :change:platform="renderScript.receiveplatform" :change:isfresh="renderScript.receiveIsfresh" :change:platform="renderScript.receiveplatform"
:change:isChange="renderScript.receiveIsChange" :change:isChange="renderScript.receiveIsChange"
:change:currentVideoList="renderScript.receiveVideoList"></div> :change:currentVideoList="renderScript.receiveVideoList">
</div>
<div @tap="renderScript.emitData" ref="videoContent1" v-show="false" class="videoContent1"> <div @tap="renderScript.emitData" ref="videoContent1" v-show="false" class="videoContent1">
直接调用renderjs中的emitData的方法,传递当前播放时长 直接调用renderjs中的emitData的方法,传递当前播放时长
</div> </div>
@@ -470,6 +471,9 @@
var diff = 0 var diff = 0
var pauseTime = 0 var pauseTime = 0
var myplayer = undefined var myplayer = undefined
var seekBtnHideTimer = null
var seekBtnEls = []
var seekBtnsEnabled = true
import $ from 'jquery' import $ from 'jquery'
export default { export default {
components: { components: {
@@ -634,6 +638,113 @@
}, },
}); });
var backBtnComponent = Aliplayer.Component({
init: function(status, toAddress) {
this.fullScreenStatus = status
this.$html = $('#url-player-test');
},
createEl: function(el) {
seekBtnsEnabled = true;
var container = $('#url-player-test');
container.find('.custom-seek-back').remove();
container.find('.custom-seek-forward').remove();
seekBtnEls = [];
function createSeekBtn(className, label, position) {
var btn = document.createElement('button');
btn.className = 'custom-seek-btn ' + className;
btn.innerText = label;
btn.style.position = 'absolute';
btn.style.top = '50%';
btn.style.transform = 'translateY(-50%)';
btn.style.width = '48px';
btn.style.height = '48px';
btn.style.borderRadius = '50%';
btn.style.border = 'none';
btn.style.background = 'rgba(255,255,255,0.6)';
btn.style.color = '#000';
btn.style.fontSize = '14px';
btn.style.display = 'flex';
btn.style.alignItems = 'center';
btn.style.justifyContent = 'center';
btn.style.padding = '0';
btn.style.display = 'none';
btn.style.zIndex = '10';
if (position === 'left') {
btn.style.left = '30px';
} else if (position === 'right') {
btn.style.right = '30px';
}
return btn;
}
var backBtn = createSeekBtn('custom-seek-back', '-15s', 'left');
var forwardBtn = createSeekBtn('custom-seek-forward', '+15s', 'right');
seekBtnEls = [backBtn, forwardBtn];
var showSeekBtns = function() {
if (!seekBtnsEnabled) return;
if (!seekBtnEls || !seekBtnEls.length) return;
seekBtnEls.forEach(function(btn) {
btn.style.display = 'flex';
});
if (seekBtnHideTimer) {
clearTimeout(seekBtnHideTimer);
}
seekBtnHideTimer = setTimeout(function() {
if (!seekBtnEls || !seekBtnEls.length) return;
seekBtnEls.forEach(function(btn) {
btn.style.display = 'none';
});
}, 3000);
};
backBtn.onclick = function(e) {
if (e && e.stopPropagation) {
e.stopPropagation();
}
showSeekBtns();
if (myplayer && myplayer.getCurrentTime) {
var current = myplayer.getCurrentTime();
var target = current - 15;
if (target < 0) {
target = 0;
}
myplayer.seek(target);
}
};
forwardBtn.onclick = function(e) {
if (e && e.stopPropagation) {
e.stopPropagation();
}
showSeekBtns();
if (myplayer && myplayer.getCurrentTime && myplayer.getDuration) {
var current = myplayer.getCurrentTime();
var duration = myplayer.getDuration();
var target = current + 15;
if (target > duration) {
target = duration;
}
myplayer.seek(target);
}
};
var containerDom = document.getElementById('url-player-test');
if (containerDom) {
containerDom.addEventListener('click', function() {
showSeekBtns();
});
}
container.append(backBtn);
container.append(forwardBtn);
},
playing: function(player, e) {},
});
// console.log('这是查看是否获取到hlstoken', this.videoData) // console.log('这是查看是否获取到hlstoken', this.videoData)
var playerOptions = { var playerOptions = {
id: "url-player-test", id: "url-player-test",
@@ -648,11 +759,12 @@
"controlBarVisibility": "hover", "controlBarVisibility": "hover",
"useH5Prism": true, "useH5Prism": true,
components: [{ components: [{
name: 'adComponent', name: 'fullScreenComponent',
type: fullScreenButtonComponent, type: fullScreenButtonComponent
args: [ },
'http://101.201.146.165:8088/Pf-EH/statics/uploadFile/2024-05-10/b0f420c7-9178-41ad-9dd6-f59a64a6e190.png' {
] name: 'backBtnComponent',
type: backBtnComponent
}, },
{ {
name: 'RateComponent', name: 'RateComponent',
@@ -663,9 +775,7 @@
skinLayout: [{ skinLayout: [{
name: "bigPlayButton", name: "bigPlayButton",
align: "blabs", align: "cc",
x: 30,
y: 80
}, },
{ {
name: "H5Loading", name: "H5Loading",
@@ -689,6 +799,12 @@
{ {
name: "thumbnail" name: "thumbnail"
}, },
{
name: "backBtnComponent",
align: "blabs",
x: 15,
y:70
},
{ {
name: "controlBar", name: "controlBar",
align: "blabs", align: "blabs",
@@ -781,6 +897,12 @@
console.log('开始播放------',videoDurationTimes,pauseTime); console.log('开始播放------',videoDurationTimes,pauseTime);
$('.videoContent7').click() $('.videoContent7').click()
seekBtnsEnabled = true;
if (seekBtnHideTimer) {
clearTimeout(seekBtnHideTimer);
seekBtnHideTimer = null;
}
if (pauseTime > 0) { if (pauseTime > 0) {
if(pauseTime==videoDurationTimes){ if(pauseTime==videoDurationTimes){
return return
@@ -830,11 +952,48 @@
console.log('播放完毕'); console.log('播放完毕');
$('.videoContent2').click() $('.videoContent2').click()
$('.videoContent6').click() $('.videoContent6').click()
seekBtnsEnabled = false;
if (seekBtnHideTimer) {
clearTimeout(seekBtnHideTimer);
seekBtnHideTimer = null;
}
if (seekBtnEls && seekBtnEls.length) {
seekBtnEls.forEach(function(btn) {
btn.style.display = 'none';
});
}
var $bigBtn = $('#url-player-test .prism-big-play-btn');
if ($bigBtn && $bigBtn.length) {
$bigBtn.css({
left: '30px',
bottom: '80px',
right: 'auto',
top: 'auto',
transform: 'none'
});
}
}) })
player.on('pause', function() { player.on('pause', function() {
pauseTime = parseInt(player.getCurrentTime()) pauseTime = parseInt(player.getCurrentTime())
player.pause(true) player.pause(true)
console.log('触发暂停', pauseTime) console.log('触发暂停', pauseTime)
if (player.getStatus && player.getStatus() === 'ended') {
return;
}
var $bigBtn = $('#url-player-test .prism-big-play-btn');
if ($bigBtn && $bigBtn.length) {
$bigBtn.css({
left: '50%',
top: '50%',
right: 'auto',
bottom: 'auto',
transform: 'translate(-50%, -50%)'
});
}
}) })
myplayer.on('error', function() { myplayer.on('error', function() {
@@ -1182,4 +1341,26 @@
bottom: 0; bottom: 0;
right: 0; right: 0;
} }
#url-player-test {
position: relative;
}
#url-player-test .custom-seek-btn {
width: 48px;
height: 48px;
border-radius: 50%;
border: none;
background: rgba(0, 0, 0, 0.5);
color: #fff;
font-size: 14px;
outline: none;
cursor: pointer;
pointer-events: auto;
position: absolute;
top: 50%;
left: 30px;
}
#url-player-test .custom-seek-btn:active {
background: rgba(255, 255, 255, 0.25);
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +0,0 @@
.ad-container
{
display:none;
position:absolute;
left:50%;
top:50%;
margin-left:-150px;
margin-top:-100px;
}
.ad-container span
{
width: 27px;
height: 16px;
border-radius: 1px;
background-color: rgba(0,0,0,.5);
position: absolute;
font-size: 10px;
color: #fff;
line-height: 16px;
text-align: center;
top:0px;
left:0px;
}
.ad-container .close
{
position:absolute;
top:2px;
right:2px;
width: 20px;
height: 20px;
}
.ad-container .close:hover
{
cursor:pointer;
}
.ad-container .ad
{
width:300px;
height:200px;
}

View File

@@ -1,76 +0,0 @@
import $ from 'jquery'
// const html = require('./index.html');
// require('https://g.alicdn.com/apsara-media-box/imp-web-player/2.20.3/skins/default/aliplayer-min.css');
// require('../aliplayer-min.js');
// require('../aliplayercomponents.min.js');
// require('../aliplayer-min.css');
require('./index.css');
/**
* 静态广告组件
*/
const fullScreenButtonComponent = Aliplayer.Component({
/**
* 初始函数在new对象时调用
*
* @param {string} adAddress - 广告视频地址
* @param {string} toAddress - 广告链接地址
*/
init: function (adAddress, toAddress) {
this.adAddress = adAddress;
this.toAddress = toAddress;
this.$html = $('.ad-container');
},
/**
* 创建广告Dom元素
*/
createEl: function (el) {
this.$html.find('.ad').attr('src', this.adAddress);
var $adWrapper = this.$html.find('.ad-wrapper');
$adWrapper.attr('href', this.toAddress);
$adWrapper.click(function () {
Aliplayer.util.stopPropagation();
});
this.$html.find('.close').click(function () {
this.$html.hide();
});
$(el).append(this.$html);
},
ready: function (player, e) {
},
/**
* 隐藏广告
*/
play: function (player, e) {
this.$html.hide();
},
/**
* 显示广告
*/
pause: function (player, e) {
this.$html.show();
},
/**
* 隐藏广告
*/
playing: function (player, e) {
this.$html.hide();
},
waiting: function (player, e) {
},
timeupdate: function (player, e) {
},
error: function (player, e) {
},
/**
* 显示广告
*/
ended: function (player, e) {
this.$html.show();
}
});
export default fullScreenButtonComponent;

View File

@@ -1,375 +0,0 @@
<template>
<view class="container commonPageBox commonDetailPage" style="position: relative;">
<!-- <cover-view class="image_box">
<image
src="http://101.201.146.165:8088/curriculum/detailImg/curriculum_20170411123240222.png"
mode="aspectFit"
class="headImage"
style="background-color: #f5f5f5"
>
</image>
</cover-view> -->
<video
@fullscreenchange="fullscreenchange"
@timeupdate="videoTimeUpdateEvent($event)"
ref="videos"
style="width: 100%; height: 100%"
autoplay
id="videoId"
object-fit="contain"
class="video-box"
:src="videoUrl"
:poster="`${videoUrl}?x-oss-process=video/snapshot,t_${1},f_jpg`"
@play="playVideo"
>
<!-- <cover-image class="controls-play img" src="http://101.201.146.165:8088/curriculum/detailImg/curriculum_20170411123240222.png"></cover-image>
-->
</video>
</view>
</template>
<script>
import courseDescription from "@/pages/component/commonComponents/list";
import price from "../price/index.vue";
import $http from "@/config/requestConfig.js";
import { mapState } from "vuex";
export default {
components: {
courseDescription, //课程说明
price, //课程价格
},
data() {
return {
timer: null,
videoUrl: "",
currentTime: 0,
firstTime: 0,
options: {},
videoData: {},
isSetFirstTime: false,
currentVideoTime: "", //初始播放时长(秒)
urlList: {
detail: "sociology/course/getCourseCatalogueChapterDetail",
curriculumInfo: "app/phone.do?getCourseInfo",
},
};
},
async onUnload() {
this.timer = null;
// #ifdef APP-PLUS
uni.navigateTo({
url: "/pages/curriculum/order/curriculum/back",
});
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
// plus.screen.lockOrientation("portrait-primary");
// #endif
await this.setVideoTime();
// #ifdef APP-PLUS
// plus.screen.lockOrientation("portrait-primary");
// #endif
},
onLoad(options) {
// uni.navigateTo({
// url: "/pages/curriculum/order/curriculum/back",
// });
// #ifdef APP-PLUS
plus.screen.lockOrientation("landscape-primary");
// plus.screen.lockOrientation("portrait-primary");
// #endif
this.options = JSON.parse(options.data);
this.getLive();
this.timer = setInterval(() => {
var that = this;
if (this.currentTime) {
that.setVideoTime();
}
}, 60000 * 10);
},
onHide() {
// this.showSearchList = false
// this.searchList = []
},
computed: {
...mapState(["userInfo"]),
},
methods: {
// 播放进度改变
videoTimeUpdateEvent(e) {
console.log("e at line 78:", e);
this.playTime = parseInt(e.detail.currentTime);
this.allTime = parseInt(e.detail.duration);
console.log("视频播放时长", this.playTime, "视频总时长", this.allTime);
this.recordTime({
time: this.playTime,
});
},
recordTime(data) {
this.currentTime = data.time;
console.log("data at line 54:", data);
var list = [];
if (uni.getStorageSync("videoList")) {
list = JSON.parse(uni.getStorageSync("videoList"));
}
console.log("点击后设置播放时长的方法list at line 65:", list);
var index = list.findIndex((e) => e.id == this.videoData.id);
if (list.length > 0 && index >= 0) {
list[index] = {
...this.videoData,
time: data.time,
};
} else {
list.push({
...this.videoData,
time: data.time,
});
}
uni.setStorageSync("videoList", JSON.stringify(list));
console.log(list, "走接口的方法参数");
},
//是否全屏
fullscreenchange(e) {
if (!e.target.fullScreen) {
uni.navigateBack({
delta: 1,
});
// plus.screen.lockOrientation("default");
}
},
getData(data) {
console.log(
"data at line 这是接口拿回来的时长11111111111111111111:",
this.videoData.userCourseVideoPositionEntity.position
);
if (!this.isSetFirstTime) {
var netWork = this.videoData.userCourseVideoPositionEntity
? this.videoData.userCourseVideoPositionEntity.position
: 0;
var list = [];
if (uni.getStorageSync("videoList")) {
list = JSON.parse(uni.getStorageSync("videoList"));
}
console.log("这是获取接口 设置的起始时长", netWork);
var index = list.findIndex((e) => e.id == this.videoData.id);
if (netWork) {
if (index >= 0) {
this.firstTime =
list[index].time > netWork ? list[index].time : netWork;
} else {
this.firstTime = netWork ? netWork : 0;
}
} else {
if (index >= 0) {
this.firstTime = list[index].time ? list[index].time : 0;
} else {
this.firstTime = 0;
}
}
uni.setStorageSync("videoList", JSON.stringify(list));
console.log(
"list at line 这是设置完第一次初始值9777777777777777777770:",
list
);
console.log(this.firstTime, "1111111111111111111111");
this.playVideo();
this.isSetFirstTime = true;
}
},
setVideoTime(time) {
var data = {
videoId: this.videoData.id,
position: this.currentTime, //秒数
};
console.log("data at line =存储视频时长接口:", data);
$http
.request({
// url: "book/buyOrder/buySave",
url: `sociology/course/saveCoursePosition`,
method: "Post", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: {
//默认 无 说明:请求头
"Content-Type": "application/json",
},
})
.then((res) => {
console.log("res at line 185:", res);
// console.log("data at line 5911111:", this.videoData);
this.$forceUpdate();
});
},
playVideo(e) {
this.videoContext = uni.createVideoContext("videoId", this);
this.videoContext.seek(this.firstTime);
this.videoContext.requestFullScreen();
},
async getLive() {
var data = {
...this.options,
};
console.log("data at line 57:", data);
$http
.request({
// url: "book/buyOrder/buySave",
url: `sociology/course/checkVideo`,
method: "Post", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: {
//默认 无 说明:请求头
"Content-Type": "application/json",
},
})
.then((res) => {
console.log("res at line 252:", res);
this.videoData = res.video;
this.videoUrl =
// "https://ehh-private-01.oss-cn-beijing.aliyuncs.com/video/taiHuClass/" +
res.video.videoUrl;
this.$nextTick(async () => {
await this.getData();
});
// var playAuth = res.video.playAuth.replace(/=/g, "");
// this.videoData = {
// ...res.video,
// videoId: res.video.video,
// playAuth: playAuth,
// };
// this.playAuth = playAuth;
console.log("data at line 5911111:", this.videoData);
this.$forceUpdate();
});
},
openVideo(data) {
console.log("data at line 380:", data.type);
var mynavData = JSON.stringify(data); // 这里转换成 字符串
if (data.type == 0) {
//视频云点播
uni.navigateTo({
url: `/pages/curriculum/order/curriculum/videoDetail?data=${mynavData}`,
});
} else if (data.type == 1) {
uni.navigateTo({
url: `/pages/curriculum/order/curriculum/videoDetailOss?data=${mynavData}`,
});
}
// uni.navigateTo({
// // url: '../bookShop/commodityDetail?id=' + item.id
// url: `/pages/curriculum/order/curriculum/detail?navTitle=${v.title}&title=${v.title}&oid=${v.oid}`,
// });
},
hancleModalCancel() {
this.show = false;
},
handleClickMore(v, i, status) {
console.log("i at line 357:", i);
this.$set(this.correlationiList[i], "isOpen", status);
// [i].=!this.correlationiList[i].isOpen;
},
hancleModalConfirm() {
var data = {
values: {
customerType: "D",
token: uni.getStorageSync("token"),
customerOid: uni.getStorageSync("customerOid"),
...this.taiHuClassInfo,
},
};
// $mars.progressBegin('申请中...');
// $mars.post(customerType, 'applyRelearn', data, function (ret) {
// api.hideProgress();
// fnLoadDataGrid();
// });
},
// 检查是有权限使用搜索功能
checkDisable() {
console.log("点击了");
},
// 显示无权限弹窗
// showNoRights() {
// let that = this
// uni.showModal({
// content: "",
// confirmText: '好的',
// showCancel: false,
// success: function(res) {
// if (res.confirm) {
// // console.log('用户点击确定');
// that.clear()
// }
// }
// })
// },
// 放大图片
previewImage(url) {
console.log(url);
uni.previewImage({
urls: [url],
longPressActions: {
itemList: ["很抱歉,暂不支持保存图片到本地"],
success: function (res) {
// console.log(res,'+++++')
},
},
});
},
},
onBackPress() {
// #ifdef APP-PLUS
plus.key.hideSoftKeybord();
// #endif
},
};
</script>
<style lang="scss" scoped>
.video-box{
position: relative;
}
.image_box{
background-color: red;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
</style>

View File

@@ -5,35 +5,23 @@
<public-module></public-module> <public-module></public-module>
<template v-show="!screenLoading"> <template v-show="!screenLoading">
<z-nav-bar title="教学内容"></z-nav-bar> <z-nav-bar title="教学内容"></z-nav-bar>
<!-- <view class="contentBox curriculum_box" :style="`height:calc(100% - ${60 + statusBarHeight}px !important; --> <view
<view class="contentBox curriculum_box" :style="`height:calc(100% - ${60 + statusBarHeight}px !important; width:100%; overflow-x: hidden; ${ class="contentBox curriculum_box"
isFullScreen ? 'background:#000' : '' :style="`
}`"> height:calc(100% - ${60 + statusBarHeight}px !important;
<!-- 加密视频 --> width:100%;
<view style="background:#000; position: fixed; top: 120rpx; left: 0; width: 100%; z-index: 88;" v-if="videoArray.length>0"> overflow-x: hidden; ${isFullScreen ? 'background:#000' : ''}
<common-video @changeScreen="changeScreen" @changeScreenLoading="changeScreenLoading" `"
@hideNextVideo="hideNextVideo" @startNextVideoCountDown="startNextVideoCountDown" >
@unlockChangeVideo="unlockChangeVideo" v-if="isfresh " ref="commonVideo" <!-- 课程视频及章节信息 -->
:secondCountDown="secondCountDown"  :videoTitle="curriculumData.title" <CommonCourseVideo
:currentVideo="currentVideo" :noRecored="noRecored" :currentVideoList="videoArray"> :video-list="videoArray"
</common-video> :current-index="currentCateIndex !== null ? currentCateIndex : 0"
<view style="height: 200px" v-else></view> :course="{courseTitle:options.navTitle, chapterTitle: curriculumData.title}"
</view> :cover="options.curriculumImgUrl || ''"
<!-- <scroll-view :style="`height:calc(100% - 200px - 40rpx) ;`" scroll-y="true" class="scroll-Y" style="background-color: #fff"> --> :http="$http"
<view class="PM_font" style="padding: 20rpx; font-size: 40rpx; color: #2979ff;" :style="videoArray.length>0?'margin-top: 400rpx;':''" v-if="videoArray.length>0">视频教学 />
</view>
<view class="scroll-view-item" :style="videoArray.length==0?'margin-top: 20rpx;':''">
<view style="padding: 20rpx; font-size: 26rpx">
课程{{ options.navTitle }}
</view>
<view style="padding: 20rpx; margin-bottom: 40rpx; font-size: 26rpx">
章节{{ curriculumData.title }}
</view>
<common-curriculum-video v-if="videoArray && videoArray.length > 0" :detailInfo="curriculumData"
:currentVideo="currentVideo" :dataList="videoArray" @open="changeVideo"
:changeVideoLock="changeVideoLock">
</common-curriculum-video>
</view>
<view class="" style="border-top: 2px solid #2979ff;"> <view class="" style="border-top: 2px solid #2979ff;">
<view class="coursePart flexbox" v-if="tabList.length > 1"> <view class="coursePart flexbox" v-if="tabList.length > 1">
<view :class="['item','flex_box',curTab == index ? 'active': '' ]" <view :class="['item','flex_box',curTab == index ? 'active': '' ]"
@@ -359,6 +347,12 @@
methods: { methods: {
editorIput(e){ editorIput(e){
}, },
hideNextVideo() {
if (this.countDownTimer) {
clearInterval(this.countDownTimer)
this.countDownTimer = undefined
}
},
moveHandle() { moveHandle() {
return false; return false;
}, },
@@ -651,36 +645,6 @@
}) })
} }
}, },
unlockChangeVideo() {
this.changeVideoLock = false
},
startNextVideoCountDown() {
this.secondCountDown = 10
let that = this
if (this.countDownTimer) {
clearInterval(this.countDownTimer)
}
this.countDownTimer = setInterval(() => {
this.secondCountDown -= 1
if (this.secondCountDown == 0) {
// clearInterval(this.countDownTimer)
// console.log('倒计时结束');
that.hideNextVideo()
console.log('切换之前的播放index是', this.currentCateIndex);
// console.log('当前的播放列表',this.videoArray.length);
// if(this.currentCateIndex < this.videoArray.length-1){
this.currentCateIndex++
console.log('切换之后的播放index是', this.currentCateIndex);
that.changeVideo(this.videoArray[this.currentCateIndex])
// }
}
}, 1000)
},
hideNextVideo() {
console.log('父组件收到了取消加载-------------------');
clearInterval(this.countDownTimer)
this.countDownTimer = undefined
},
//课程详情 //课程详情
async gotoDetail(v, index) { async gotoDetail(v, index) {
@@ -713,44 +677,6 @@
this.currentCateIndex = data.index; this.currentCateIndex = data.index;
this.$forceUpdate(); this.$forceUpdate();
}, },
initVideo() {
this.changeVideoLock = true
this.screenLoading = false;
this.isfresh = false;
this.$nextTick(() => {
this.isfresh = true;
setTimeout(() => {
this.$refs.commonVideo.init({
currentVideo: this.currentVideo,
currentVideoList: this.videoArray,
});
}, 200);
});
},
changeVideo(data) {
this.changeVideoLock = true
if (this.countDownTimer) {
this.hideNextVideo()
}
console.log("点击了点击了切换视频-----:", this.countDownTimer, data, );
if (data.id != this.currentVideo.id) {
this.currentCateIndex = this.videoArray.findIndex(item => {
return item.id == data.id
})
// handleEnd
// this.$refs.commonVideo.handleEnd();
setTimeout(() => {
// this.$refs.commonVideo.changeVideo(data);
this.currentVideo = data;
this.initVideo();
this.isOpenMp3 = false;
}, 500);
}
},
hancleModalCancel() { hancleModalCancel() {
this.show = false; this.show = false;
}, },
@@ -809,6 +735,7 @@
.then(async (res) => { .then(async (res) => {
that.curriculumData = res.data.detail; that.curriculumData = res.data.detail;
that.videoArray = res.data.videos; that.videoArray = res.data.videos;
console.log('视频列表:', that.videoArray);
//判断没有视频的情况 //判断没有视频的情况
if(that.videoArray.length==0){ if(that.videoArray.length==0){
@@ -825,9 +752,7 @@
isHaveHistorySeekVideo != -1 ? isHaveHistorySeekVideo : 0; isHaveHistorySeekVideo != -1 ? isHaveHistorySeekVideo : 0;
if (that.videoArray.length > 0) { if (that.videoArray.length > 0) {
this.currentVideo = that.videoArray[that.currentCateIndex]; this.currentVideo = that.videoArray[that.currentCateIndex];
console.log('默认播放的index', that.currentCateIndex, this.currentVideo.id, that console.log('默认播放的index', that.currentCateIndex, this.currentVideo.id, that.videoArray);
.videoArray);
this.initVideo();
} }
var videoArray = []; var videoArray = [];
var videoArrayHW = []; var videoArrayHW = [];

View File

@@ -1062,12 +1062,12 @@
v.isAudition == 1 && this.userVip==null && this.librayList[this.curIndex].isBuy == 0 ? noRecored = true : '' v.isAudition == 1 && this.userVip==null && this.librayList[this.curIndex].isBuy == 0 ? noRecored = true : ''
if(this.userVip){ if(this.userVip){
uni.navigateTo({ uni.navigateTo({
url: `${_myurl}?navTitle=${this.pageTitle}&title=${v.title}&courseId=${this.courseId}&id=${v.id}&conditions=${v.conditions}&noRecored=${noRecored}`, url: `${_myurl}?navTitle=${this.pageTitle}&title=${v.title}&courseId=${this.courseId}&id=${v.id}&conditions=${v.conditions}&noRecored=${noRecored}&curriculumImgUrl=${this.course.image}`,
}); });
}else{ }else{
if(v.isAudition == 1||this.librayList[this.curIndex].isBuy == 1){ if(v.isAudition == 1||this.librayList[this.curIndex].isBuy == 1){
uni.navigateTo({ uni.navigateTo({
url: `${_myurl}?navTitle=${this.pageTitle}&title=${v.title}&courseId=${this.courseId}&id=${v.id}&conditions=${v.conditions}&noRecored=${noRecored}`, url: `${_myurl}?navTitle=${this.pageTitle}&title=${v.title}&courseId=${this.courseId}&id=${v.id}&conditions=${v.conditions}&noRecored=${noRecored}&curriculumImgUrl=${this.course.image}`,
}); });
}else{ }else{
if(this.librayList[this.curIndex].type != 0){ if(this.librayList[this.curIndex].type != 0){

View File

@@ -85,6 +85,7 @@
</view> </view>
<view :class="['titleItem']">{{item.name}}</view> <view :class="['titleItem']">{{item.name}}</view>
</view> </view>
</view> </view>
<u-divider text="暂无数据哦~" v-if="titleList.length==0"></u-divider> <u-divider text="暂无数据哦~" v-if="titleList.length==0"></u-divider>
</view> </view>
@@ -644,6 +645,7 @@
} }
.contentBox { .contentBox {
height: auto;
.oneCateList { .oneCateList {
justify-content: space-between; justify-content: space-between;
@@ -694,6 +696,10 @@
padding: 20rpx 10rpx; padding: 20rpx 10rpx;
width: 100%; width: 100%;
border-bottom: 0.5px solid #f8f9fa; border-bottom: 0.5px solid #f8f9fa;
&:last-child {
border-bottom: 0;
}
} }
.wmzhimg { .wmzhimg {
@@ -706,7 +712,7 @@
.container { .container {
padding: 10rpx; padding: 10rpx;
height: 100vh; min-height: 100vh;
background-color: #fff; background-color: #fff;
} }
@@ -763,4 +769,8 @@
.chImage { .chImage {
height: 100rpx; height: 100rpx;
} }
.android-bottom-space {
height: 120rpx;
}
</style> </style>

View File

@@ -49,7 +49,7 @@
<text class="mainTxt" v-if="classModel.type == '2'">精英班</text> <text class="mainTxt" v-if="classModel.type == '2'">精英班</text>
</view> </view>
<view><text class="ciyao">学员人数</text><text <view><text class="ciyao">学员人数</text><text
class="mainTxt">{{students.length}}/{{thisClass.number}}</text></view> class="mainTxt">{{(students || []).length}}/{{thisClass.number || 0}}</text></view>
<view><text class="ciyao">管理成员</text><text class="mainTxt" @click="seeManager">点击查看</text></view> <view><text class="ciyao">管理成员</text><text class="mainTxt" @click="seeManager">点击查看</text></view>
</view> </view>
@@ -1102,7 +1102,7 @@
}, },
// 未开班和进行中状态下,学员的信息,带买课标识 // 未开班和进行中状态下,学员的信息,带买课标识
async getStudentsList() { async getStudentsList() {
var list = undefined var list = []
await $http.request({ await $http.request({
url: "common/class/getClassUserCourseFlag", url: "common/class/getClassUserCourseFlag",
method: "POST", method: "POST",
@@ -1135,7 +1135,7 @@
}, },
// 考试周和结班状态下,学员的信息 // 考试周和结班状态下,学员的信息
async getStudentScoreList() { async getStudentScoreList() {
var list = undefined var list = []
await $http.request({ await $http.request({
url: "common/class/userScoreList", url: "common/class/userScoreList",
method: "POST", method: "POST",