mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/learning-system-portal.git
synced 2025-12-11 20:06:44 +08:00
视频播放笔记记录时间的控制
This commit is contained in:
@@ -14,8 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="newcote-text">
|
<div class="newcote-text">
|
||||||
<el-input type="textarea" :autofocus="true" :style="`min-height:${inputHeight}px`" placeholder="好记性不如烂笔头,记录些什么吧~"
|
<el-input type="textarea" :autofocus="true" :style="`min-height:${inputHeight}px`" placeholder="好记性不如烂笔头,记录些什么吧~"
|
||||||
v-model="content_new" maxlength="200" :autosize="{ minRows: inputRows, maxRows: 20}"
|
v-model="content_new" maxlength="200" :autosize="{ minRows: inputRows, maxRows: 20}" show-word-limit>
|
||||||
show-word-limit>
|
|
||||||
</el-input>
|
</el-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -23,8 +22,7 @@
|
|||||||
<div v-if="notetab == 2">
|
<div v-if="notetab == 2">
|
||||||
<div class="mycote-content" v-show="!isEdit" :style="`height:${listHeight}px`">
|
<div class="mycote-content" v-show="!isEdit" :style="`height:${listHeight}px`">
|
||||||
<div v-if="noteList.length > 0">
|
<div v-if="noteList.length > 0">
|
||||||
<div style="border-bottom:1px solid #4444;padding-bottom:25px;" v-for="note in noteList"
|
<div style="border-bottom:1px solid #4444;padding-bottom:25px;" v-for="note in noteList" :key="note.id">
|
||||||
:key="note.id">
|
|
||||||
<span class="mycote-time">{{note.sysUpdateTime}}
|
<span class="mycote-time">{{note.sysUpdateTime}}
|
||||||
<span class="sm">{{note.openType == 9?'公开':'私密'}}</span>
|
<span class="sm">{{note.openType == 9?'公开':'私密'}}</span>
|
||||||
<span class="more">
|
<span class="more">
|
||||||
@@ -32,20 +30,16 @@
|
|||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
<svg-icon style="margin-right: 0;font-size:26px;" icon-class="spot"></svg-icon>
|
<svg-icon style="margin-right: 0;font-size:26px;" icon-class="spot"></svg-icon>
|
||||||
</span>
|
</span>
|
||||||
<el-dropdown-menu slot="dropdown" class="dropdown-box"
|
<el-dropdown-menu slot="dropdown" class="dropdown-box" style="background:#333333;border: none;">
|
||||||
style="background:#333333;border: none;">
|
|
||||||
<el-dropdown-item command="a" style="color:#fff" @click.native="noteDel(note)">
|
<el-dropdown-item command="a" style="color:#fff" @click.native="noteDel(note)">
|
||||||
<img style="width:13px;height:18px;vertical-align: middle;"
|
<img style="width:13px;height:18px;vertical-align: middle;" src="@/assets/images/icon/note-del.png" /> 删除</el-dropdown-item>
|
||||||
src="@/assets/images/icon/note-del.png" /> 删除</el-dropdown-item>
|
|
||||||
<el-dropdown-item command="b" style="color:#fff" @click.native="noteEdit(note)">
|
<el-dropdown-item command="b" style="color:#fff" @click.native="noteEdit(note)">
|
||||||
<img style="width:13px;height:14px;margin-right:4px;vertical-align: middle;"
|
<img style="width:13px;height:14px;margin-right:4px;vertical-align: middle;" src="@/assets/images/icon/note-edit.png" />编辑</el-dropdown-item>
|
||||||
src="@/assets/images/icon/note-edit.png" />编辑</el-dropdown-item>
|
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<div style="margin-top:10px" class="newcote-time" v-if="note.playTime"
|
<div style="margin-top:10px" class="newcote-time" v-if="note.playTime" @click="onPlayVideo(note.contentId,note.playTime)">
|
||||||
@click="onPlayVideo(note.contentId,note.playTime)">
|
|
||||||
<img :src="`${webBaseUrl}/images/coteplay.png`" alt="">
|
<img :src="`${webBaseUrl}/images/coteplay.png`" alt="">
|
||||||
{{formatSeconds(note.playTime)}}
|
{{formatSeconds(note.playTime)}}
|
||||||
</div>
|
</div>
|
||||||
@@ -73,17 +67,15 @@
|
|||||||
<img :src="`${webBaseUrl}/images/cotedetel.png`" @click="timeDel()" />
|
<img :src="`${webBaseUrl}/images/cotedetel.png`" @click="timeDel()" />
|
||||||
</div>
|
</div>
|
||||||
<div class="newcote-text">
|
<div class="newcote-text">
|
||||||
<el-input type="textarea" :autofocus="true" placeholder="好记性不如烂笔头,记录些什么吧~"
|
<el-input type="textarea" :autofocus="true" :style="`min-height:${inputHeight}px`" placeholder="好记性不如烂笔头,记录些什么吧~"
|
||||||
v-model="mynoteData.content" maxlength="200" :autosize="{ minRows: 18, maxRows: 20}"
|
v-model="mynoteData.content" maxlength="200" :autosize="{ minRows: inputRows, maxRows: 20}" show-word-limit>
|
||||||
show-word-limit>
|
|
||||||
</el-input>
|
</el-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="newcote-bottom" v-if="notetab == 1 || isEdit">
|
<div class="newcote-bottom" v-if="notetab == 1 || isEdit">
|
||||||
<span v-if="btnPlayTime" style="cursor: pointer;" @click="videoLocation"> <img :src="`${webBaseUrl}/images/playtime.png`"
|
<span v-if="btnPlayTime" style="cursor: pointer;" @click="videoLocation"> <img :src="`${webBaseUrl}/images/playtime.png`" alt=""> 视频位置</span>
|
||||||
alt=""> 视频位置</span>
|
|
||||||
<el-radio v-if="mynoteData.openType == 9" v-model="editRadio" :label="9">公开</el-radio>
|
<el-radio v-if="mynoteData.openType == 9" v-model="editRadio" :label="9">公开</el-radio>
|
||||||
<el-radio v-model="editRadio" :label="1">私密</el-radio>
|
<el-radio v-model="editRadio" :label="1">私密</el-radio>
|
||||||
<el-button size="small" v-if="notetab != 1" v-show="isEdit" @click="editCancel()">取消</el-button>
|
<el-button size="small" v-if="notetab != 1" v-show="isEdit" @click="editCancel()">取消</el-button>
|
||||||
@@ -184,7 +176,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data(val){
|
data(val){
|
||||||
if(val.id) {
|
if(val.id) {
|
||||||
console.log(val,'val');
|
//console.log(val,'val');
|
||||||
this.mynoteData.courseId = this.courseId;
|
this.mynoteData.courseId = this.courseId;
|
||||||
this.mynoteData.courseName = this.data.name;
|
this.mynoteData.courseName = this.data.name;
|
||||||
// this.mynoteData.contentId = this.data.id;
|
// this.mynoteData.contentId = this.data.id;
|
||||||
|
|||||||
@@ -524,6 +524,16 @@ export default {
|
|||||||
document.msFullScreen
|
document.msFullScreen
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
//开始播放
|
||||||
|
startPlay:function(newTime){
|
||||||
|
if(newTime){
|
||||||
|
this.videoDom.currentTime = newTime;
|
||||||
|
this.barrageTimelineStart = newTime;
|
||||||
|
this.updateProgressBySetTime(newTime);
|
||||||
|
}
|
||||||
|
this.isPlaying = true;
|
||||||
|
this.videoDom.play();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentVolume: function () {
|
currentVolume: function () {
|
||||||
@@ -539,13 +549,13 @@ export default {
|
|||||||
this.$emit('onPlayerEnded', {})
|
this.$emit('onPlayerEnded', {})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
notePlay: function(val) {
|
// notePlay: function(val) {
|
||||||
if(val) {
|
// if(val) {
|
||||||
this.updateProgressBySetTime(val);
|
// this.updateProgressBySetTime(val);
|
||||||
this.isPlaying = true;
|
// this.isPlaying = true;
|
||||||
this.videoDom.play();
|
// this.videoDom.play();
|
||||||
}
|
// }
|
||||||
},
|
// },
|
||||||
src: function () {
|
src: function () {
|
||||||
// 当视频地址变更时,重载视频
|
// 当视频地址变更时,重载视频
|
||||||
this.videoDom.load();
|
this.videoDom.load();
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
console.log(this.isDrag,'isDrag');
|
//console.log(this.isDrag,'isDrag');
|
||||||
//初始化一些固定数据
|
//初始化一些固定数据
|
||||||
let dom_full = this.$el.getElementsByClassName("progress-full")[0];
|
let dom_full = this.$el.getElementsByClassName("progress-full")[0];
|
||||||
this.dom_full = dom_full;
|
this.dom_full = dom_full;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<course-image v-if="courseInfo.id != ''" :course="courseInfo"></course-image>
|
<course-image v-if="courseInfo.id != ''" :course="courseInfo"></course-image>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="resType == 10" style="position: relative;">
|
<div v-if="resType == 10" style="position: relative;">
|
||||||
<videoPlayer id="myVideoPlayer" v-if="resType == 10" :src="blobUrl" @onPlayerPlaying="onPlayerPlaying"
|
<videoPlayer ref="myVideoPlayer" id="myVideoPlayer" :src="blobUrl" @onPlayerPlaying="onPlayerPlaying"
|
||||||
:initTime="contentData.lastStudyTime" :notePlay="notePlay" @onPlayerPlay="onPlayerPlay"
|
:initTime="contentData.lastStudyTime" :notePlay="notePlay" @onPlayerPlay="onPlayerPlay"
|
||||||
:isDrag="curriculumData.isDrag" @onFullscreen="onFullscreen" @onPlayerPause="onPlayerPause"
|
:isDrag="curriculumData.isDrag" @onFullscreen="onFullscreen" @onPlayerPause="onPlayerPause"
|
||||||
@onPlayerEnded="onPlayerEnded"></videoPlayer>
|
@onPlayerEnded="onPlayerEnded"></videoPlayer>
|
||||||
@@ -65,8 +65,7 @@
|
|||||||
<div class="con-audio">
|
<div class="con-audio">
|
||||||
<div class="con-audio-title">{{ contentData.contentName }}</div>
|
<div class="con-audio-title">{{ contentData.contentName }}</div>
|
||||||
<div class="con-audio-player">
|
<div class="con-audio-player">
|
||||||
<audioPlayer v-if="resType == 20" :url="blobUrl"
|
<audioPlayer v-if="resType == 20" :url="blobUrl" :name="contentData.contentName" @onPlaying="audioPlaying" :isDrag="curriculumData.isDrag"
|
||||||
:name="contentData.contentName" @onPlaying="audioPlaying" :isDrag="curriculumData.isDrag"
|
|
||||||
@onPlay="audioPlay" @onPause="audioPause" @onPlayEnd="audioEnd"></audioPlayer>
|
@onPlay="audioPlay" @onPause="audioPause" @onPlayEnd="audioEnd"></audioPlayer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -124,7 +123,7 @@
|
|||||||
<div style="margin: 10px 0px;font-weight: 700;">{{item.section.name}}</div>
|
<div style="margin: 10px 0px;font-weight: 700;">{{item.section.name}}</div>
|
||||||
<div class="units-info" :class="{'units-active':contentData.id == ele.id}" @click="showRes(ele,i,index)" v-for="(ele, i) in item.children" :key="i">
|
<div class="units-info" :class="{'units-active':contentData.id == ele.id}" @click="showRes(ele,i,index)" v-for="(ele, i) in item.children" :key="i">
|
||||||
<img v-if="contentData.id == ele.id" :src="`${webBaseUrl}/images/playicon.png`" alt=""> {{i+1}}.
|
<img v-if="contentData.id == ele.id" :src="`${webBaseUrl}/images/playicon.png`" alt=""> {{i+1}}.
|
||||||
{{ ele.contentName }}
|
<span>{{ ele.contentName }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -141,7 +140,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- 我的笔记 -->
|
<!-- 我的笔记 -->
|
||||||
<div class="mynote" v-show="tab == 2">
|
<div class="mynote" v-show="tab == 2">
|
||||||
<my-note ref="mynote" :height="controlHeight" @change="Fn1" :data="courseInfo" @videoLocation="videoLocation" @onPlayVideo="onPlayVideo"
|
<my-note ref="mynote" :height="controlHeight" @change="noteChange" :data="courseInfo" @videoLocation="videoLocation" @onPlayVideo="onPlayVideo"
|
||||||
:score="courseInfo.score"></my-note>
|
:score="courseInfo.score"></my-note>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -383,7 +382,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
Fn1(){
|
noteChange(){
|
||||||
//视频点定位,直接到播放的视频位置
|
//视频点定位,直接到播放的视频位置
|
||||||
this.timer = new Date().getTime()
|
this.timer = new Date().getTime()
|
||||||
|
|
||||||
@@ -455,17 +454,51 @@
|
|||||||
onPlayVideo(contentId,time){
|
onPlayVideo(contentId,time){
|
||||||
//这里需要根据contentId,是否切换到对应的内容的视频的时间
|
//这里需要根据contentId,是否切换到对应的内容的视频的时间
|
||||||
//如果 contentId已经不存在,需要提示
|
//如果 contentId已经不存在,需要提示
|
||||||
this.playerBoxShow = false;
|
console.log(contentId,this.contentData.id,'两个内容id');
|
||||||
this.notePlay = null;
|
|
||||||
let $this=this;
|
let $this=this;
|
||||||
|
if(this.contentData.id==contentId){
|
||||||
|
this.onPlayerPause()
|
||||||
|
//this.audioPause();
|
||||||
|
this.contentData.lastStudyTime=time;
|
||||||
|
//this.onPlayerPlay();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$this.notePlay = time;
|
$this.$refs.myVideoPlayer.startPlay(time);
|
||||||
}, 500)
|
}, 10)
|
||||||
|
console.log('开始播放1');
|
||||||
|
}else{
|
||||||
|
//通过contentId
|
||||||
|
let toResContent=null;
|
||||||
|
this.contentList.forEach(c => {
|
||||||
|
if(c.id==contentId){
|
||||||
|
c.lastStudyTime=time;
|
||||||
|
toResContent=c;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(toResContent!=null){
|
||||||
|
this.changePlayRes(toResContent);
|
||||||
|
//this.onPlayerPlay();
|
||||||
|
setTimeout(() => {
|
||||||
|
$this.$refs.myVideoPlayer.startPlay(time);
|
||||||
|
}, 10)
|
||||||
|
|
||||||
|
console.log('开始播放2');
|
||||||
|
}else{
|
||||||
|
this.$message.error('资源已不存在或更换过,已无法定位');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.playerBoxShow = false;
|
||||||
|
//this.changePlayRes(r);
|
||||||
|
// this.playerBoxShow = false;
|
||||||
|
// this.notePlay = null;
|
||||||
|
// let $this=this;
|
||||||
|
// setTimeout(() => {
|
||||||
|
// $this.notePlay = time;
|
||||||
|
// }, 500)
|
||||||
},
|
},
|
||||||
//笔记组件触发,记录当前播放时间
|
//笔记组件触发,记录当前播放时间
|
||||||
videoLocation() {
|
videoLocation() {
|
||||||
//this.$store.dispatch("SetIntTimeNote", this.intTimeNote);
|
//this.$store.dispatch("SetIntTimeNote", this.intTimeNote);
|
||||||
console.log(this.contentData.id+'='+this.intTimeNote,'设置视频播放时间')
|
//console.log(this.contentData.id+'='+this.intTimeNote,'设置视频播放时间')
|
||||||
this.$refs.mynote.setVideoTime(this.contentData.id,this.intTimeNote);
|
this.$refs.mynote.setVideoTime(this.contentData.id,this.intTimeNote);
|
||||||
},
|
},
|
||||||
coutab(n) {
|
coutab(n) {
|
||||||
@@ -490,51 +523,8 @@
|
|||||||
widthOpen(url) {
|
widthOpen(url) {
|
||||||
window.open(url, '_blank');
|
window.open(url, '_blank');
|
||||||
},
|
},
|
||||||
showRes(r, i, index) { //i:子节下标,index:章下标
|
//替换播放区域
|
||||||
if (i != undefined && index != undefined && r.status < 9) {
|
changePlayRes(r){
|
||||||
if (this.courseInfo.orderStudy) {
|
|
||||||
//判断上个是否学完
|
|
||||||
if (i == 0) {
|
|
||||||
if (index > 0) { //第一章 第一节
|
|
||||||
let preCatalog = this.catalogTree[index - 1];
|
|
||||||
let last = preCatalog.children[preCatalog.children.length - 1];
|
|
||||||
if (last.status != 9) {
|
|
||||||
this.$message.warning('请按顺序学习!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let pre = this.catalogTree[index].children[i - 1];
|
|
||||||
if (pre.status != 9) {
|
|
||||||
this.$message.warning('请按顺序学习!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//判断是否是第一个未学完的
|
|
||||||
let isAllow = false;
|
|
||||||
let has = this.catalogTree.some(treeNode => {
|
|
||||||
let hasNo = treeNode.children.some(child => {
|
|
||||||
if (child.status < 9) {
|
|
||||||
if (child.id == r.id) {
|
|
||||||
isAllow = true;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
return hasNo;
|
|
||||||
});
|
|
||||||
if (has) {
|
|
||||||
if (!isAllow) {
|
|
||||||
this.$message.warning('请按顺序学习!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.appendStudyOtherHandle!=null){
|
if(this.appendStudyOtherHandle!=null){
|
||||||
window.clearTimeout(this.appendStudyOtherHandle);
|
window.clearTimeout(this.appendStudyOtherHandle);
|
||||||
}
|
}
|
||||||
@@ -629,11 +619,53 @@
|
|||||||
$this.controlHeight=h-95;
|
$this.controlHeight=h-95;
|
||||||
//console.log(h,$this.controlHeight,'$this.controlHeight');
|
//console.log(h,$this.controlHeight,'$this.controlHeight');
|
||||||
})
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
// handleChange(val) {
|
showRes(r, i, index) { //i:子节下标,index:章下标
|
||||||
// console.log(val);
|
if (i != undefined && index != undefined && r.status < 9) {
|
||||||
// },
|
if (this.courseInfo.orderStudy) {
|
||||||
|
//判断上个是否学完
|
||||||
|
if (i == 0) {
|
||||||
|
if (index > 0) { //第一章 第一节
|
||||||
|
let preCatalog = this.catalogTree[index - 1];
|
||||||
|
let last = preCatalog.children[preCatalog.children.length - 1];
|
||||||
|
if (last.status != 9) {
|
||||||
|
this.$message.warning('请按顺序学习!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let pre = this.catalogTree[index].children[i - 1];
|
||||||
|
if (pre.status != 9) {
|
||||||
|
this.$message.warning('请按顺序学习!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//判断是否是第一个未学完的
|
||||||
|
let isAllow = false;
|
||||||
|
let has = this.catalogTree.some(treeNode => {
|
||||||
|
let hasNo = treeNode.children.some(child => {
|
||||||
|
if (child.status < 9) {
|
||||||
|
if (child.id == r.id) {
|
||||||
|
isAllow = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return hasNo;
|
||||||
|
});
|
||||||
|
if (has) {
|
||||||
|
if (!isAllow) {
|
||||||
|
this.$message.warning('请按顺序学习!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.changePlayRes(r);
|
||||||
|
},
|
||||||
loadScorePraiseAndTrample() {
|
loadScorePraiseAndTrample() {
|
||||||
//加载是否请过分
|
//加载是否请过分
|
||||||
apiCourseGrade.has(this.courseId).then(rs => {
|
apiCourseGrade.has(this.courseId).then(rs => {
|
||||||
@@ -1900,6 +1932,10 @@
|
|||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space:nowrap;
|
||||||
|
word-break:break-all;
|
||||||
|
text-overflow:ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.units-active {
|
.units-active {
|
||||||
|
|||||||
Reference in New Issue
Block a user