From a23166e4fac771238a90ae5ddc5b1e53a1c7afb8 Mon Sep 17 00:00:00 2001 From: inleft <inleft@qq.com> Date: Thu, 25 Aug 2022 18:10:21 +0800 Subject: [PATCH] 更新后的细节调整 --- src/components/mini/mdDetail.vue | 593 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 435 insertions(+), 158 deletions(-) diff --git a/src/components/mini/mdDetail.vue b/src/components/mini/mdDetail.vue index e75b1c7..72f4b82 100644 --- a/src/components/mini/mdDetail.vue +++ b/src/components/mini/mdDetail.vue @@ -1,45 +1,176 @@ <template> - <div class="article-meta "> - <div> - <a-button @click="back" style="position: absolute;"> - <a-icon type="left" /> - </a-button> + <div class="article-meta"> + + <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> + <div class="mySecret" v-if="myLock"> + <h1>越不正经的人越深情..</h1> + <h3>受庇护的文字..输入神秘代码以解除封印</h3> - <div class="mySecret" v-if="showMsg && !myLock"> - <h1>怎样才能让你看到我呢</h1> - <h1>只要你要,只要我有...</h1> + <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> - <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> + <div v-else-if="showMsg"> + <div class="mySecret"> + <h1>怎样才能让你看到我呢</h1> + <h1>只要你要,只要我有...</h1> <span class="myTip">{{errorMsg}}</span> - - - </div> - - <div class="markdown-body article-detail" v-else> - <vue-markdown :source="source"></vue-markdown> </div> </div> + <div v-else> + <div v-if="articleFileType==fileType.fileTypeTalking_9"> + <div class="markdown-body articleTitle"> + <h4>{{articelMeta.title}}</h4> + + <div class="introduceSamll" v-if="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="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"> + <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" v-if="source.length>0"></vue-markdown> + + <div class="introduceSamll" v-else-if="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" /> + <span>{{articelMeta.publishDate==null?'--':articelMeta.publishDate}}</span> + </div> + <div class="smallOption" @click="articleOptionHandle('dislike')"> + <a-icon type="dislike" style="margin-top: 2px;" /> + </div> + <div> + <a-icon type="read" class="samllPadding" /> + <span>{{articelMeta.readCount==null?'--':articelMeta.readCount}}</span> + </div> + <div class="smallOption" @click="articleOptionHandle('like')"> + <a-icon type="like" class="samllPadding" /> + <span>{{articelMeta.likeCount==null?'0':articelMeta.likeCount}}</span> + </div> + <div> + <a-icon type="book" class="samllPadding" /> + <span>{{articelMeta.articleTypeName==null?'--':articelMeta.articleTypeName}}</span> + </div> + <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" + v-if="articelMeta.previousRecord !=null"> + <router-link + :to="{path:'/mdDetail',query:{id:articelMeta.previousRecord.id,articleFileType:articleFileType,typeId:typeId}}" + class="article-title"> + {{articelMeta.previousRecord.title}} + </router-link> + </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" + v-if="articelMeta.nextRecord !=null"> + <router-link + :to="{path:'/mdDetail',query:{id:articelMeta.nextRecord.id,articleFileType:articleFileType,typeId:typeId}}" + class="article-title"> + {{articelMeta.nextRecord.title}} + </router-link> + </a-tooltip> + <span v-else class="myTip">到底啦..</span> + </div> + <a-icon type="right" /> + </div> + </div> + + <div class="articleComment"> + <comment ref="myComment" :articleId="articleId" :isAllowedComment="isAllowedComment" /> + </div> </div> - </template> <script> - // import esPath from '../../assets/es.md' import VueMarkdown from 'vue-markdown' import md5 from 'js-md5'; @@ -47,56 +178,105 @@ 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 + VueMarkdown, + comment, + videoPlayBox }, data() { return { + articleId: "", + articleFileType: myConstant.fileType.fileTypeMarkDown_1, + typeId: null, + + fileType: myConstant.fileType, + articelMeta: '', + isAllowedComment: 1, + coverURL: "", + introduce: "", source: "", - acticleId: "", + showMsg: false, myLock: false, errorMsg: '', secret: '', search: { placeholder: "", - autoFocus: true, + autoFocus: false, backfill: true, value: '', disabled: false }, + videoData: { + pic: "", + url: "", + type: "normal", + title: "", + introduce: "", + id: "" + }, + options: optionsConfig, + img404: myConstant.img404, } }, created() { - this.acticleId = this.$route.query.id; + this.articleId = this.$route.query.id; + this.articleFileType = this.$route.query.articleFileType; + this.typeId = this.$route.query.typeId; }, watch: { '$route'(to, from) { if ("mdDetail" === to.name) { - this.acticleId = this.$route.query.id; + 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; + } } }, - acticleId: function(newValue, oldValue) { + articleId: function(newValue, oldValue) { if (newValue == undefined || newValue == null || newValue == "") { this.showMsg = true; this.errorMsg = "日志id参数缺失"; } else { this.queryDetail(); + this.$refs.myComment.updateCommentList(this.articleId); } - } - + }, }, methods: { + 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.acticleId, - authWord: this.secret == "" ? null : md5(this.secret) + id: this.articleId, + authWord: this.secret == "" ? null : md5(this.secret), + typeId: this.typeId, + fileType: this.articleFileType }).then((res) => { - this.showMsg = true; this.myLock = false; this.errorMsg = res.message; this.source = ""; @@ -117,19 +297,60 @@ placement: 'bottomRight' }); } - return } + // this.test = res.data.isAllowedComment == 1 ? true : false; + this.isAllowedComment = res.data.isAllowedComment; + this.introduce = res.data.introduce; + this.articleFileType = res.data.articleFileType; + if (res.data.coverFileURL != null && res.data.coverFileURL != '') { + this.coverURL = res.data.coverFileURL; + } else { + this.coverURL = myConstant.defaultBG; + } + + this.articelMeta = res.data; + + if (res.data.articleFileType == this.fileType.fileTypeMarkDown_1 || + res.data.articleFileType == this.fileType.fileTypeHtml_2) { + if (res.data.articleFileURL != null && res.data.articleFileURL != '') { + this.$axios + .get(res.data.articleFileURL) + .then((res) => { + this.source = res.data; + }).catch(() => [ + this.$message.error("获取文件好像失败了..", 3) + ]) + } + } 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) + }) + } + } + + + } //获取日志资源文件 this.showMsg = false; this.errorMsg = ""; - this.$axios - .get(res.data.articleFileURL) - .then((res) => { - this.source = res.data; - }) }) }, pressEnter() { @@ -145,20 +366,163 @@ this.search.disabled = false; }) - }, - back: function() { - this.$router.go(-1); } }, - + } </script> <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 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; + } + } + + .headertop { + position: relative; + overflow: hidden; + border-radius: 14px; + } + + .centerbg { + width: 100%; + margin: 0; + padding: 0; + background-repeat: no-repeat; + // background-attachment: fixed; + background-size: cover; + z-index: -1; + // background-image: url("http://t.inleft.com/blog//cover/这世界那么多人.jpg"); + height: 222px; + background-size: 100% auto; + background-position: center; + } + + + .headertop::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 3; + background-attachment: fixed; + } + + .headertop.filter-dot::before { + // background-image: url("https://blog-img-1258635493.cos.ap-chengdu.myqcloud.com/cdn/img/other/dot.gif"); + // background-image: url("http://blog.inleft.com/photo/dot.gif"); + } + + // .headertop-bar::after { + // content: ''; + // width: 150%; + // height: 4.375rem; + // background: linear-gradient(0deg, #fff, 84%, #ffffff4f); + // left: -25%; + // bottom: -2.875rem; + // border-radius: 100%; + // position: absolute; + // z-index: 4; + // } + + .smallOption { + transition-function: ease-out; + transition-duration: 200ms; + -webkit-transition-function: ease-out; + -webkit-transition-duration: 200ms; + -moztransition-function: ease-out; + -moztransition-duration: 200ms; + -o-transition-function: ease-out; + -o-transition-duration: 200ms; + } + + .smallOption:hover { + transform: scale(1.55, 1.55); + -webkit-transform: scale(1.55, 1.55); + -moz-transform: scale(1.55, 1.55); + -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; + padding: 10px 23px; + margin: 20px 0px; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + + a { + color: black; + } + + .myTitleDeal { + max-width: 300px; + -webkit-line-clamp: 1; + text-overflow: ellipsis; + overflow: hidden; + word-wrap: break-word; + white-space: nowrap; + word-break: break-all; + } + } + .mySecret { - height: 715px; + height: 315px; + } + + .mySecret, + .introduce { display: flex; flex-direction: column; justify-content: center; @@ -166,119 +530,32 @@ align-items: center; } - .markdown-body { - padding: 10px 20px 10px 20px; + .mySecretSamll, + .introduceSamll { + padding: 30px 10px 10px; + height: 115px; + display: flex; + flex-direction: column; + justify-content: center; + padding-left: auto; + align-items: center; + } + + + .markdown-body, + .articleComment { + min-height: 70%; + padding: 30px 20px 20px 20px; box-shadow: 8px 8px 18px rgba(0, 0, 0, 0.1), -8px -8px 18px #ffffff; } - /* #test{ - padding-left: 25%; - padding-right: 25%; - } */ - /* h3 { - margin: 40px 0 0; + + @media screen and (max-width:768px) { + .articleInfoMiniData { + .myTitleDeal { + max-width: 120px; + } + } } - - ul { - list-style-type: none; - padding: 0; - } - - li { - display: inline-block; - margin: 0 10px; - } - - a { - color: #42b983; - } - - */ - - - /* 自己也可以再调整调整 (贡献一版 我们调整的一版样式) */ - /* .markdown-body { - padding: 20px; - min-width: 200px; - max-width: 900px; - font-size: 12px; - - h2 { - font-size: 18px; - margin: 1em 0 15px; - padding-top: 0.8em; - padding-bottom: 0.8em; - } - - h3 { - font-size: 14px; - margin: 22px 0 16px; - } - - h4 { - font-size: 13px; - margin: 20px 0 16px; - } - - h5 { - font-size: 12px; - margin: 16px 0 16px; - font-weight: 700; - } - - p { - font-size: 12px; - line-height: 24px; - color: #666666; - margin-top: 0px; - margin: 8px 0; - margin: 14px 0 14px; - } - - pre { - background-color: #eee; - margin-bottom: 8px; - margin-top: 8px; - margin: 12px 0 12px; - } - - blockquote { - margin-bottom: 8px; - margin-top: 8px; - margin: 14px 0 14px; - background-color: #eee; - padding: 16px 16px; - } - - tr { - background-color: #f5f5f5; - } - - code { - background-color: #eee; - } - - ul, - ol, - li { - list-style: unset; - font-size: 12px; - line-height: 20px; - color: #666666; - margin-top: 0px; - margin: 8px 0; - } - - blockquote { - border-color: #48b6e2; - } - - table { - display: table; - width: 100%; - max-width: 100%; - margin-bottom: 20px; - } - } */ </style> -- Gitblit v1.9.1