415 lines
11 KiB
Vue
415 lines
11 KiB
Vue
<template>
|
|
<view class="main-content">
|
|
<headers :showBack="false" :themeType="true">
|
|
<view class="top-diy">
|
|
<view class="headerBack" @click="returnBack">
|
|
<u-icon name="arrow-left" color="#ffffff" size="40"></u-icon>
|
|
</view>
|
|
<text>学习详情</text>
|
|
</view>
|
|
</headers>
|
|
<view class="video rules" v-show="videoList.length || dataList.length">
|
|
<view class="rules-box" v-for="(item,index) in dataList" :key="item.url">
|
|
<image :src="item.url" v-if="fileTypeCondition(item.url)"></image>
|
|
<image src="../../../../static/images.png" v-else></image>
|
|
<view>
|
|
<view class="rules-text1">
|
|
<text>{{item.name}}</text>
|
|
</view>
|
|
<view class="rules-text2" @click="downLoadFile(item,2,index)">
|
|
<text>下载预览</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<video v-for="(item,index) in videoList" :key="index" id="myVideo" class="disable-progress"
|
|
style="width: 100%;height: 390rpx;" :muted="false" :show-mute-btn="true" :src="item.url"
|
|
:enable-progress-gesture="false" :controls="item.controlsBool" @play="videoStart(index)"
|
|
@ended="videoEnd(index)">
|
|
</video>
|
|
<!-- <swiper circular :indicator-dots="false" indicator-color="rgba(99, 99, 99, 1)"
|
|
style="width: 100%;height: 390rpx;">
|
|
<swiper-item v-for="(item,index) in videoList" :key="index" style="width: 100%;height: 390rpx;">
|
|
<video id="myVideo" class="disable-progress" style="width: 100%;height: 390rpx;"
|
|
:muted="true" :show-mute-btn="true" :src="item.url" :enable-progress-gesture="false"
|
|
:controls="item.controlsBool" @play="videoStart(index)" @ended="videoEnd(index)">
|
|
</video>
|
|
</swiper-item>
|
|
</swiper> -->
|
|
</view>
|
|
<view class="studybox" v-if="videoList.length || dataList.length">
|
|
<view class="studybox-line"></view>
|
|
<view class="studybox-text1">
|
|
<!-- <text>安全教育——视频</text> -->
|
|
<text>{{responseData.courseName}}</text>
|
|
</view>
|
|
</view>
|
|
<!-- || pageData.examCount<=0 -->
|
|
<button type="primary" :disabled="isStartExam" class="btn" @click="goHiidden"
|
|
v-if="pageData.examPaperId">开始考试</button>
|
|
<levitatedsphere :x="100" :y="80"></levitatedsphere>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import levitatedsphere from "@/components/levitatedsphere/levitatedsphere.vue"
|
|
export default {
|
|
data() {
|
|
return {
|
|
videoUrl: "",
|
|
videoList: [],
|
|
dataList: [],
|
|
pageData: {},
|
|
videoStartTime: "",
|
|
userInfo: "",
|
|
responseData: {},
|
|
isPageLength: 0,
|
|
startFlag: true,
|
|
// isStartExam: false
|
|
}
|
|
},
|
|
computed: {
|
|
isStartExam() {
|
|
const videoEvery = this.videoList.every(item => item.isVideoOver && item.controlsBool);
|
|
const dataEvery = this.dataList.every(item => item.isFileOver);
|
|
console.log('计算属性执行了', this.videoList, this.dataList, videoEvery, dataEvery)
|
|
if(this.startFlag){
|
|
this.videoStartTime = this.$formatDates(new Date().getTime(), 'yyyy-MM-dd HH:mm:ss');
|
|
this.startFlag = false;
|
|
}
|
|
console.log(dataEvery, videoEvery, (this.videoList.length > 0 || this.dataList > 0))
|
|
if(dataEvery && videoEvery && (this.videoList.length > 0 || this.dataList > 0)){
|
|
let requestData = {
|
|
workerId: this.userInfo.id,
|
|
trainId: this.pageData.trainId,
|
|
beginTime: this.videoStartTime,
|
|
endTime: this.$formatDates(new Date().getTime(), 'yyyy-MM-dd HH:mm:ss')
|
|
}
|
|
this.sendRequest({
|
|
url: "xmgl/workerExam/submitStudy",
|
|
data: requestData,
|
|
method: 'post',
|
|
success(res) {}
|
|
})
|
|
}
|
|
|
|
return !(videoEvery && dataEvery);
|
|
}
|
|
},
|
|
onReady: function(res) {
|
|
// #ifndef MP-ALIPAY
|
|
// this.videoContext = uni.createVideoContext('myVideo')
|
|
// #endif
|
|
},
|
|
onLoad(options) {
|
|
this.userInfo = JSON.parse(uni.getStorageSync("userInfo"))
|
|
this.pageData = JSON.parse(options.transportData)
|
|
console.log(this.pageData)
|
|
this.getDataFn();
|
|
},
|
|
onShow() {
|
|
// 刷新页面
|
|
this.$forceUpdate();
|
|
},
|
|
methods: {
|
|
fileTypeCondition(file) {
|
|
// 获取文件后缀名
|
|
const extension = file.substring(file.lastIndexOf('.') + 1).toLowerCase();
|
|
|
|
// 常见的图片文件后缀名
|
|
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
|
|
|
|
// 检查文件后缀名是否在图片后缀名数组中
|
|
return imageExtensions.includes(extension);
|
|
},
|
|
downLoadFile(val, type, index) {
|
|
// let url = this.url_config + 'image/' + val.logoUrl
|
|
let that = this;
|
|
let url = val.url
|
|
console.log(val)
|
|
uni.showLoading({
|
|
icon: 'loading',
|
|
title: '下载中...'
|
|
});
|
|
uni.downloadFile({
|
|
url: url,
|
|
success: function(res) {
|
|
var filePath = res.tempFilePath;
|
|
// if (type == 1) {
|
|
// //文件保存到本地
|
|
// console.log(navigator && navigator.userAgent && /Mobi|Android|iPhone/i.test(navigator.userAgent))
|
|
// if(navigator && navigator.userAgent && /Mobi|Android|iPhone/i.test(navigator.userAgent)){
|
|
// console.log("111")
|
|
// window.open(filePath, "_blank");
|
|
// return
|
|
// }
|
|
// console.log("222")
|
|
// return
|
|
// uni.saveFile({
|
|
// tempFilePath: filePath, //临时路径
|
|
// success: function(res) {
|
|
// uni.showToast({
|
|
// icon: 'none',
|
|
// mask: true,
|
|
// title: '文件已保存:' + res.savedFilePath, //保存路径
|
|
// duration: 3000,
|
|
// });
|
|
// setTimeout(() => {
|
|
// //打开文档查看
|
|
// uni.openDocument({
|
|
// filePath: res.savedFilePath,
|
|
// success: function(res) {
|
|
// // console.log('打开文档成功');
|
|
// }
|
|
// });
|
|
// }, 3000)
|
|
// }
|
|
// });
|
|
// } else
|
|
if (type == 2) {
|
|
uni.openDocument({
|
|
filePath: filePath,
|
|
success: function(res) {
|
|
console.log('打开文档成功');
|
|
uni.hideLoading();
|
|
that.dataList[index].isFileOver = true;
|
|
console.log(that.dataList);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
},
|
|
returnBack() {
|
|
uni.navigateTo({
|
|
url: '../index/index'
|
|
})
|
|
},
|
|
videoStart(index) {
|
|
|
|
},
|
|
videoEnd(index) {
|
|
var that = this
|
|
// 判断是否可以开始考试,需要视频全部看完
|
|
that.videoList[index].isVideoOver = true;
|
|
that.videoList[index].controlsBool = true;
|
|
// 尝试多次刷新视图
|
|
that.$forceUpdate();
|
|
setTimeout(function() {
|
|
that.$forceUpdate();
|
|
}, 500)
|
|
// let startExamBool = true;
|
|
// that.videoList.map(item => {
|
|
// if (!item.isVideoOver) {
|
|
// startExamBool = false;
|
|
// }
|
|
// })
|
|
// if (!startExamBool) {
|
|
// that.isStartExam = true;
|
|
// } else {
|
|
// that.isStartExam = false;
|
|
// }
|
|
|
|
},
|
|
getDataFn() {
|
|
var that = this
|
|
let requestData = {
|
|
courseId: this.pageData.courseId
|
|
}
|
|
this.sendRequest({
|
|
url: "xmgl/workerExam/queryCourse",
|
|
data: requestData,
|
|
method: 'post',
|
|
success(res) {
|
|
console.log('试题信息', res)
|
|
if (res.result) {
|
|
that.responseData = res.result;
|
|
const result = res.result.fileUrl ? JSON.parse(res.result.fileUrl) : [];
|
|
that.videoList = result.filter(item => item.url.substring(item.url.lastIndexOf(".") +
|
|
1) == "mp4");
|
|
that.dataList = result.filter(item => item.url.substring(item.url.lastIndexOf(".") +
|
|
1) != "mp4");
|
|
console.log(result, that.videoList, that.dataList);
|
|
// that.videoList
|
|
// dataList
|
|
// if (that.videoList.length) {
|
|
// that.isStartExam = true;
|
|
// that.videoUrl = that.videoList[0].url
|
|
// }
|
|
that.trainRecordId();
|
|
console.log(that.src)
|
|
}
|
|
}
|
|
})
|
|
},
|
|
videoErrorCallback: function(e) {
|
|
uni.showModal({
|
|
content: e.target.errMsg,
|
|
showCancel: false
|
|
})
|
|
},
|
|
trainRecordId() {
|
|
var that = this
|
|
const devInfoList = uni.getStorageSync('devInfoList')
|
|
let requestData = {
|
|
pageNo: 1,
|
|
pageSize: 10,
|
|
number: 1,
|
|
trainId: this.pageData.trainId,
|
|
workerCard: devInfoList.idCard,
|
|
projectSn: devInfoList.projectSn,
|
|
}
|
|
this.sendRequest({
|
|
url: "exam/courseRecord/page",
|
|
data: requestData,
|
|
method: 'post',
|
|
success(res) {
|
|
if (res.code == 200) {
|
|
that.isPageLength = Array.isArray(res.result.records) ? res.result.records.length : 0;
|
|
console.log(22222, res.result.records.length, that.isPageLength);
|
|
const isPageFlag = that.isPageLength > 0 ? true : false;
|
|
console.log(isPageFlag);
|
|
that.dataList.map(item => {
|
|
that.$set(item,'isFileOver',isPageFlag)
|
|
})
|
|
that.videoList.map(item => {
|
|
that.$set(item,'isVideoOver',isPageFlag)
|
|
that.$set(item,'controlsBool',isPageFlag)
|
|
})
|
|
}
|
|
}
|
|
})
|
|
},
|
|
goHiidden() {
|
|
var that = this
|
|
let requestData = {
|
|
id: this.pageData.trainRecordId
|
|
}
|
|
this.sendRequest({
|
|
url: "xmgl/workerExam/startExam",
|
|
data: requestData,
|
|
method: 'post',
|
|
success(res) {
|
|
if (res.code == 200) {
|
|
uni.navigateTo({
|
|
url: '../beginexam/beginexam?transportData=' + JSON.stringify(that
|
|
.pageData)
|
|
});
|
|
}
|
|
}
|
|
})
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.main-content {
|
|
height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
|
|
.top-diy {
|
|
height: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
position: relative;
|
|
|
|
.headerBack {
|
|
position: absolute;
|
|
left: 3%;
|
|
}
|
|
}
|
|
|
|
.video {
|
|
width: 100%;
|
|
|
|
:deep() {
|
|
.uni-video-ball {
|
|
display: none !important;
|
|
}
|
|
}
|
|
}
|
|
|
|
// #myVideo {
|
|
// width: 100%;
|
|
// height: 386.25rpx;
|
|
// position: relative;
|
|
// }
|
|
|
|
.studybox {
|
|
height: 170rpx;
|
|
background: #FFFFFF;
|
|
box-shadow: 18rpx 8rpx 16rpx 4rpx rgba(168, 193, 255, 0.17);
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.studybox-line {
|
|
width: 14rpx;
|
|
height: 100%;
|
|
background: #4B8DEC;
|
|
}
|
|
|
|
.studybox-text1 {
|
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
|
font-weight: 500;
|
|
font-size: 40rpx;
|
|
color: #000000;
|
|
margin-left: 40rpx;
|
|
}
|
|
}
|
|
|
|
.btn {
|
|
margin: 159.62rpx 40.38rpx;
|
|
}
|
|
}
|
|
|
|
.rules {
|
|
box-shadow: 4rpx 4rpx 8rpx 2rpx rgba(81, 129, 246, 0.12);
|
|
// height: calc(100vh - 270rpx);
|
|
// padding-bottom: 60rpx;
|
|
// overflow-y: scroll;
|
|
}
|
|
|
|
.rules-box {
|
|
display: flex;
|
|
padding: 13.46rpx 28.85rpx 17.31rpx 23.08rpx;
|
|
border-top: 2rpx solid #D8DBE8;
|
|
}
|
|
|
|
.rules-box image {
|
|
width: 61.15rpx;
|
|
height: 70.77rpx;
|
|
}
|
|
|
|
.rules-box>view {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
flex: 1;
|
|
}
|
|
|
|
.rules-text1 {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
margin-left: 13.46rpx;
|
|
}
|
|
|
|
.rules-text1>text {
|
|
font-size: 25rpx;
|
|
line-height: 40rpx;
|
|
}
|
|
|
|
.rules-text2 {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
color: #5181F6;
|
|
font-size: 19.23rpx;
|
|
white-space: nowrap;
|
|
|
|
>text:last-child {
|
|
margin-left: 10rpx;
|
|
}
|
|
}
|
|
</style> |