After Width: | Height: | Size: 371 B |
After Width: | Height: | Size: 330 B |
After Width: | Height: | Size: 243 B |
After Width: | Height: | Size: 341 B |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 437 B |
After Width: | Height: | Size: 370 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 256 KiB |
After Width: | Height: | Size: 298 B |
After Width: | Height: | Size: 3.0 KiB |
@ -0,0 +1,455 @@ |
||||
<template> |
||||
<div class="wrap"> |
||||
<div class="inner"> |
||||
<div class="top"> |
||||
<div v-if="form.interfaceDiagrams" class="pics"> |
||||
<img v-for="(pic, i) in form.interfaceDiagrams" :key="i" :src="pic" alt=""> |
||||
</div> |
||||
<div class="right"> |
||||
<h6>{{ form.mall.productName }}</h6> |
||||
<div class="meta"> |
||||
共 <span class="val">48</span> 个实验项目  已有 <span class="val">{{ form.goodsRes.learningCount }}</span>人学过 |
||||
</div> |
||||
<div class="des" v-html="form.mall.productIntroduction"></div> |
||||
<div class="field">适用专业:{{ form.goodsRes.disciplineName }}</div> |
||||
<div class="fields"> |
||||
<div v-if="form.mall.applicationScenario" class="field"><span class="label">适用场景:</span>{{ form.mall.applicationScenario }}</div> |
||||
<div v-if="form.mall.matchingCourse" class="field"><span class="label">匹配课程:</span>{{ form.mall.matchingCourse }}</div> |
||||
<div v-if="form.mall.courseHours" class="field"><span class="label">预计课时:</span>{{ form.mall.courseHours }}</div> |
||||
<div v-if="form.goodsRes.typeName" class="field"><span class="label">产品类型:</span>{{ form.goodsRes.typeName }}</div> |
||||
</div> |
||||
<button v-if="form.goodsRes.logoOfOurSchool" class="btn" @click="toTrail">试用体验</button> |
||||
<button v-else class="btn entry" @click="toStation">进入实验</button> |
||||
</div> |
||||
</div> |
||||
<div class="course"> |
||||
<div class="detail"> |
||||
<ul class="tab"> |
||||
<li v-for="(tab, i) in tabs" :key="i" :class="{active: curTab === tab.id}" @click="tabChange(tab)">{{ tab.name }}</li> |
||||
</ul> |
||||
<div class="courses"> |
||||
<template v-if="!curTab"> |
||||
<h6>课程介绍</h6> |
||||
<div class="des" v-html="form.mall.detailedIntroduction"></div> |
||||
</template> |
||||
<template v-else> |
||||
<div v-for="(item, i) in chapterList" :key="i"> |
||||
<h6>{{ item.name }}</h6> |
||||
<ul v-if="item.subsectionList.length" class="list"> |
||||
<li v-for="(section, i) in item.subsectionList" :key="i" @click="toPreview(item, section)"> |
||||
<p class="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=""> |
||||
{{ section.projectName }} |
||||
</p> |
||||
<i :class="['status', section.whetherToStudyOrNot ? 'el-icon-success' : 'circle']" @click.stop="studySection(item, section)"></i> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</template> |
||||
</div> |
||||
</div> |
||||
<div class="products"> |
||||
<h6>热门产品推荐</h6> |
||||
<ul class="product"> |
||||
<li v-for="(item, i) in hots" :key="i" @click="toDetail(item.mallId)"> |
||||
<img :src="item.coverDrawing" alt="" /> |
||||
<img v-if="item.logoOfOurSchool" class="my-school" src="@/assets/img/my-school.png" alt=""> |
||||
<div class="texts"> |
||||
<div class="title">{{ item.productName }}</div> |
||||
<div class="desc" v-html="item.productIntroduction"></div> |
||||
<div class="metas"> |
||||
<template v-if="item.selected"> |
||||
<el-tag |
||||
type="danger" |
||||
effect="dark"> |
||||
官方精选 |
||||
</el-tag> |
||||
<div class="meta">{{ item.learningCount }}学过</div> |
||||
</template> |
||||
|
||||
<template v-else> |
||||
<div class="meta"> |
||||
<img class="icon" src="@/assets/img/eye.png" alt=""> |
||||
{{ item.learningCount }} |
||||
</div> |
||||
<div v-if="item.isAssociatedProduct === 0" class="meta"> |
||||
<img class="icon" src="@/assets/img/platform.png" alt=""> |
||||
平台官方 |
||||
</div> |
||||
<span class="type">{{ item.courseType == 1 ? '付费' : '免费'}}</span> |
||||
</template> |
||||
</div> |
||||
</div> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import Util from "@/libs/util" |
||||
import Setting from "@/setting" |
||||
export default { |
||||
data() { |
||||
return { |
||||
id: this.$route.query.id, |
||||
curTab: 0, |
||||
tabs: [ |
||||
{ |
||||
id: 0, |
||||
name: '详情介绍' |
||||
}, |
||||
{ |
||||
id: 1, |
||||
name: '课程目录' |
||||
}, |
||||
], |
||||
form: { |
||||
mall: {}, |
||||
goodsRes: {} |
||||
}, |
||||
chapterList: [], |
||||
hots: [] |
||||
}; |
||||
}, |
||||
mounted() { |
||||
this.getData() |
||||
this.getHot() |
||||
}, |
||||
methods: { |
||||
// 产品详情 |
||||
getData() { |
||||
this.$get(`${this.api.detailsOfGoods}?mallId=${this.id}`).then(res => { |
||||
const e = res.orderDetails |
||||
if (e.mall.interfaceDiagram) e.interfaceDiagrams = e.mall.interfaceDiagram.split(',') |
||||
this.form = e |
||||
this.getChapter() |
||||
}).catch(err => {}) |
||||
}, |
||||
// 获取章节小节 |
||||
async getChapter() { |
||||
let res = await this.$post(`${this.api.courseLearningProgress}?courseId=${this.form.mall.associatedProduct}`) |
||||
this.chapterList = res.list |
||||
}, |
||||
// tab切换 |
||||
tabChange({ id }) { |
||||
this.curTab = id |
||||
}, |
||||
// 跳转播放资源 |
||||
toPreview(item, section) { |
||||
this.form.goodsRes.logoOfOurSchool ? |
||||
this.$router.push('/station/preview?courseId=' + this.form.mall.associatedProduct + '&curriculumName=' + this.form.mall.associatedProductName) : |
||||
this.toTrail() |
||||
}, |
||||
// 勾选/取消勾选学习进度 |
||||
studySection(item) { |
||||
item.whetherToStudyOrNot ? |
||||
this.$post(`${this.api.deleteLearningProgress}?id=${item.learningProgressId}`).then(res => { |
||||
this.getProgress() |
||||
}).catch(res => {}) : |
||||
this.$post(this.api.saveLearningProgress, { |
||||
cid: this.courseId, |
||||
projectId: item.projectId, |
||||
}).then(res => { |
||||
this.getProgress() |
||||
}).catch(res => {}) |
||||
}, |
||||
// 跳转试用体验 |
||||
toTrail() { |
||||
window.open('https://f.wps.cn/g/VekixBcm/') |
||||
}, |
||||
// 跳转实验台 |
||||
toStation() { |
||||
this.$post(`${this.api.addLearningRecord}?mallId=${this.id}`).then(res => { |
||||
this.$router.push('/station/preview?courseId=' + this.form.mall.associatedProduct + '&curriculumName=' + this.form.mall.associatedProductName) |
||||
}).catch(res => {}) |
||||
}, |
||||
// 热门产品 |
||||
getHot() { |
||||
this.$post(this.api.listOfGoods, { |
||||
hotTag: 1, |
||||
sort: 1, |
||||
pageNum: 1, |
||||
pageSize: 2, |
||||
}).then(({ page }) => { |
||||
this.hots = page.records |
||||
}).catch(res => {}) |
||||
}, |
||||
// 跳转详情 |
||||
toDetail(id) { |
||||
this.$router.push(`show?id=${id}`); |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.wrap { |
||||
background: #F3F6FA; |
||||
.inner { |
||||
width: 1154px; |
||||
margin: 0 auto; |
||||
} |
||||
.top { |
||||
display: flex; |
||||
padding: 24px; |
||||
background-color: #fff; |
||||
border-radius: 10px; |
||||
.pics { |
||||
width: 436px; |
||||
margin-right: 24px; |
||||
img { |
||||
width: 140px; |
||||
height: 62px; |
||||
margin-right: 8px; |
||||
border-radius: 8px; |
||||
&:first-child { |
||||
width: 100%; |
||||
height: 192px; |
||||
margin-bottom: 12px; |
||||
} |
||||
&:last-child { |
||||
margin-right: 0; |
||||
} |
||||
} |
||||
} |
||||
.right { |
||||
width: 646px; |
||||
} |
||||
h6 { |
||||
font-size: 24px; |
||||
font-weight: 600; |
||||
color: #2E2D31; |
||||
} |
||||
.meta { |
||||
margin: 10px 0; |
||||
font-size: 12px; |
||||
color: #2E2D31; |
||||
.val { |
||||
color: #007EFF; |
||||
} |
||||
} |
||||
.des { |
||||
margin-bottom: 15px; |
||||
font-size: 14px; |
||||
color: #666; |
||||
line-height: 20px; |
||||
} |
||||
.field { |
||||
font-size: 14px; |
||||
color: #2E2D31; |
||||
.label { |
||||
color: #333; |
||||
} |
||||
} |
||||
.fields { |
||||
display: flex; |
||||
margin: 10px 0 20px; |
||||
.field { |
||||
margin-right: 50px; |
||||
&:last-child { |
||||
margin-right: 0; |
||||
} |
||||
} |
||||
} |
||||
.btn { |
||||
width: 119px; |
||||
height: 46px; |
||||
color: #fff; |
||||
background: #64C25A; |
||||
border-radius: 6px; |
||||
border: 0; |
||||
cursor: pointer; |
||||
&:hover { |
||||
opacity: .9; |
||||
} |
||||
&:first-child { |
||||
margin-left: 11px; |
||||
} |
||||
} |
||||
.entry { |
||||
background: #007EFF; |
||||
} |
||||
} |
||||
.tab { |
||||
display: inline-flex; |
||||
li { |
||||
position: relative; |
||||
margin-right: 20px; |
||||
font-size: 18px; |
||||
line-height: 25px; |
||||
color: #0B1D30; |
||||
cursor: pointer; |
||||
&:after { |
||||
content: ''; |
||||
position: absolute; |
||||
bottom: -10px; |
||||
left: 50%; |
||||
width: 53px; |
||||
height: 4px; |
||||
transform: translateX(-50%); |
||||
} |
||||
&.active:after { |
||||
background-color: #007EFF; |
||||
} |
||||
} |
||||
} |
||||
.course { |
||||
display: flex; |
||||
margin-top: 20px; |
||||
.detail { |
||||
width: 835px; |
||||
padding: 20px 36px; |
||||
background-color: #fff; |
||||
border-radius: 10px; |
||||
|
||||
} |
||||
} |
||||
.courses { |
||||
margin-top: 40px; |
||||
h6 { |
||||
margin-bottom: 20px; |
||||
font-size: 14px; |
||||
color: #333; |
||||
} |
||||
.list { |
||||
height: calc(100vh - 530px); |
||||
padding-right: 15px; |
||||
overflow: auto; |
||||
li { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
height: 46px; |
||||
border-radius: 8px; |
||||
&:hover { |
||||
background: #F6FBFF; |
||||
} |
||||
} |
||||
.name { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
font-size: 14px; |
||||
color: #333; |
||||
img { |
||||
margin-right: 8px; |
||||
} |
||||
} |
||||
.status { |
||||
font-size: 18px; |
||||
color: #00c935; |
||||
} |
||||
.circle { |
||||
width: 18px; |
||||
height: 18px; |
||||
border-radius: 50%; |
||||
border: 1px solid #ccc; |
||||
} |
||||
} |
||||
} |
||||
.products { |
||||
width: 270px; |
||||
margin-left: 24px; |
||||
&>h6 { |
||||
font-size: 14px; |
||||
color: #0B1D30; |
||||
} |
||||
} |
||||
.product { |
||||
margin-top: 11px; |
||||
li { |
||||
position: relative; |
||||
margin-bottom: 15px; |
||||
cursor: pointer; |
||||
border-radius: 10px; |
||||
background-color: #fff; |
||||
transition: all 0.3s; |
||||
overflow: hidden; |
||||
img { |
||||
width: 100%; |
||||
height: 140px; |
||||
transition: .3s; |
||||
} |
||||
.my-school { |
||||
position: absolute; |
||||
top: 0; |
||||
right: 0; |
||||
width: 57px; |
||||
height: 22px; |
||||
} |
||||
.texts { |
||||
padding: 10px; |
||||
} |
||||
.title { |
||||
margin-bottom: 10px; |
||||
color: #0B1D30; |
||||
font-size: 14px; |
||||
font-weight: 600; |
||||
word-wrap: break-word; |
||||
word-break: break-all; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
white-space: nowrap; |
||||
} |
||||
.desc { |
||||
min-height: 34px; |
||||
color: #757F92; |
||||
font-size: 12px; |
||||
display: -webkit-box; |
||||
-webkit-box-orient: vertical; |
||||
-webkit-line-clamp: 2; |
||||
overflow: hidden; |
||||
&.ie { |
||||
height: 80px; |
||||
text-overflow: ellipsis; |
||||
white-space: nowrap; |
||||
} |
||||
} |
||||
.tag { |
||||
margin-right: 8px; |
||||
color: #007EFF; |
||||
background-color: #F9F9F9; |
||||
border: 0; |
||||
} |
||||
.type { |
||||
display: inline-block; |
||||
padding: 4px 11px; |
||||
font-size: 12px; |
||||
color: #666; |
||||
border: 1px solid #DADADA; |
||||
border-radius: 20px; |
||||
} |
||||
.metas { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
margin-top: 10px; |
||||
} |
||||
.meta { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
color: #B5BFD5; |
||||
font-size: 12px; |
||||
.icon { |
||||
width: 14px; |
||||
max-height: 14px; |
||||
margin-right: 3px; |
||||
} |
||||
} |
||||
&:hover { |
||||
box-shadow: 0px 5px 12px 4px rgba(142, 123, 253, 0.09), 0px 3px 6px 0px rgba(142, 123, 253, 0.12), 0px 1px 2px -2px rgba(142, 123, 253, 0.16); |
||||
img { |
||||
transform: scale(1.05); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |