From 1b6f1e454fff0187d4d30dcf0d5819d4f57f1787 Mon Sep 17 00:00:00 2001 From: inleft <inleft@qq.com> Date: Mon, 29 Aug 2022 01:05:14 +0800 Subject: [PATCH] 新增iframe 播放页 新增日志编辑页 --- src/components/mini/mdDetail.vue | 289 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 243 insertions(+), 46 deletions(-) diff --git a/src/components/mini/mdDetail.vue b/src/components/mini/mdDetail.vue index 7c8734a..1160808 100644 --- a/src/components/mini/mdDetail.vue +++ b/src/components/mini/mdDetail.vue @@ -4,15 +4,32 @@ <div class="headertop filter-dot headertop-bar " v-if="coverURL.length>0"> <figure class="centerbg" v-bind:style="{'background-image':'url('+this.coverURL+')'}"> </figure> + <div class="countMeta" + v-if="articleFileType==fileType.fileTypeMarkDown_1|| articleFileType==fileType.fileTypeHtml_2"> + <div style="display: flex;justify-content: space-between;padding: 0px 10px;"> + <div style="display: flex;align-items: center;"> <span>发布时间:{{articelMeta.publishDate}}</span></div> + <div style="display: inline-grid;"> + <span style="text-align: end;">字数:{{wordCount}}</span> + <span>预计耗时:{{Math.floor(wordCount/500)}}~{{Math.ceil(wordCount/300)}}分钟</span> + </div> + </div> + </div> </div> - <div v-if="showMsg && !myLock"> - <div class="mySecretSamll" v-if="articleFileType==fileType.fileTypeTalking_9"> - <p>碎碎念只有那么一点了</p> - <p>但是下面依旧可以碎碎念</p> - </div> + <div class="mySecret" v-if="myLock"> + <h1>越不正经的人越深情..</h1> + <h3>受庇护的文字..输入神秘代码以解除封印</h3> - <div class="mySecret" v-else> + <a-auto-complete v-model="secret" ref="mySearch" v-bind="search" @blur="pressEnter"> + <a-input-password @pressEnter="pressEnter"> + <a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)" /> + </a-input-password> + </a-auto-complete> + <span class="myTip">{{errorMsg}}</span> + </div> + + <div v-else-if="showMsg"> + <div class="mySecret"> <h1>怎样才能让你看到我呢</h1> <h1>只要你要,只要我有...</h1> <span class="myTip">{{errorMsg}}</span> @@ -20,37 +37,85 @@ </div> <div v-else> - <div class="mySecret" v-if="myLock"> - <h1>越不正经的人越深情..</h1> - <h3>受庇护的文字..输入神秘代码以解除封印</h3> - <a-auto-complete v-model="secret" ref="mySearch" v-bind="search" @blur="pressEnter"> - <a-input-password @pressEnter="pressEnter"> - <a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)" /> - </a-input-password> - </a-auto-complete> - <span class="myTip">{{errorMsg}}</span> - </div> + <div v-if="articleFileType==fileType.fileTypeTalking_9"> + <div class="markdown-body articleTitle"> + <h4>{{articelMeta.title}}</h4> - <div class="mySecret" v-else-if="articleFileType==fileType.fileTypeVideo_3 - || articleFileType==fileType.fileTypeVideo_3 - || articleFileType==fileType.fileTypeTalking_9"> - - <div class="mySecretSamll" v-if="introduce.length==0"> - <p>碎碎念只有那么一点了22</p> - <p>但是下面依旧可以碎碎念</p> + <div class="introduceSamll" v-if="introduce==null||introduce.length==0"> + <p>空荡荡的..我好像忘记写点什么了OωO</p> + </div> + <div class="introduce" v-else> + <pre style="white-space: pre-line;padding: 10px;max-width: 100%;"> + {{introduce}} + </pre> + </div> </div> - <pre style="white-space: pre-line;padding: 10px;max-width: 100%;"> - {{introduce}} - </pre> </div> - <div v-viewer.static class="markdown-body article-detail" v-else> + + <div class="introduce" + v-else-if="articleFileType==fileType.fileTypeVideo_3 || articleFileType==fileType.fileTypeMp3_4"> + <div class="markdown-body articleTitle"> + <h4>{{articelMeta.title}}</h4> + </div> + <div class="playBox" + v-bind:class="{disabledPointer:articelMeta.videoUrlList==null||articelMeta.videoUrlList==0}"> + <videoPlayBox ref="videoPlayBox" :showTar="true"></videoPlayBox> + </div> + <div class="introduceSamll" v-if="articelMeta.videoUrlList==null||articelMeta.videoUrlList==0"> + <p>该视频资源仍未上传</p> + </div> + <div class="introduce"> + <pre style="white-space: pre-line;padding: 10px;max-width: 100%;"> + {{introduce}} + </pre> + </div> + + </div> + + <div class="introduce" v-else-if="articleFileType==fileType.fileTypePictures_5"> + <div class="markdown-body articleTitle"> + <h4>{{articelMeta.title}}</h4> + </div> + + <div> + <div class="introduceSamll" + v-if="articelMeta.pictureUrlList==null ||articelMeta.pictureUrlList.length==0"> + <p>空荡荡的..好像忘记传图了</p> + </div> + <div class="myPicture" @click="showPicture(articelMeta.pictureUrlList)" v-else> + <div> + <img :src="articelMeta.pictureUrlList[0]" :key="articelMeta.id" alt="" loading="lazy" + :onerror="img404"> + </div> + <div style="text-align: center;">图组数量:{{articelMeta.pictureUrlList.length}}</div> + </div> + </div> + <div class="introduce" v-if="introduce!=null && introduce.length>0"> + <pre style="white-space: pre-line;padding: 10px;max-width: 100%;"> + {{introduce}} + </pre> + </div> + </div> + + <div v-viewer.static="options" class="markdown-body " v-else> <div class="articleTitle"> <h4>{{articelMeta.title}}</h4> </div> - <vue-markdown :source="source"></vue-markdown> + <vue-markdown :source="source" v-if="source== null || source.length>0"></vue-markdown> + + <div class="introduceSamll" v-else-if="introduce==null || introduce.length==0"> + <p>空荡荡的..我好像忘记写点什么了OωO</p> + </div> + + <div class="introduce" v-else> + <pre style="white-space: pre-line;padding: 10px;max-width: 100%;"> + {{introduce}} + </pre> + </div> </div> </div> + <!-- <div class="articleInfoMiniData"> <div> <a-icon type="calendar" class="samllPadding" /> @@ -74,7 +139,12 @@ <a-icon type="folder-open" class="samllPadding" /> </div> --> + <div class="jumpURL" v-if="articelMeta.jumpURL"> + 外链:<a target="_blank" :href="articelMeta.jumpURL" :title="articelMeta.jumpURL">{{articelMeta.jumpURL}}</a> + </div> + <div class="articleInfoMiniData"> + <div class="myTitleDeal"> <a-icon type="left" /> <a-tooltip placement="bottomLeft" :title="'上一篇: '+articelMeta.previousRecord.title" @@ -87,6 +157,7 @@ </a-tooltip> <span v-else class="myTip">到顶啦..</span> </div> + <div style="display: -webkit-box;"> <div class="myTitleDeal"> <a-tooltip placement="bottomLeft" :title="'下一篇: '+articelMeta.nextRecord.title" @@ -117,27 +188,37 @@ import { queryBlogArticleDetail } from '../../api/blogArticle.js' - + import comment from "../mini/box12-comment.vue" import axios from 'axios' import myConstant from "../../config/myConstant.js" + import optionsConfig from "../../config/v-viewer-Config.js" + import videoPlayBox from "../mini/box15-videoPlayBox.vue" + import { + api as viewerApi + } from "v-viewer" + export default { components: { VueMarkdown, - comment + comment, + videoPlayBox }, data() { return { - fileType: myConstant.fileType, - articelMeta: '', - isAllowedComment: 1, - introduce: "", articleId: "", articleFileType: myConstant.fileType.fileTypeMarkDown_1, typeId: null, + + fileType: myConstant.fileType, + articelMeta: '', + isAllowedComment: 1, + coverURL: "", + introduce: "", source: "", + showMsg: false, myLock: false, errorMsg: '', @@ -149,12 +230,21 @@ value: '', disabled: false }, - coverURL: "" + videoData: { + pic: "", + url: "", + type: "normal", + title: "", + introduce: "", + id: "" + }, + options: optionsConfig, + img404: myConstant.img404, + + wordCount: 0 } }, created() { - console.log(111); - console.log(this.$route.params); this.articleId = this.$route.query.id; this.articleFileType = this.$route.query.articleFileType; this.typeId = this.$route.query.typeId; @@ -162,9 +252,11 @@ watch: { '$route'(to, from) { if ("mdDetail" === to.name) { - this.articleId = this.$route.query.id; - this.articleFileType = this.$route.query.articleFileType; - this.typeId = this.$route.query.typeId; + if (this.articleId != this.$route.query.id) { + this.articleId = this.$route.query.id; + this.articleFileType = this.$route.query.articleFileType; + this.typeId = this.$route.query.typeId; + } } }, articleId: function(newValue, oldValue) { @@ -178,12 +270,35 @@ }, }, methods: { + getWordCount() { + var iTotal = 0; + var c; + for (var i = 0; i < this.source.length; i++) { + c = this.source.charAt(i); + //基本汉字 + if (c.match(/[\u4e00-\u9fa5]/)) { + iTotal++; + } + //基本汉字补充 + else if (c.match(/[\u9FA6-\u9fcb]/)) { + iTotal++; + } + } + this.wordCount = iTotal; + }, articleOptionHandle(type) { this.$message.info(type) + }, + showPicture(param) { + viewerApi({ + options: this.options, + images: param + }) }, queryDetail() { this.showMsg = true; this.errorMsg = "加载中.."; + let _this = this; queryBlogArticleDetail({ id: this.articleId, @@ -191,7 +306,6 @@ typeId: this.typeId, fileType: this.articleFileType }).then((res) => { - this.showMsg = true; this.myLock = false; this.errorMsg = res.message; this.source = ""; @@ -222,7 +336,7 @@ if (res.data.coverFileURL != null && res.data.coverFileURL != '') { this.coverURL = res.data.coverFileURL; } else { - this.coverURL = "http://t.inleft.com/share/media_photo/background.jpg"; + this.coverURL = myConstant.defaultBG; } this.articelMeta = res.data; @@ -236,8 +350,35 @@ this.source = res.data; }).catch(() => [ this.$message.error("获取文件好像失败了..", 3) - ]) + ]).finally(() => { + setTimeout(() => { + _this.getWordCount(); + }, 500); + }) } + } else if (res.data.articleFileType == this.fileType.fileTypeVideo_3) { + if (res.data.videoUrlList == null || res.data.videoUrlList.length < 1) { + this.$notification.error({ + message: '该日志还没有上传视频资源..', + placement: 'bottomRight' + }); + } else { + this.videoData.url = res.data.videoUrlList[0]; + + this.videoData.pic = res.data.coverFileURL; + this.videoData.title = res.data.title; + this.videoData.introduce = res.data.introduce; + this.videoData.id = res.data.id; + if (this.lastArticleId != this.articleId) { + let tempParam = JSON.parse(JSON.stringify(this.videoData)) + + _this.$nextTick(function() { + _this.$refs.videoPlayBox.startPlay(tempParam) + }) + } + } + + } //获取日志资源文件 @@ -267,15 +408,52 @@ <style lang="less"> @import '../../assets/md.less'; + .disabledPointer { + position: relative; + pointer-events: none; + filter: blur(0.9px) brightness(.8); + } + + .disabledPointer:before { + content: "\ec2a"; + z-index: 2; + font-size: 4rem; + font-family: 'iconfont'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + .articleTitle { h4 { - margin: 0px 0px 20px 0px; + margin: 0px 0px 10px 0px; -webkit-line-clamp: 1; } text-align: center; width: 100%; + } + .myPicture { + max-width: 70%; + margin: 0px auto; + padding: 20px 0px 0px 0px; + + img { + display: block; + width: 100%; + transition: all 0.5s cubic-bezier(0.25, 0.1, 0.25, 1); + border-radius: 16px; + } + } + + .countMeta { + position: absolute; + bottom: 0px; + width: 100%; + background: #f0f2f5; + opacity: 0.6; } .headertop { @@ -345,6 +523,16 @@ -o-transform: scale(1.55, 1.55); } + .jumpURL { + box-shadow: 8px 8px 18px rgba(0, 0, 0, 0.1), -8px -8px 18px #ffffff; + padding: 10px 23px; + margin: 20px 0px; + + a { + color: black; + } + } + .articleInfoMiniData { user-select: none; box-shadow: 8px 8px 18px rgba(0, 0, 0, 0.1), -8px -8px 18px #ffffff; @@ -371,7 +559,11 @@ } .mySecret { - height: 515px; + height: 315px; + } + + .mySecret, + .introduce { display: flex; flex-direction: column; justify-content: center; @@ -379,7 +571,8 @@ align-items: center; } - .mySecretSamll { + .mySecretSamll, + .introduceSamll { padding: 30px 10px 10px; height: 115px; display: flex; @@ -405,5 +598,9 @@ max-width: 120px; } } + + .countMeta { + bottom: 10px; + } } </style> -- Gitblit v1.9.1