|
|
|
@ -2,116 +2,65 @@ |
|
|
|
|
<div class="wrap pb"> |
|
|
|
|
<breadcrumb :routes.sync="routes" /> |
|
|
|
|
<div class="flex"> |
|
|
|
|
<div class="cover" |
|
|
|
|
:class="{'is-word': showMask1}"> |
|
|
|
|
<img v-if="coverUrl" |
|
|
|
|
:src="coverUrl" |
|
|
|
|
alt="" |
|
|
|
|
width="100%" |
|
|
|
|
height="100%"> |
|
|
|
|
<div class="cover" :class="{ 'is-word': showMask1 }"> |
|
|
|
|
<img v-if="coverUrl" :src="coverUrl" alt="" width="100%" height="100%"> |
|
|
|
|
<template v-else-if="iframeSrc"> |
|
|
|
|
<iframe class="inner fileIframe" |
|
|
|
|
id="fileIframe" |
|
|
|
|
:src="iframeSrc" |
|
|
|
|
frameborder="0"></iframe> |
|
|
|
|
<iframe class="inner fileIframe" id="fileIframe" :src="iframeSrc" frameborder="0"></iframe> |
|
|
|
|
<template v-if="showMask"> |
|
|
|
|
<div class="mask" |
|
|
|
|
style="width: 500px;height: 30px;top: 53px;right: 320px"></div> |
|
|
|
|
<div class="mask" |
|
|
|
|
style="width: 175px;height: 30px;top: 53px;right: 5px"></div> |
|
|
|
|
<div class="mask" style="width: 500px;height: 30px;top: 53px;right: 320px"></div> |
|
|
|
|
<div class="mask" style="width: 175px;height: 30px;top: 53px;right: 5px"></div> |
|
|
|
|
</template> |
|
|
|
|
<template v-if="showMask1"> |
|
|
|
|
<div class="word-mask" |
|
|
|
|
style="height: 40px;"></div> |
|
|
|
|
<div class="word-mask2" |
|
|
|
|
style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div> |
|
|
|
|
<div class="word-mask" style="height: 40px;"></div> |
|
|
|
|
<div class="word-mask2" style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div> |
|
|
|
|
</template> |
|
|
|
|
<template v-if="showMask2"> |
|
|
|
|
<div class="excel-mask1" |
|
|
|
|
style="height: 48px;"></div> |
|
|
|
|
<div class="excel-mask1" style="height: 48px;"></div> |
|
|
|
|
</template> |
|
|
|
|
</template> |
|
|
|
|
<div class="pdf inner" |
|
|
|
|
v-else-if="pdfSrc"> |
|
|
|
|
<div class="pdf inner" v-else-if="pdfSrc"> |
|
|
|
|
<p class="arrow"> |
|
|
|
|
<span @click="changePdfPage(0)" |
|
|
|
|
class="turn el-icon-arrow-left" |
|
|
|
|
:class="{grey: currentPage==1}"></span> |
|
|
|
|
{{currentPage}} / {{pageCount}} |
|
|
|
|
<span @click="changePdfPage(1)" |
|
|
|
|
class="turn el-icon-arrow-right" |
|
|
|
|
:class="{grey: currentPage==pageCount}"></span> |
|
|
|
|
<span @click="changePdfPage(0)" class="turn el-icon-arrow-left" :class="{ grey: currentPage == 1 }"></span> |
|
|
|
|
{{ currentPage }} / {{ pageCount }} |
|
|
|
|
<span @click="changePdfPage(1)" class="turn el-icon-arrow-right" |
|
|
|
|
:class="{ grey: currentPage == pageCount }"></span> |
|
|
|
|
</p> |
|
|
|
|
<pdf class="pdf-wrap" |
|
|
|
|
:src="pdfSrc" |
|
|
|
|
:page="currentPage" |
|
|
|
|
@num-pages="pageCount=$event" |
|
|
|
|
@page-loaded="currentPage=$event" |
|
|
|
|
@loaded="loadPdfHandler"> |
|
|
|
|
<pdf class="pdf-wrap" :src="pdfSrc" :page="currentPage" @num-pages="pageCount = $event" |
|
|
|
|
@page-loaded="currentPage = $event" @loaded="loadPdfHandler"> |
|
|
|
|
</pdf> |
|
|
|
|
</div> |
|
|
|
|
<div class="inner" |
|
|
|
|
v-else-if="playAuth"> |
|
|
|
|
<div class="video_wid" |
|
|
|
|
id="player"></div> |
|
|
|
|
<div class="inner" v-else-if="playAuth"> |
|
|
|
|
<div class="video_wid" id="player"></div> |
|
|
|
|
</div> |
|
|
|
|
<div class="inner" |
|
|
|
|
v-else-if="videoSrc"> |
|
|
|
|
<video class="video" |
|
|
|
|
:key="videoSrc" |
|
|
|
|
width="100%" |
|
|
|
|
height="100%" |
|
|
|
|
autoplay |
|
|
|
|
controls> |
|
|
|
|
<source :src="videoSrc" |
|
|
|
|
type="video/mp4"> |
|
|
|
|
<div class="inner" v-else-if="videoSrc"> |
|
|
|
|
<video class="video" :key="videoSrc" width="100%" height="100%" autoplay controls> |
|
|
|
|
<source :src="videoSrc" type="video/mp4"> |
|
|
|
|
您的浏览器不支持 video 标签。 |
|
|
|
|
</video> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="catalog"> |
|
|
|
|
<div class="list"> |
|
|
|
|
<h4 class="title">{{courseName}}</h4> |
|
|
|
|
<h4 class="title">{{ courseName }}</h4> |
|
|
|
|
<div class="desc-wrap"> |
|
|
|
|
<div class="desc" |
|
|
|
|
:class="{active: desShrink}" |
|
|
|
|
v-html="description"></div> |
|
|
|
|
<i class="arrow" |
|
|
|
|
:class="{active: desShrink}" |
|
|
|
|
v-if="description && description.length > 40"> |
|
|
|
|
<div class="desc" :class="{ active: desShrink }" v-html="description"></div> |
|
|
|
|
<i class="arrow" :class="{ active: desShrink }" v-if="description && description.length > 40"> |
|
|
|
|
</i> |
|
|
|
|
</div> |
|
|
|
|
<div class="chapters"> |
|
|
|
|
<template v-if="chapterList && chapterList.length"> |
|
|
|
|
<div class="chapter" |
|
|
|
|
v-for="(item,index) in chapterList" |
|
|
|
|
:key="index"> |
|
|
|
|
<div class="chapterName">{{item.name}}</div> |
|
|
|
|
<div class="section" |
|
|
|
|
v-if="item.subsectionList.length"> |
|
|
|
|
<div v-for="(section,i) in item.subsectionList" |
|
|
|
|
:key="i" |
|
|
|
|
@click="preview(section, item.name)"> |
|
|
|
|
<p class="sectionName" |
|
|
|
|
:class="{active: curLink === `${item.name}${section.name}`}"> |
|
|
|
|
<img v-if="section.fileType === 'pptx'" |
|
|
|
|
src="@/assets/img/exts/ppt.png" |
|
|
|
|
alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'mp4'" |
|
|
|
|
src="@/assets/img/exts/video.png" |
|
|
|
|
alt=""> |
|
|
|
|
<div class="chapter" v-for="(item, index) in chapterList" :key="index"> |
|
|
|
|
<div class="chapterName">{{ item.name }}</div> |
|
|
|
|
<div class="section" v-if="item.subsectionList.length"> |
|
|
|
|
<div v-for="(section, i) in item.subsectionList" :key="i" @click="preview(section, item.name)"> |
|
|
|
|
<p class="sectionName" :class="{ active: curLink === `${item.name}${section.name}` }"> |
|
|
|
|
<img v-if="section.fileType === 'pptx'" src="@/assets/img/exts/ppt.png" alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'mp4'" src="@/assets/img/exts/video.png" alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'doc' || section.fileType === 'docx'" |
|
|
|
|
src="@/assets/img/exts/word.png" |
|
|
|
|
alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'txt'" |
|
|
|
|
src="@/assets/img/exts/txt.png" |
|
|
|
|
alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'pdf'" |
|
|
|
|
src="@/assets/img/exts/pdf.png" |
|
|
|
|
alt=""> |
|
|
|
|
<img v-else |
|
|
|
|
src="@/assets/img/exts/pic.png" |
|
|
|
|
alt=""> |
|
|
|
|
src="@/assets/img/exts/word.png" alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'txt'" src="@/assets/img/exts/txt.png" alt=""> |
|
|
|
|
<img v-else-if="section.fileType === 'pdf'" src="@/assets/img/exts/pdf.png" alt=""> |
|
|
|
|
<img v-else src="@/assets/img/exts/pic.png" alt=""> |
|
|
|
|
{{ section.name }} |
|
|
|
|
</p> |
|
|
|
|
</div> |
|
|
|
@ -181,7 +130,7 @@ export default { |
|
|
|
|
}, |
|
|
|
|
destroyed () { |
|
|
|
|
// 记录播放时长 |
|
|
|
|
util.local.get(Setting.tokenKey) && this.$post(this.api.playRecordSave, { |
|
|
|
|
util.session.get(Setting.tokenKey) && this.$post(this.api.playRecordSave, { |
|
|
|
|
courseId: this.id, |
|
|
|
|
courseType: 1, |
|
|
|
|
playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60) |
|
|
|
@ -240,7 +189,7 @@ export default { |
|
|
|
|
}, |
|
|
|
|
preview (row, chapterName, showConfirm = 1) { |
|
|
|
|
// 如果没登录,直接去登录 |
|
|
|
|
if (!util.local.get(Setting.tokenKey) && !util.local.get('oc_server_token') && showConfirm) { |
|
|
|
|
if (!util.session.get(Setting.tokenKey) && !util.local.get('oc_server_token') && showConfirm) { |
|
|
|
|
this.$confirm('请先登录,是否直接前往登录?', "提示", { |
|
|
|
|
type: 'success', |
|
|
|
|
closeOnClickModal: false |
|
|
|
@ -365,6 +314,7 @@ export default { |
|
|
|
|
</style> |
|
|
|
|
<style lang="scss" scoped> |
|
|
|
|
$height: 700px; |
|
|
|
|
|
|
|
|
|
.video_wid, |
|
|
|
|
.cover { |
|
|
|
|
position: relative; |
|
|
|
@ -372,27 +322,34 @@ $height: 700px; |
|
|
|
|
height: $height !important; |
|
|
|
|
border: 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.page { |
|
|
|
|
margin: 12px 0; |
|
|
|
|
|
|
|
|
|
.intro { |
|
|
|
|
font-size: 16px; |
|
|
|
|
color: #333; |
|
|
|
|
line-height: 24px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.cover { |
|
|
|
|
flex: 1; |
|
|
|
|
background-color: #252528; |
|
|
|
|
|
|
|
|
|
img { |
|
|
|
|
border-radius: 8px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
&.is-word { |
|
|
|
|
overflow: hidden; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.fileIframe { |
|
|
|
|
height: $height !important; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.video_wid, |
|
|
|
|
.inner { |
|
|
|
|
width: 100%; |
|
|
|
@ -400,20 +357,24 @@ $height: 700px; |
|
|
|
|
border: 0; |
|
|
|
|
overflow: auto; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.cover.is-word { |
|
|
|
|
.inner { |
|
|
|
|
height: calc(100% + 38px) !important; |
|
|
|
|
margin-top: -38px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.video_wid:focus { |
|
|
|
|
outline: none; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.catalog { |
|
|
|
|
width: 296px; |
|
|
|
|
padding: 16px; |
|
|
|
|
margin-left: 12px; |
|
|
|
|
background-color: #252528; |
|
|
|
|
|
|
|
|
|
.entry { |
|
|
|
|
display: block; |
|
|
|
|
width: 100%; |
|
|
|
@ -421,31 +382,38 @@ $height: 700px; |
|
|
|
|
margin-bottom: 16px; |
|
|
|
|
background: url(../../../assets/img/entry.png) 0 0/100% 100% no-repeat; |
|
|
|
|
cursor: pointer; |
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
|
|
opacity: 0.9; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.list { |
|
|
|
|
height: calc(700px - 82px); |
|
|
|
|
overflow-y: auto; |
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
margin-bottom: 11px; |
|
|
|
|
color: #fff; |
|
|
|
|
font-size: 16px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.desc-wrap { |
|
|
|
|
position: relative; |
|
|
|
|
|
|
|
|
|
.desc { |
|
|
|
|
font-size: 12px; |
|
|
|
|
color: #fff; |
|
|
|
|
line-height: 22px; |
|
|
|
|
@include mul-ellipsis(4); |
|
|
|
|
|
|
|
|
|
&.active { |
|
|
|
|
display: block; |
|
|
|
|
overflow: visible; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.arrow { |
|
|
|
|
position: absolute; |
|
|
|
|
bottom: 2px; |
|
|
|
@ -454,48 +422,59 @@ $height: 700px; |
|
|
|
|
justify-content: space-between; |
|
|
|
|
width: 46px; |
|
|
|
|
background-color: #fff; |
|
|
|
|
|
|
|
|
|
span { |
|
|
|
|
font-size: 14px; |
|
|
|
|
color: rgba(0, 0, 0, 0.65); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
img { |
|
|
|
|
width: 16px; |
|
|
|
|
cursor: pointer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
&.active { |
|
|
|
|
span { |
|
|
|
|
opacity: 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
img { |
|
|
|
|
transform: rotate(180deg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.chapters { |
|
|
|
|
margin-top: 16px; |
|
|
|
|
max-height: calc(100% - 53px); |
|
|
|
|
overflow: auto; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.chapter { |
|
|
|
|
margin-bottom: 20px; |
|
|
|
|
|
|
|
|
|
.chapterName { |
|
|
|
|
color: #fff; |
|
|
|
|
font-size: 14px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.section { |
|
|
|
|
padding: 5px 15px; |
|
|
|
|
margin-top: 12px; |
|
|
|
|
background-color: #121214; |
|
|
|
|
|
|
|
|
|
.sectionName { |
|
|
|
|
margin: 12px 0; |
|
|
|
|
font-size: 12px; |
|
|
|
|
color: #999; |
|
|
|
|
cursor: pointer; |
|
|
|
|
@include ellipsis; |
|
|
|
|
|
|
|
|
|
img { |
|
|
|
|
margin-right: 8px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
&.active { |
|
|
|
|
color: #fff; |
|
|
|
|
} |
|
|
|
@ -503,6 +482,7 @@ $height: 700px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.el-image-viewer__wrapper { |
|
|
|
|
transform: translateY(-10px); |
|
|
|
|
transition: transform 0.5s; |
|
|
|
@ -511,19 +491,23 @@ $height: 700px; |
|
|
|
|
transform: translateY(0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.el-image-viewer__close { |
|
|
|
|
z-index: 2000; |
|
|
|
|
top: 15px; |
|
|
|
|
right: 15px; |
|
|
|
|
|
|
|
|
|
&.doc-close { |
|
|
|
|
i { |
|
|
|
|
color: #000 !important; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.list::-webkit-scrollbar { |
|
|
|
|
width: 4px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.list::-webkit-scrollbar-thumb { |
|
|
|
|
border-radius: 10px; |
|
|
|
|
background: rgba(0, 0, 0, 0.06); |
|
|
|
@ -534,6 +518,7 @@ $height: 700px; |
|
|
|
|
position: absolute; |
|
|
|
|
background-color: rgb(57, 58, 61); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.word-mask { |
|
|
|
|
z-index: 9; |
|
|
|
|
position: absolute; |
|
|
|
@ -542,6 +527,7 @@ $height: 700px; |
|
|
|
|
width: 100%; |
|
|
|
|
background-color: rgb(243, 242, 241); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.word-mask1 { |
|
|
|
|
z-index: 9; |
|
|
|
|
position: absolute; |
|
|
|
@ -550,11 +536,13 @@ $height: 700px; |
|
|
|
|
width: 100%; |
|
|
|
|
background-color: #185abd; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.word-mask2 { |
|
|
|
|
z-index: 9; |
|
|
|
|
position: absolute; |
|
|
|
|
background-color: transparent; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.excel-mask1 { |
|
|
|
|
z-index: 9; |
|
|
|
|
position: absolute; |
|
|
|
@ -563,22 +551,28 @@ $height: 700px; |
|
|
|
|
width: 60%; |
|
|
|
|
background-color: #107c41; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/deep/.pdf-dia { |
|
|
|
|
border-radius: 0 !important; |
|
|
|
|
|
|
|
|
|
.el-dialog__header { |
|
|
|
|
display: none; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.el-dialog__body { |
|
|
|
|
padding: 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.el-dialog__headerbtn { |
|
|
|
|
top: 10px; |
|
|
|
|
|
|
|
|
|
.el-dialog__close { |
|
|
|
|
color: #fff; |
|
|
|
|
font-size: 16px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.pdf { |
|
|
|
|
.arrow { |
|
|
|
|
padding: 10px 0; |
|
|
|
@ -588,27 +582,32 @@ $height: 700px; |
|
|
|
|
font-size: 16px; |
|
|
|
|
color: #fff; |
|
|
|
|
background-color: #333; |
|
|
|
|
|
|
|
|
|
.turn { |
|
|
|
|
margin: 0 10px; |
|
|
|
|
font-size: 18px; |
|
|
|
|
cursor: pointer; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.pdf-wrap { |
|
|
|
|
width: 80%; |
|
|
|
|
margin: 0 auto; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/deep/.project-dia { |
|
|
|
|
.el-dialog__body { |
|
|
|
|
padding: 28px 32px; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.projects { |
|
|
|
|
display: flex; |
|
|
|
|
flex-wrap: wrap; |
|
|
|
|
max-height: 400px; |
|
|
|
|
overflow: auto; |
|
|
|
|
|
|
|
|
|
li { |
|
|
|
|
display: inline-flex; |
|
|
|
|
align-items: center; |
|
|
|
@ -618,21 +617,26 @@ $height: 700px; |
|
|
|
|
background-color: #f6f8fa; |
|
|
|
|
border-radius: 16px; |
|
|
|
|
cursor: pointer; |
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
|
|
span { |
|
|
|
|
color: #007eff; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
&:nth-child(3n) { |
|
|
|
|
margin-right: 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
&.active { |
|
|
|
|
background-color: #f2f7ff; |
|
|
|
|
|
|
|
|
|
span { |
|
|
|
|
color: #3988ff; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
span { |
|
|
|
|
max-width: 140px; |
|
|
|
|
margin-left: 14px; |
|
|
|
@ -640,6 +644,7 @@ $height: 700px; |
|
|
|
|
color: #333; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@media (max-width: 1430px) { |
|
|
|
|
.wrap { |
|
|
|
|
padding: 12px 100px 20px; |
|
|
|
|