yangzj 2 роки тому
батько
коміт
f8c2612f0c

+ 52 - 52
h5_web/pages/basicTraining/onlineTrainingDetails/onlineTrainingDetails.vue

@@ -1,10 +1,12 @@
 <template>
 	<view class="details">
-		<u-navbar back-text="" title="" back-icon-color="#FFFFFF" :background="{ background: '#3D5D4C' }" :border-bottom="false"></u-navbar>
+		<u-navbar back-text="" title="" back-icon-color="#FFFFFF" :background="{ background: '#3D5D4C' }"
+			:border-bottom="false"></u-navbar>
 		<!-- 视频 -->
 		<view class="details-video" v-if="isPaly">
 			<video class="details-video-con" id="myVideo" @timeupdate="timeUpdate" :src="videoInfo.videoUrl" controls
-				:initial-time="initial_time" object-fit="fill" play-btn-position="center" @tap="videoClick">
+				:initial-time="initial_time" object-fit="fill" play-btn-position="center" @tap="videoClick"
+				@loadedmetadata="loadedmetadata">
 				<cover-view class="video-control">
 					<cover-view class="multi rate" @tap.stop="showSwitchRate">x {{ currentRate }}</cover-view>
 				</cover-view>
@@ -122,30 +124,29 @@
 					starLevel: 0,
 					content: ''
 				},
-				currentDuration: 0
+				currentDuration: 0,
+				duration: 0
 			}
 		},
 		onLoad(page) {
 			if (page.id) {
 				this.getClassesDetails(page.id);
 				this.classesId = page.id
+				this.query.tabId = this.classesId
+				this.form.tabId = this.classesId
 			}
 		},
 		beforeDestroy() {
-			let playDuration = this.video_real_time;
-			if (this.videoInfo.playDuration > this.video_real_time) {
-				this.currentDuration = this.video_real_time;
-				playDuration = this.videoInfo.playDuration
-			} else {
-				this.currentDuration = this.video_real_time
-			}
-			this.submitTimeLong({
-				tabId: this.videoInfo.id,
-				playDuration: playDuration,
-				currentDuration: this.currentDuration
-			}, 0, true)
+			this.confirmSubmitDuration();
 		},
 		methods: {
+			/**
+			 * 获取视频总时长
+			 * @param {Object} data
+			 */
+			loadedmetadata(data) {
+				this.duration = data.detail.duration;
+			},
 			/**
 			 * 显示倍速浮层
 			 * @param {Object} rate
@@ -186,8 +187,6 @@
 						this.initial_time = Number(res.data.chapterList[this.videoIndex].currentDuration)
 						this.video_real_time = Number(res.data.chapterList[this.videoIndex].playDuration)
 						this.playedTime = Number(res.data.chapterList[this.videoIndex].playDuration)
-						this.query.tabId = res.data.chapterList[this.videoIndex].id
-						this.form.tabId = res.data.chapterList[this.videoIndex].id
 						this.query.pageNum = 1;
 						this.isPaly = true
 						this.getCommentList();
@@ -207,9 +206,10 @@
 				} else {
 					this.currentDuration = this.video_real_time
 				}
-				this.submitTimeLong ({
+				this.submitTimeLong({
 					tabId: this.videoInfo.id,
 					playDuration: playDuration,
+					duration: this.duration,
 					currentDuration: this.currentDuration
 				}, index);
 			},
@@ -218,44 +218,29 @@
 			 * @param {Object} e
 			 */
 			timeUpdate(e) {
-				let isReady = 1; // 是否开启可以视频快进 1 禁止开启
-				if (this.videoInfo.finishPercent === 100) {
-					isReady = 3;
-				}
-				//跳转到指定播放位置 initial-time 时间为秒
-				let that = this;
 				//播放的总时长
-				let duration = e.detail.duration
+				let duration = e.detail.duration;
 				//实时播放进度 秒数
-				let currentTime = parseInt(e.detail.currentTime)
+				let jumpTime = parseInt(e.detail.currentTime);
 				//当前视频进度
-				let jump_time = 0
-				if (that.video_real_time == 0) {
-					jump_time = parseInt(that.initial_time) + parseInt(that.video_real_time)
+				if (jumpTime - this.playedTime > 3) {
+					// 差别过大,调用seek方法跳转到实际观看时间
+					this.videoContext.seek(this.playedTime);
+					wx.showToast({
+						title: '未完整看完该视频,不能快进',
+						icon: 'none',
+						duration: 2000
+					});
 				} else {
-					jump_time = parseInt(that.video_real_time)
-				}
-				console.log('jump_time', jump_time)
-				console.log('that.initial_time', that.initial_time)
-				console.log('this.playedTime', this.playedTime)
-				console.log('that.video_real_time', that.video_real_time)
-				if (jump_time > this.playedTime) {
-					isReady = 1;
-				} else {
-					isReady = 3;
-				}
-				if(isReady === 1){
-					if (currentTime > jump_time && currentTime - jump_time > 3) {
-						let videoContext = wx.createVideoContext('myVideo')
-						videoContext.seek(that.video_real_time)
-						wx.showToast({
-							title: '未完整看完该视频,不能快进',
-							icon: 'none',
-							duration: 2000,
-						})
+					this.video_real_time = parseInt(e.detail.currentTime);
+					if (this.video_real_time > this.playedTime) {
+						this.playedTime = this.video_real_time;
 					}
 				}
-				that.video_real_time = currentTime //实时播放进度
+				if (parseInt(this.duration) !== 0 && parseInt(this.duration) === parseInt(this.video_real_time)) {
+					this.videoContext.pause();
+					this.confirmSubmitDuration()
+				}
 			},
 			/**
 			 * 提交课程时长
@@ -263,11 +248,13 @@
 			submitTimeLong({
 				tabId,
 				playDuration,
+				duration,
 				currentDuration
 			}, index, flag) {
 				this.$u.api.training.videoTimeLongApi({
 					tabId,
 					playDuration,
+					duration,
 					currentDuration
 				}).then(res => {
 					if (res.code === 200) {
@@ -277,8 +264,6 @@
 								type: 'success'
 							})
 							this.videoInfo = this.info.chapterList[index]
-							this.form.tabId = this.videoInfo.id
-							this.query.tabId = this.videoInfo.id
 							this.videoIndex = index
 							this.getClassesDetails(this.classesId);
 						}
@@ -342,6 +327,21 @@
 						type: 'warning'
 					})
 				}
+			},
+			confirmSubmitDuration() {
+				let playDuration = this.video_real_time;
+				if (this.videoInfo.playDuration > this.video_real_time) {
+					this.currentDuration = this.video_real_time;
+					playDuration = this.videoInfo.playDuration
+				} else {
+					this.currentDuration = this.video_real_time
+				}
+				this.submitTimeLong({
+					tabId: this.videoInfo.id,
+					playDuration: playDuration,
+					duration: this.duration,
+					currentDuration: this.currentDuration
+				}, 0, true)
 			}
 		}
 	}

+ 17 - 9
h5_web/pages/entrepreneurshipGuidelines/addPlan/addPlan.vue

@@ -129,19 +129,27 @@
 								url: this.config.uploadUrl,
 								filePath: temp,
 								header: {
-									Authorization: `Bearer ${vuex_token}`
+									Authorization: `Bearer ${this.vuex_token}`
 								},
 								success: res => {
-									const data = JSON.parse(res.data).data
-									if (data.suffix === 'pdf') {
-										this.fileList = [{
-											...data
-										}]
-										this.form.planBookUrl = data.url
-										this.form.planBookName = data.fileName
+									const data = JSON.parse(res.data)
+									if (data.code === 200) {
+										if (data.data.suffix === 'pdf') {
+											this.fileList = [{
+												...data.data
+											}]
+											this.form.planBookUrl = data.data.url
+											this.form.planBookName = data.data.fileName
+										} else {
+											uni.showToast({
+												title: '只能上传pdf文件',
+												duration: 2000
+											})
+										}
 									} else {
 										uni.showToast({
-											title: '只能上传pdf文件',
+											title: '文件上传失败!',
+											icon: 'none',
 											duration: 2000
 										})
 									}

+ 2 - 2
h5_web/pages/notification/notification.vue

@@ -39,7 +39,7 @@
 				],
 				tabValue: 2,
 				pageNum: 1, 
-				pageSize: 5,
+				pageSize: 10,
 				noticeList: []
 			}
 		},
@@ -84,7 +84,7 @@
 			tabChange(cur) {
 				this.current = cur
 				this.tabValue = this.tabList[cur].value;
-				this.getNoticeListByType(1, 5);
+				this.getNoticeListByType(1, 10);
 			},
 			/**
 			 * 下拉分页组件触发

+ 293 - 287
h5_web/pages/skillsTraining/courseDetailed/courseDetailed.vue

@@ -1,33 +1,19 @@
 <template>
 	<view class="details">
-		<u-navbar back-text="" title="" back-icon-color="#FFFFFF" :background="{ background: '#3D5D4C' }" :border-bottom="false"></u-navbar>
+		<u-navbar back-text="" title="" back-icon-color="#FFFFFF" :background="{ background: '#3D5D4C' }"
+			:border-bottom="false"></u-navbar>
 		<!-- 视频 -->
 		<view class="details-video" v-if="isPlay">
-			<video
-				class="details-video-con"
-				id="myVideo"
-				@timeupdate="timeUpdate"
-				:src="videoInfo.videoUrl"
-				controls
-				:initial-time="initial_time"
-				object-fit="fill"
-				play-btn-position="center"
-				@ended="ended"
-				@tap="videoClick"
-				@loadedmetadata="loadedmetadata"
-			>
+			<video class="details-video-con" id="myVideo" @timeupdate="timeUpdate" :src="videoInfo.videoUrl" controls
+				:initial-time="initial_time" object-fit="fill" play-btn-position="center" @ended="ended"
+				@tap="videoClick" @loadedmetadata="loadedmetadata">
 				<cover-view class="video-control">
 					<cover-view class="multi rate" @tap.stop="showSwitchRate">x {{ currentRate }}</cover-view>
 				</cover-view>
 				<cover-view class="multi-list rate" :class="{ active: rateShow }">
-					<cover-view
-						v-for="(item, index) in ['0.5', '1.0', '1.5', '2.0']"
-						:key="index"
-						class="multi-item rate"
-						:data-rate="item"
-						@tap="switchRate"
-						:class="{ active: item == currentRate }"
-					>
+					<cover-view v-for="(item, index) in ['0.5', '1.0', '1.5', '2.0']" :key="index"
+						class="multi-item rate" :data-rate="item" @tap="switchRate"
+						:class="{ active: item == currentRate }">
 						{{ item }}
 					</cover-view>
 				</cover-view>
@@ -36,7 +22,8 @@
 		<!-- 介绍 -->
 		<view class="details-content">
 			<view class="details-content-title">{{ videoInfo.chapterName }}</view>
-			<view class="details-content-progress">本课程 共{{ info.amount }}课,已学完{{ info.finishCount }}课,共进度{{ info.finishPercent || 0 }}%</view>
+			<view class="details-content-progress">本课程
+				共{{ info.amount }}课,已学完{{ info.finishCount }}课,共进度{{ info.finishPercent || 0 }}%</view>
 			<view class="details-content-teacher">主讲老师:{{ info.presenter }}</view>
 			<view class="details-content-info">{{ videoInfo.chapterInfo }}</view>
 		</view>
@@ -51,13 +38,16 @@
 				</view>
 			</view>
 			<view class="details-classes-list">
-				<view class="details-classes-list-item" v-for="(item, index) in info.chapterList" :key="index" :class="{ active: index === videoIndex }" @click="classesClick(index)">
+				<view class="details-classes-list-item" v-for="(item, index) in info.chapterList" :key="index"
+					:class="{ active: index === videoIndex }" @click="classesClick(index)">
 					<view>{{ index + 1 }}</view>
 					<view>{{ item.flag === 2 ? '已学' : item.finishPercent + '%' }}</view>
 				</view>
 			</view>
 		</view>
-		<view class="details-line"><view></view></view>
+		<view class="details-line">
+			<view></view>
+		</view>
 		<!-- 评论 -->
 		<view class="details-comment">
 			<view class="details-comment-header">
@@ -66,30 +56,34 @@
 			</view>
 			<view class="details-comment-list">
 				<view class="details-comment-list-item" v-for="(item, index) in commentList" :key="index">
-					<view class="left"><u-avatar :src="item.createByAvatar" size="96" mode="square"></u-avatar></view>
+					<view class="left">
+						<u-avatar :src="item.createByAvatar" size="96" mode="square"></u-avatar>
+					</view>
 					<view class="right">
 						<view>{{ item.createBy }}</view>
 						<view>
-							<u-rate :count="5" size="28" disabled="" active-color="#FFBC00" v-model="item.starLevel"></u-rate>
+							<u-rate :count="5" size="28" disabled="" active-color="#FFBC00" v-model="item.starLevel">
+							</u-rate>
 							<text>{{ item.createTime }}</text>
 						</view>
 						<view>{{ item.content }}</view>
 					</view>
 				</view>
 			</view>
-			<view class="details-comment-page" v-if="total"><wyb-pagination :padding="0" :totalItems="total" :current="query.pageNum" @change="pageChange" /></view>
+			<view class="details-comment-page" v-if="total">
+				<wyb-pagination :padding="0" :totalItems="total" :current="query.pageNum" @change="pageChange" />
+			</view>
 
 			<view class="details-comment-mine"><text>我的评论</text></view>
 
 			<view class="details-comment-conent">
-				<view class="details-comment-conent-star"><u-rate :count="5" size="40" active-color="#FFBC00" v-model="form.starLevel"></u-rate></view>
+				<view class="details-comment-conent-star">
+					<u-rate :count="5" size="40" active-color="#FFBC00" v-model="form.starLevel"></u-rate>
+				</view>
 				<view class="details-comment-content-textarea">
-					<u-input
-						v-model="form.content"
-						placeholder="请输入您的评价"
-						type="textarea"
-						:custom-style="{ backgroundColor: '#F5F5F5', padding: '30rpx', borderRadius: '10rpx', minHeight: '280rpx' }"
-					></u-input>
+					<u-input v-model="form.content" placeholder="请输入您的评价" type="textarea"
+						:custom-style="{ backgroundColor: '#F5F5F5', padding: '30rpx', borderRadius: '10rpx', minHeight: '280rpx' }">
+					</u-input>
 				</view>
 				<view class="details-comment-conent-button" @click="submitCommet">提交</view>
 			</view>
@@ -99,281 +93,293 @@
 </template>
 
 <script>
-import wybPagination from '@/components/wyb-pagination/wyb-pagination.vue';
-export default {
-	data() {
-		return {
-			info: {},
-			videoContext: uni.createVideoContext('myVideo', this),
-			videoInfo: {},
-			videoIndex: 0,
-			// 视频实时时间
-			initial_time: 0,
-			// 视频已经播放时间
-			playedTime: 0,
-			rateShow: false, // 倍速浮层
-			currentRate: 1.0, // 默认倍速
-			// 视频实际时间
-			video_real_time: 0,
-			classesId: '',
-			isPlay: true,
-			query: {
-				pageNum: 1,
-				pageSize: 5,
-				tabId: ''
-			},
-			total: 0,
-			commentList: [],
-			form: {
-				tabId: '',
-				starLevel: 0,
-				content: ''
-			},
-			currentDuration: 0,
-			duration: 0
-		};
-	},
-	onLoad(page) {
-		if (page.id) {
-			this.getClassesDetails(page.id);
-			this.classesId = page.id;
-		}
-	},
-	beforeDestroy() {
-		let playDuration = this.video_real_time;
-		if (this.videoInfo.playDuration > this.video_real_time) {
-			this.currentDuration = this.video_real_time;
-			playDuration = this.videoInfo.playDuration;
-		} else {
-			this.currentDuration = this.video_real_time;
-		}
-		this.submitTimeLong(
-			{
-				tabId: this.videoInfo.id,
-				playDuration: playDuration,
-				currentDuration: this.currentDuration,
-				duration: this.duration
-			},
-			0,
-			true
-		);
-	},
-	methods: {
-		/**
-		 * 获取视频总时长
-		 * @param {Object} data
-		 */
-		loadedmetadata(data) {
-			this.duration = data.detail.duration;
-		},
-		/**
-		 * 显示倍速浮层
-		 * @param {Object} rate
-		 */
-		showSwitchRate(rate) {
-			let that = this;
-			that.rateShow = true;
-		},
-		/**
-		 * 切换倍速
-		 * @param {Object} e
-		 */
-		switchRate(e) {
-			let that = this;
-			let rate = Number(e.currentTarget.dataset.rate);
-			that.currentRate = rate;
-			that.rateShow = false;
-			this.videoContext.playbackRate(rate);
-		},
-		/**
-		 * 视频点击
-		 * @param {Object} e
-		 */
-		videoClick(e) {
-			this.rateShow = false;
-		},
-		/**
-		 * 获取课程详情
-		 * @param {Object} id
-		 */
-		getClassesDetails(id) {
-			this.$u.api.school
-				.getPackageCourseDetail({
-					id
-				})
-				.then(res => {
-					if (res.code === 200) {
-						this.info = res.data;
-						this.videoInfo = res.data.chapterList[this.videoIndex];
-						this.initial_time = Number(res.data.chapterList[this.videoIndex].currentDuration);
-						this.video_real_time = Number(res.data.chapterList[this.videoIndex].playDuration);
-						this.playedTime = Number(res.data.chapterList[this.videoIndex].playDuration);
-						this.query.tabId = res.data.chapterList[this.videoIndex].id;
-						this.form.tabId = res.data.chapterList[this.videoIndex].id;
-						this.query.pageNum = 1;
-						this.isPlay = true;
-						this.getCommentList();
-					}
-				});
-		},
-		/**
-		 * 课程章节点击
-		 * @param {Object} index
-		 */
-		classesClick(index) {
-			this.isPlay = false;
-			let playDuration = this.video_real_time;
-			if (this.videoInfo.playDuration > this.video_real_time) {
-				this.currentDuration = this.video_real_time;
-				playDuration = this.videoInfo.playDuration;
-			} else {
-				this.currentDuration = this.video_real_time;
-			}
-			this.submitTimeLong(
-				{
-					tabId: this.videoInfo.id,
-					playDuration: playDuration,
-					duration: this.duration,
-					currentDuration: this.currentDuration
+	import wybPagination from '@/components/wyb-pagination/wyb-pagination.vue';
+	export default {
+		data() {
+			return {
+				info: {},
+				videoContext: uni.createVideoContext('myVideo', this),
+				videoInfo: {},
+				videoIndex: 0,
+				// 视频实时时间
+				initial_time: 0,
+				// 视频已经播放时间
+				playedTime: 0,
+				rateShow: false, // 倍速浮层
+				currentRate: 1.0, // 默认倍速
+				// 视频实际时间
+				video_real_time: 0,
+				classesId: '',
+				isPlay: true,
+				query: {
+					pageNum: 1,
+					pageSize: 5,
+					tabId: ''
 				},
-				index
-			);
+				total: 0,
+				commentList: [],
+				form: {
+					tabId: '',
+					starLevel: 0,
+					content: ''
+				},
+				currentDuration: 0,
+				duration: 0,
+				isApply: 1
+			};
 		},
-		/**
-		 * 控制视频不能快进
-		 * @param {Object} e
-		 */
-		timeUpdate(e) {
-			//播放的总时长
-			let duration = e.detail.duration;
-			//实时播放进度 秒数
-			let jumpTime = parseInt(e.detail.currentTime);
-			//当前视频进度
-			if (jumpTime - this.playedTime > 3) {
-				// 差别过大,调用seek方法跳转到实际观看时间
-				this.videoContext.seek(this.playedTime);
-				wx.showToast({
-					title: '未完整看完该视频,不能快进',
-					icon: 'none',
-					duration: 2000
-				});
-			} else {
-				this.video_real_time = parseInt(e.detail.currentTime);
-				if (this.video_real_time > this.playedTime) {
-					this.playedTime = this.video_real_time;
-				}
+		onLoad(page) {
+			if (page.id) {
+				this.getClassesDetails(page.id);
+				this.classesId = page.id;
+				this.query.tabId = this.classesId
+				this.form.tabId = this.classesId
+				this.isApply = page.isApply || 1
 			}
 		},
-		/**
-		 * 视频结束
-		 */
-		ended() {
-			// 用户把进度条拉到最后,但是实际观看时间不够,跳转回去会自动暂停。
-			// 这里加个判断。
-			if (this.playedTime < this.duration) {
-				this.videoContext.play();
-			}
+		beforeDestroy() {
+			this.confirmSubmitDuration();
 		},
-		/**
-		 * 提交课程时长
-		 */
-		submitTimeLong({ tabId, playDuration, currentDuration, duration }, index, flag) {
-			if (tabId) {
-				this.$u.api.training
-					.videoTimeLongApi({
-						tabId,
-						playDuration,
-						currentDuration,
-						duration
+		methods: {
+			/**
+			 * 获取视频总时长
+			 * @param {Object} data
+			 */
+			loadedmetadata(data) {
+				this.duration = data.detail.duration;
+			},
+			/**
+			 * 显示倍速浮层
+			 * @param {Object} rate
+			 */
+			showSwitchRate(rate) {
+				let that = this;
+				that.rateShow = true;
+			},
+			/**
+			 * 切换倍速
+			 * @param {Object} e
+			 */
+			switchRate(e) {
+				let that = this;
+				let rate = Number(e.currentTarget.dataset.rate);
+				that.currentRate = rate;
+				that.rateShow = false;
+				this.videoContext.playbackRate(rate);
+			},
+			/**
+			 * 视频点击
+			 * @param {Object} e
+			 */
+			videoClick(e) {
+				this.rateShow = false;
+			},
+			/**
+			 * 获取课程详情
+			 * @param {Object} id
+			 */
+			getClassesDetails(id) {
+				this.$u.api.school
+					.getPackageCourseDetail({
+						id
 					})
 					.then(res => {
 						if (res.code === 200) {
-							if (!flag) {
-								this.$refs.uToast.show({
-									title: '已记录章节时长!',
-									type: 'success'
-								});
-								this.videoInfo = this.info.chapterList[index];
-								this.form.tabId = this.videoInfo.id;
-								this.query.tabId = this.videoInfo.id;
-								this.videoIndex = index;
-								this.getClassesDetails(this.classesId);
-							}
-						} else {
-							this.$refs.uToast.show({
-								title: res.msg,
-								type: 'error'
-							});
+							this.info = res.data;
+							this.videoInfo = res.data.chapterList[this.videoIndex];
+							this.initial_time = Number(res.data.chapterList[this.videoIndex].currentDuration);
+							this.video_real_time = Number(res.data.chapterList[this.videoIndex].playDuration);
+							this.playedTime = Number(res.data.chapterList[this.videoIndex].playDuration);
+							this.query.pageNum = 1;
+							this.isPlay = true;
+							this.getCommentList();
 						}
 					});
-			}
-		},
-		/**
-		 * 获取评论列表
-		 */
-		getCommentList() {
-			if (this.query.tabId) {
-				this.$u.api.training.getClassesCommentApi(this.query).then(res => {
-					if (res.code === 200) {
-						this.total = Number(res.total);
-						this.commentList = res.rows;
+			},
+			/**
+			 * 课程章节点击
+			 * @param {Object} index
+			 */
+			classesClick(index) {
+				this.isPlay = false;
+				let playDuration = this.video_real_time;
+				if (this.videoInfo.playDuration > this.video_real_time) {
+					this.currentDuration = this.video_real_time;
+					playDuration = this.videoInfo.playDuration;
+				} else {
+					this.currentDuration = this.video_real_time;
+				}
+				this.submitTimeLong({
+						tabId: this.videoInfo.id,
+						playDuration: playDuration,
+						duration: this.duration,
+						currentDuration: this.currentDuration
+					},
+					index
+				);
+			},
+			/**
+			 * 控制视频不能快进
+			 * @param {Object} e
+			 */
+			timeUpdate(e) {
+				//播放的总时长
+				let duration = e.detail.duration;
+				//实时播放进度 秒数
+				let jumpTime = parseInt(e.detail.currentTime);
+				//当前视频进度
+				if (jumpTime - this.playedTime > 3) {
+					// 差别过大,调用seek方法跳转到实际观看时间
+					this.videoContext.seek(this.playedTime);
+					wx.showToast({
+						title: '未完整看完该视频,不能快进',
+						icon: 'none',
+						duration: 2000
+					});
+				} else {
+					this.video_real_time = parseInt(e.detail.currentTime);
+					if (this.video_real_time > this.playedTime) {
+						this.playedTime = this.video_real_time;
 					}
-				});
-			}
-		},
-		/**
-		 * @param {Object} e 分页触发
-		 */
-		pageChange(e) {
-			this.query.pageNum = e.current;
-			this.getCommentList();
-		},
-		/**
-		 * 提交评论
-		 */
-		submitCommet() {
-			if (this.form.tabId) {
-				if (this.form.starLevel && this.form.content) {
-					this.$u.api.training.addClassesCommentApi(this.form).then(res => {
+				}
+				if (parseInt(this.duration) !== 0 && parseInt(this.duration) === parseInt(this.video_real_time)) {
+					this.videoContext.pause();
+					this.confirmSubmitDuration();
+				}
+			},
+			/**
+			 * 视频结束
+			 */
+			ended() {
+				// 用户把进度条拉到最后,但是实际观看时间不够,跳转回去会自动暂停。
+				// 这里加个判断。
+				if (this.playedTime < this.duration) {
+					this.videoContext.play();
+				}
+			},
+			/**
+			 * 提交课程时长
+			 */
+			submitTimeLong({
+				tabId,
+				playDuration,
+				currentDuration,
+				duration
+			}, index, flag) {
+				if (tabId) {
+					this.$u.api.training
+						.videoTimeLongApi({
+							tabId,
+							playDuration,
+							currentDuration,
+							duration
+						})
+						.then(res => {
+							if (res.code === 200) {
+								if (!flag) {
+									this.$refs.uToast.show({
+										title: '已记录章节时长!',
+										type: 'success'
+									});
+									this.videoInfo = this.info.chapterList[index];
+									this.videoIndex = index;
+									this.getClassesDetails(this.classesId);
+								}
+							} else {
+								this.$refs.uToast.show({
+									title: res.msg,
+									type: 'error'
+								});
+							}
+						});
+				}
+			},
+			/**
+			 * 获取评论列表
+			 */
+			getCommentList() {
+				if (this.query.tabId) {
+					this.$u.api.training.getClassesCommentApi(this.query).then(res => {
 						if (res.code === 200) {
-							this.$refs.uToast.show({
-								title: '评论成功!',
-								type: 'success'
-							});
-							this.form.content = '';
-							this.form.starLevel = 0;
-							this.getCommentList();
-						} else {
-							this.$refs.uToast.show({
-								title: res.msg,
-								type: 'error'
-							});
+							this.total = Number(res.total);
+							this.commentList = res.rows;
 						}
 					});
 				}
-				if (!this.form.starLevel) {
+			},
+			/**
+			 * @param {Object} e 分页触发
+			 */
+			pageChange(e) {
+				this.query.pageNum = e.current;
+				this.getCommentList();
+			},
+			/**
+			 * 提交评论
+			 */
+			submitCommet() {
+				if (this.form.tabId) {
+					if (this.form.starLevel && this.form.content) {
+						this.$u.api.training.addClassesCommentApi(this.form).then(res => {
+							if (res.code === 200) {
+								this.$refs.uToast.show({
+									title: '评论成功!',
+									type: 'success'
+								});
+								this.form.content = '';
+								this.form.starLevel = 0;
+								this.getCommentList();
+							} else {
+								this.$refs.uToast.show({
+									title: res.msg,
+									type: 'error'
+								});
+							}
+						});
+					}
+					if (!this.form.starLevel) {
+						this.$refs.uToast.show({
+							title: '请选择星级',
+							type: 'warning'
+						});
+					}
+					if (!this.form.content) {
+						this.$refs.uToast.show({
+							title: '请输入评论内容',
+							type: 'warning'
+						});
+					}
+				} else {
 					this.$refs.uToast.show({
-						title: '请选择星级',
+						title: '未找到课程章节,无法提交评论!',
 						type: 'warning'
 					});
 				}
-				if (!this.form.content) {
-					this.$refs.uToast.show({
-						title: '请输入评论内容',
-						type: 'warning'
-					});
+			},
+			confirmSubmitDuration() {
+				let playDuration = this.video_real_time;
+				if (this.videoInfo.playDuration > this.video_real_time) {
+					this.currentDuration = this.video_real_time;
+					playDuration = this.videoInfo.playDuration;
+				} else {
+					this.currentDuration = this.video_real_time;
+				}
+				if (Number(this.isApply) === 1) {
+					this.submitTimeLong({
+							tabId: this.videoInfo.id,
+							playDuration: playDuration,
+							currentDuration: this.currentDuration,
+							duration: this.duration
+						},
+						0,
+						true
+					);
 				}
-			} else {
-				this.$refs.uToast.show({
-					title: '未找到课程章节,无法提交评论!',
-					type: 'warning'
-				});
 			}
 		}
-	}
-};
+	};
 </script>
 
 <style lang="scss" scoped>
-@import './courseDetailed.scss';
+	@import './courseDetailed.scss';
 </style>

+ 2 - 1
h5_web/pages/skillsTraining/skillsPackage/skillsPackage.vue

@@ -166,7 +166,8 @@
 					this.$u.route({
 						url: 'pages/skillsTraining/courseDetailed/courseDetailed',
 						params: {
-							id: item
+							id: item,
+							isApply: this.isApply
 						}
 					})
 				} else {

+ 50 - 51
h5_web/pages/upgrade/courseDetail/courseDetail.vue

@@ -3,7 +3,8 @@
 		<!-- 视频 -->
 		<view class="details-video" v-if="isPaly">
 			<video class="details-video-con" id="myVideo" @timeupdate="timeUpdate" :src="videoInfo.videoUrl" controls
-				:initial-time="initial_time" object-fit="fill" play-btn-position="center" @tap="videoClick">
+				:initial-time="initial_time" object-fit="fill" play-btn-position="center" @tap="videoClick"
+				@loadedmetadata="loadedmetadata">
 				<cover-view class="video-control">
 					<cover-view class="multi rate" @tap.stop="showSwitchRate">x {{ currentRate }}</cover-view>
 				</cover-view>
@@ -121,30 +122,29 @@
 					starLevel: 0,
 					content: ''
 				},
-				currentDuration: 0
+				currentDuration: 0,
+				duration: 0
 			}
 		},
 		onLoad(page) {
 			if (page.id) {
 				this.getClassesDetails(page.id);
 				this.classesId = page.id
+				this.query.tabId = this.classesId
+				this.form.tabId = this.classesId
 			}
 		},
 		beforeDestroy() {
-			let playDuration = this.video_real_time;
-			if (this.videoInfo.playDuration > this.video_real_time) {
-				this.currentDuration = this.video_real_time;
-				playDuration = this.videoInfo.playDuration
-			} else {
-				this.currentDuration = this.video_real_time
-			}
-			this.submitTimeLong({
-				tabId: this.videoInfo.id,
-				playDuration: playDuration,
-				currentDuration: this.currentDuration
-			}, 0, true)
+			this.confirmSubmitDuration();
 		},
 		methods: {
+			/**
+			 * 获取视频总时长
+			 * @param {Object} data
+			 */
+			loadedmetadata(data) {
+				this.duration = data.detail.duration;
+			},
 			/**
 			 * 显示倍速浮层
 			 * @param {Object} rate
@@ -186,8 +186,6 @@
 						this.initial_time = Number(res.data.chapterList[this.videoIndex].currentDuration)
 						this.video_real_time = Number(res.data.chapterList[this.videoIndex].playDuration)
 						this.playedTime = Number(res.data.chapterList[this.videoIndex].playDuration)
-						this.query.tabId = res.data.chapterList[this.videoIndex].id
-						this.form.tabId = res.data.chapterList[this.videoIndex].id
 						this.query.pageNum = res.data.page;
 						this.isPaly = true
 						this.getCommentList();
@@ -207,9 +205,10 @@
 				} else {
 					this.currentDuration = this.video_real_time
 				}
-				this.submitTimeLong ({
+				this.submitTimeLong({
 					tabId: this.videoInfo.id,
 					playDuration: playDuration,
+					duration: this.duration,
 					currentDuration: this.currentDuration
 				}, index);
 			},
@@ -218,44 +217,29 @@
 			 * @param {Object} e
 			 */
 			timeUpdate(e) {
-				let isReady = 1; // 是否开启可以视频快进 1 禁止开启
-				if (this.videoInfo.finishPercent === 100) {
-					isReady = 3;
-				}
-				//跳转到指定播放位置 initial-time 时间为秒
-				let that = this;
 				//播放的总时长
-				let duration = e.detail.duration
+				let duration = e.detail.duration;
 				//实时播放进度 秒数
-				let currentTime = parseInt(e.detail.currentTime)
+				let jumpTime = parseInt(e.detail.currentTime);
 				//当前视频进度
-				let jump_time = 0
-				if (that.video_real_time == 0) {
-					jump_time = parseInt(that.initial_time) + parseInt(that.video_real_time)
+				if (jumpTime - this.playedTime > 3) {
+					// 差别过大,调用seek方法跳转到实际观看时间
+					this.videoContext.seek(this.playedTime);
+					wx.showToast({
+						title: '未完整看完该视频,不能快进',
+						icon: 'none',
+						duration: 2000
+					});
 				} else {
-					jump_time = parseInt(that.video_real_time)
-				}
-				console.log('jump_time', jump_time)
-				console.log('that.initial_time', that.initial_time)
-				console.log('this.playedTime', this.playedTime)
-				console.log('that.video_real_time', that.video_real_time)
-				if (jump_time > this.playedTime) {
-					isReady = 1;
-				} else {
-					isReady = 3;
-				}
-				if(isReady === 1){
-					if (currentTime > jump_time && currentTime - jump_time > 3) {
-						let videoContext = wx.createVideoContext('myVideo')
-						videoContext.seek(that.video_real_time)
-						wx.showToast({
-							title: '未完整看完该视频,不能快进',
-							icon: 'none',
-							duration: 2000,
-						})
+					this.video_real_time = parseInt(e.detail.currentTime);
+					if (this.video_real_time > this.playedTime) {
+						this.playedTime = this.video_real_time;
 					}
 				}
-				that.video_real_time = currentTime //实时播放进度
+				if (parseInt(this.duration) !== 0 && parseInt(this.duration) === parseInt(this.video_real_time)) {
+					this.videoContext.pause();
+					this.confirmSubmitDuration()
+				}
 			},
 			/**
 			 * 提交课程时长
@@ -263,12 +247,14 @@
 			submitTimeLong({
 				tabId,
 				playDuration,
+				duration,
 				currentDuration
 			}, index, flag) {
 				if (tabId) {
 					this.$u.api.training.videoTimeLongApi({
 						tabId,
 						playDuration,
+						duration,
 						currentDuration
 					}).then(res => {
 						if (res.code === 200) {
@@ -278,8 +264,6 @@
 									type: 'success'
 								})
 								this.videoInfo = this.info.chapterList[index]
-								this.form.tabId = this.videoInfo.id
-								this.query.tabId = this.videoInfo.id
 								this.videoIndex = index
 								this.getClassesDetails(this.classesId);
 							}
@@ -353,6 +337,21 @@
 						type: 'warning'
 					})
 				}
+			},
+			confirmSubmitDuration() {
+				let playDuration = this.video_real_time;
+				if (this.videoInfo.playDuration > this.video_real_time) {
+					this.currentDuration = this.video_real_time;
+					playDuration = this.videoInfo.playDuration
+				} else {
+					this.currentDuration = this.video_real_time
+				}
+				this.submitTimeLong({
+					tabId: this.videoInfo.id,
+					playDuration: playDuration,
+					duration: this.duration,
+					currentDuration: this.currentDuration
+				}, 0, true)
 			}
 		}
 	}