qa-deu-tv/pages/curriculum/details.vue

523 lines
14 KiB
Vue
Raw Normal View History

2024-12-13 08:38:32 +08:00
<template>
<view class="container">
<unitv-page
id="curriculumDetailsPage"
ref="curriculumDetailsPage"
class="curriculumDetailsPage"
:show="true"
>
<app-header down="curriculum_details_first_zone" />
<view class="curriculumInfo">
<view class="info">
<view class="curriculumName">
{{ curriculumInfo.curriculumName }}
</view>
<view class="introduction line-3">
{{ curriculumInfo.introduction }}
</view>
<unitv-zone
id="curriculum_details_first_zone"
class="curriculum_details_first_zone"
up="header_zone"
down="curriculum_details_second_zone"
:values="[0, 1]"
:column="2"
>
<unitv-item :item="0" class="item trySee" @click="fnFullScreen">
<view class="icon">
<image src="/static/bofang.png" />
</view>
<view class="text">全屏试看</view>
</unitv-item>
<unitv-item :item="1" class="item buy" @click="fnBuy">
<view class="price">{{ curriculumInfo.price }}</view>
<view class="text">购买课程</view>
</unitv-item>
</unitv-zone>
</view>
<view v-if="!video.url" class="cover">
<image :src="curriculumInfo.cover" mode="widthFix" />
</view>
<view v-if="video.url && !isFullScreen" class="cover">
<unitv-video
id="player"
:src="video.url"
:title="video.title"
:initial-time="video.time"
@timeupdate="fnTimeupdate"
/>
</view>
</view>
<view class="chapter">
<view class="main_title">
<text>章节</text>
<text class="current">{{ currentChapterInfo.name }}</text>
</view>
<unitv-zone
id="curriculum_details_second_zone"
:key="currentChapterIndex"
class="curriculum_details_second_zone"
up="curriculum_details_first_zone"
down="curriculum_details_third_zone"
:values="currentChapterInfo.nodes"
:column="currentChapterInfo.nodes.length"
>
<unitv-scroll>
<view class="scroll">
<unitv-item
v-for="(item, index) in currentChapterInfo.nodes"
:key="index"
:item="index"
class="item"
@click="fnPlayVideo(item)"
>
<view class="text">{{ item.coursewareName }}</view>
</unitv-item>
</view>
</unitv-scroll>
</unitv-zone>
<unitv-zone
id="curriculum_details_third_zone"
class="curriculum_details_third_zone"
up="curriculum_details_second_zone"
down="curriculum_details_fourth_zone"
:values="chapterList"
:column="chapterList.length"
auto-fous
:item="0"
>
<unitv-scroll>
<view class="scroll">
<unitv-item
v-for="(item, index) in chapterList"
:key="index"
:item="index"
class="item"
@click="fnClickChapterItem"
>
<view class="text">{{ item.name }}</view>
<view
v-if="index !== chapterList.length - 1"
class="border_right"
/>
<view class="border_bottom" />
</unitv-item>
</view>
</unitv-scroll>
</unitv-zone>
</view>
<view class="recommend_curriculum">
<view class="main_title">为你推荐</view>
<unitv-zone
id="curriculum_details_fourth_zone"
class="curriculum_details_fourth_zone"
up="curriculum_details_third_zone"
:values="recommendCurriculumList"
:column="recommendCurriculumList.length"
>
<unitv-scroll>
<view class="scroll">
<unitv-item
v-for="(item, index) in recommendCurriculumList"
:key="index"
:item="index"
class="item"
@click="fnSwitchCurriculum"
>
<image :src="item.img" mode="widthFix" />
<view class="title line-1">{{ item.title }}</view>
</unitv-item>
</view>
</unitv-scroll>
</unitv-zone>
</view>
</unitv-page>
</view>
</template>
<script>
import chapterList from "./chapterList";
export default {
data() {
return {
curriculumInfo: {
curriculumName: "气体基础知识",
introduction:
"气体是指无形状有体积的可压缩和膨胀的流体。气体是物质的一个态,气体与液体一样是流体:它可以流动,可变形。与液体不同的是气体气体分子间距离很大,可以被压缩膨胀。假如没有限制(容器或力场)的话,气体可以膨胀,其体积不受限制。气态物质的原子或分子相互之间可以自由运动。气态物质的原子或分子的动能比较高。 气体形态可通过其体积、温度和其压强所影响。这几项要素构成了多项气体定律,而三者之间又可以互相影响。",
cover: require("../../static/public_images/video_bg1.jpg"),
price: "123",
},
video: {
url: "",
title: "",
time: 0,
},
chapterList,
currentChapterIndex: 0,
currentChapterInfo: {},
recommendCurriculumList: [],
videoContext: null,
isFullScreen: false,
};
},
onShow() {
if (this.$refs.curriculumDetailsPage) {
this.$refs.curriculumDetailsPage.showPage();
if (this.videoContext) {
this.videoContext.play();
}
}
},
onHide() {
this.videoContext && this.videoContext.pause();
},
onLoad() {
this.fnInitCurrentChapter();
this.fnGetRecommendCurriculum();
},
methods: {
fnInitCurrentChapter() {
this.currentChapterInfo = this.chapterList[this.currentChapterIndex];
},
fnClickChapterItem(event) {
this.currentChapterIndex = event;
this.fnInitCurrentChapter();
},
async fnGetRecommendCurriculum() {
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg1.jpg`),
title: "气体基础知识",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg2.jpg`),
title: "现场一线员工全面安全培训",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg3.jpg`),
title: "出差人员基础安全知识与应急处置",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg4.jpg`),
title: "现场安全负责人全面安全培训",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg5.jpg`),
title: "《四川省安全生产条例》特色解读",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg6.jpg`),
title: "企业贯彻落实《四川省安全生产条例》精要",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg7.jpg`),
title: "《四川省安全生产举报奖励办法》解读",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg8.jpg`),
title: "应急管理部关于进一步加强安全生产举报工作的指导意见",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg9.jpg`),
title: "危险货物运输包装-气瓶",
});
this.recommendCurriculumList.push({
img: require(`../../static/public_images/video_bg10.jpg`),
title: "职业病危害专项治理",
});
},
async fnPlayVideo(item) {
this.video.url = "";
await this.$nextTick();
this.video.url = item.url;
this.video.title = item.coursewareName;
this.video.time = 0;
await this.$nextTick();
!this.videoContext &&
(this.videoContext = uni.createVideoContext("player"));
},
fnTimeupdate(time) {
this.video.time = time;
},
fnFullScreen() {
this.isFullScreen = true;
this.videoContext = null;
const { url, time, title } = this.video;
uni.navigateTo({
url: `/pages/curriculum/play?url=${url}&title=${title}&time=${time}`,
animationType: "none",
events: {
timeupdate: async ({ time }) => {
this.isFullScreen = false;
this.video.time = time;
await this.$nextTick();
!this.videoContext &&
(this.videoContext = uni.createVideoContext("player"));
},
},
});
},
fnBuy() {
uni.navigateTo({ url: "/pages/curriculum/buy" });
},
fnSwitchCurriculum() {
uni.redirectTo({
url: "/pages/curriculum/details",
});
},
},
};
</script>
<style scoped lang="scss">
.container {
.curriculumInfo {
margin-top: 10rpx;
display: flex;
.info {
flex: 1;
.curriculumName {
font-size: 18rpx;
font-weight: bold;
}
.introduction {
font-size: 12rpx;
padding-top: 5rpx;
}
.curriculum_details_first_zone {
margin-top: 10rpx;
display: flex;
.trySee {
width: 53rpx;
height: 53rpx;
background: rgba(255, 255, 255, 0.1);
border-radius: 1rpx;
border: 1px solid rgba(207, 207, 247, 0.1);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.icon {
margin-bottom: 5rpx;
image {
width: 15rpx;
height: 18rpx;
}
}
.text {
font-size: 9rpx;
}
&.hover {
border: 1rpx solid rgba(0, 180, 255, 0.79);
}
}
.buy {
margin-left: 14rpx;
width: 53rpx;
height: 53rpx;
background-image: url("/static/buy_bg.png");
background-size: 100% 100%;
background-repeat: no-repeat;
border-radius: 1rpx;
text-align: center;
padding: 8rpx;
border: 1rpx solid transparent;
.price {
color: rgba(115, 62, 2, 1);
font-size: 14rpx;
font-weight: bold;
}
.text {
margin-top: 8rpx;
font-size: 9rpx;
color: rgba(85, 45, 0, 1);
font-weight: bold;
}
&.hover {
border: 1rpx solid rgba(0, 180, 255, 0.79);
}
}
}
}
.cover {
margin-left: 13rpx;
width: 343rpx;
height: 150rpx;
image {
width: 100%;
height: 100% !important;
}
}
}
.chapter {
margin-top: 10rpx;
.main_title {
font-size: 14rpx;
.current {
margin-left: 9rpx;
font-size: 9rpx;
}
}
.curriculum_details_second_zone {
margin-top: 5rpx;
.scroll {
display: flex;
white-space: nowrap;
.item {
margin-left: 10rpx;
padding: 5rpx 10rpx;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 1rpx;
&:first-child {
margin-left: 0;
}
.text {
font-size: 9rpx;
}
&.hover {
background-color: #254eff;
}
&.active {
background-color: rgba(37, 78, 255, 0.39);
}
}
}
}
.curriculum_details_third_zone {
margin-top: 5rpx;
.scroll {
display: flex;
white-space: nowrap;
.item {
display: flex;
align-items: center;
position: relative;
.border_right {
width: 1rpx;
background-color: #fff;
height: 10rpx;
}
.border_bottom {
width: 60%;
background-color: transparent;
height: 1rpx;
position: absolute;
left: 20%;
right: 20%;
bottom: 0;
}
&:first-child {
.text {
padding-left: 0;
}
.border_bottom {
left: calc(20% - 5rpx);
}
}
.text {
font-size: 9rpx;
border-bottom: 1rpx solid transparent;
padding: 5rpx 10rpx;
}
&.hover {
.border_bottom {
background-color: #254eff;
}
}
&.active {
.border_bottom {
background-color: #fff;
}
}
}
}
}
}
.recommend_curriculum {
margin-top: 10rpx;
.main_title {
font-size: 14rpx;
}
.curriculum_details_fourth_zone {
margin-top: 5rpx;
.scroll {
white-space: nowrap;
.item {
display: inline-block;
width: calc(18% - 20rpx);
height: 100rpx;
position: relative;
border: 2px solid transparent;
border-radius: 4rpx;
font-size: 0;
margin-left: 20rpx;
&:first-child {
margin-left: 0;
}
image {
width: 100%;
height: 100% !important;
border-radius: 4rpx;
}
.title {
width: 80%;
font-size: 9rpx;
color: #fff;
position: absolute;
bottom: 9rpx;
left: 7rpx;
}
&.hover {
border: 2rpx solid rgba(0, 180, 255, 0.79);
}
}
}
}
}
}
</style>