123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- <template>
- <view class="details">
- <!-- 视频 -->
- <view class="details-video" v-if="isPaly" v-loading="videoLoading">
- <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"
- @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 }"
- >
- {{ item }}
- </cover-view>
- </cover-view>
- </video>
- </view>
- <!-- 介绍 -->
- <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-teacher">主讲老师:{{ info.presenter }}</view>
- <view class="details-content-info">{{ videoInfo.chapterInfo }}</view>
- </view>
- <!-- 课程章节 -->
- <view class="details-classes">
- <view class="details-classes-header">
- <view>精选课程</view>
- <view
- >更多
- <u-icon name="arrow-right" size="22" color="#A3A3A3" />
- </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>{{ index + 1 }}</view>
- <view>{{ item.flag === 2 ? '已学' : item.finishPercent + '%' }}</view>
- </view>
- </view>
- </view>
- <view class="details-line">
- <view></view>
- </view>
- <!-- 评论 -->
- <view class="details-comment">
- <view class="details-comment-header">
- <view>课程评论</view>
- <view>共{{ total }}条评论</view>
- </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="right">
- <view>{{ item.createBy }}</view>
- <view>
- <u-rate :count="5" size="24" disabled="" active-color="#C4C4C4" 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-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-content-textarea">
- <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>
- </view>
- <u-toast ref="uToast" />
- </view>
- </template>
- <script>
- 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: '',
- isPaly: true,
- query: {
- pageNum: 1,
- pageSize: 5,
- tabId: ''
- },
- total: 0,
- commentList: [],
- form: {
- tabId: '',
- starLevel: 0,
- content: ''
- },
- currentDuration: 0,
- duration: 0,
- videoLoading: false
- };
- },
- onLoad(page) {
- if (page.id) {
- this.getClassesDetails(page.id);
- this.classesId = page.id;
- this.query.tabId = this.classesId;
- this.form.tabId = this.classesId;
- }
- },
- beforeDestroy() {
- this.confirmSubmitDuration();
- },
- methods: {
- /**
- * 获取视频总时长
- * @param {Object} data
- */
- loadedmetadata(data) {
- this.duration = data.detail.duration;
- this.videoLoading = false
- },
- /**
- * 显示倍速浮层
- * @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.videoLoading = true
- this.$u.api.school
- .getPackageCourseDetail({
- id
- })
- .then((res) => {
- if (res.code === 200) {
- console.log(res);
- 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 = res.data.page;
- this.isPaly = true;
- this.getCommentList();
- }
- });
- },
- /**
- * 课程章节点击
- * @param {Object} index
- */
- classesClick(index) {
- this.isPaly = 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;
- }
- }
- if (parseInt(this.duration) !== 0 && parseInt(this.duration) === parseInt(this.video_real_time)) {
- this.videoContext.pause();
- this.confirmSubmitDuration();
- }
- },
- /**
- * 提交课程时长
- */
- submitTimeLong({ tabId, playDuration, duration, currentDuration }, index, flag) {
- if (tabId) {
- this.$u.api.training
- .videoTimeLongApi({
- tabId,
- playDuration,
- duration,
- currentDuration
- })
- .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.total = Number(res.total);
- this.commentList = res.rows;
- }
- });
- }
- },
- /**
- * @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: '未找到课程章节,无法提交评论!',
- 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
- );
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- @import './courseDetail.scss';
- </style>
|