2019-02-07 16:26:17 +08:00
|
|
|
|
<template lang="pug">
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.postPage
|
2019-02-07 16:26:17 +08:00
|
|
|
|
article.articleDetails
|
|
|
|
|
.articleTitle
|
2020-07-08 18:13:20 +08:00
|
|
|
|
| {{ articels.post_title }}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
.articalMeta
|
|
|
|
|
ul
|
|
|
|
|
li
|
|
|
|
|
Icon(:icon="['far', 'calendar-alt']")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
| {{ articels.post_date }}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
li
|
|
|
|
|
Icon(:icon="['far', 'bookmark']")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
nuxt-link(v-for='(relationships, index) in articels.term_relationships', :key='index', v-if='relationships.term_taxonomy', :to="'/' + relationships.term_taxonomy.term.slug")
|
2019-02-07 16:26:17 +08:00
|
|
|
|
span
|
|
|
|
|
| {{ relationships.term_taxonomy.term.name }}
|
2020-07-08 18:13:20 +08:00
|
|
|
|
li(v-if='articels.postmetum.meta_value !== 0')
|
|
|
|
|
Icon(:icon="['fas', 'thermometer-' + articels.hotValue]")
|
|
|
|
|
| {{ articels.postmetum.meta_value }}
|
|
|
|
|
#articelToc.articelToc(v-if="articels.post_toc_show")
|
2019-02-07 16:26:17 +08:00
|
|
|
|
.articelTitle 目录
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.articelTocList(v-html="articels.post_toc")
|
2020-07-19 20:13:07 +08:00
|
|
|
|
.articelContent(v-html='articels.post_content', v-viewer)
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.tools
|
|
|
|
|
.reward(@click="reward") 打赏
|
2020-07-09 18:16:27 +08:00
|
|
|
|
.comment(id="comment")
|
2020-07-08 22:36:46 +08:00
|
|
|
|
.comment-title 交流区
|
2020-07-17 18:10:55 +08:00
|
|
|
|
span(v-if="comments.length") ({{ commentAmount }})
|
2020-07-09 18:16:27 +08:00
|
|
|
|
.comment-item(v-for="(item, index) in comments", :id="'comment_ID_' + item.comment_ID", :key="index")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.comment-avatar
|
2020-07-08 22:36:46 +08:00
|
|
|
|
img(:src="item.comment_author_avatar_url ? item.comment_author_avatar_url : 'https://picsum.photos/100/100/?blur=' + item.user_id")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.comment-area
|
|
|
|
|
.comment-author {{ item.comment_author }}
|
2020-07-17 14:00:01 +08:00
|
|
|
|
span(class="comment-status", v-if="item.comment_approved === '0'") 此内容正在审核中...
|
2020-07-19 20:13:07 +08:00
|
|
|
|
.comment-content(v-html="item.comment_content_html", v-viewer)
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.comment-info {{ item.comment_date }}
|
2020-07-09 00:01:48 +08:00
|
|
|
|
span.reply(@click="reply(item.comment_ID, null, true)" v-if="replyLastID === null && item.comment_ID === replyID") 取消回复
|
|
|
|
|
span.reply(@click="reply(item.comment_ID, null)" v-else) 回复
|
2020-07-17 18:10:55 +08:00
|
|
|
|
span.reply(@click="check(item.comment_ID)" v-if="item.comment_approved === '0' && visitorInfo.manage") 通过审核
|
|
|
|
|
span.reply(@click="check(item.comment_ID, 2)" v-else-if="visitorInfo.manage") 设为垃圾评论
|
2020-07-09 18:16:27 +08:00
|
|
|
|
.comment-item(v-for="(i, inx) in item.children", :id="'comment_ID_' + i.comment_ID", :key="inx", style="margin-top: 15px; margin-left: 50px; background-color: #eeeeee; border-radius: 4px;")
|
2020-07-08 23:44:33 +08:00
|
|
|
|
.comment-avatar
|
|
|
|
|
img(:src="i.comment_author_avatar_url ? i.comment_author_avatar_url : 'https://picsum.photos/100/100/?blur=' + i.user_id")
|
|
|
|
|
.comment-area
|
|
|
|
|
.comment-author {{ i.comment_author }}
|
2020-07-17 14:00:01 +08:00
|
|
|
|
span(class="comment-status", v-if="i.comment_approved === '0'") 此内容正在审核中...
|
2020-07-09 18:16:27 +08:00
|
|
|
|
.comment-content(v-html="i.comment_content_html")
|
2020-07-08 23:44:33 +08:00
|
|
|
|
.comment-info {{ i.comment_date }}
|
2020-07-09 00:01:48 +08:00
|
|
|
|
span.reply(@click="reply(item.comment_ID, i.comment_ID)" v-if="replyLastID !== i.comment_ID") 回复
|
|
|
|
|
span.reply(@click="reply(item.comment_ID, i.comment_ID, true)" v-else) 取消回复
|
2020-07-17 18:10:55 +08:00
|
|
|
|
span.reply(@click="check(i.comment_ID)" v-if="i.comment_approved === '0' && visitorInfo.manage") 通过审核
|
|
|
|
|
span.reply(@click="check(i.comment_ID, 2)" v-else-if="visitorInfo.manage") 设为垃圾评论
|
2020-07-08 23:44:33 +08:00
|
|
|
|
p(v-if="!comments.length", style="color: #cecece; text-align: center; margin-top: 40px") 暂无内容
|
|
|
|
|
.comment-default-commit
|
2020-07-10 17:49:51 +08:00
|
|
|
|
.login(v-if="!visitorToken", @click="login")
|
|
|
|
|
img(src="https://cdn.wyr.me/imgs/GitHub-Login.png")
|
2020-07-08 23:44:33 +08:00
|
|
|
|
#editor
|
2020-07-15 14:44:27 +08:00
|
|
|
|
.comment-toolbar
|
|
|
|
|
.comment-no-userinfo(v-if="!visitorToken") 尚未登陆
|
|
|
|
|
.comment-userinfo(v-else)
|
|
|
|
|
.comment-avatar
|
2020-07-16 22:51:18 +08:00
|
|
|
|
img(:src="visitorInfo.avatarURL")
|
2020-07-17 10:56:02 +08:00
|
|
|
|
.comment-nickname {{ visitorInfo.nickname ? visitorInfo.nickname : (visitorInfo.username || '匿名') }}
|
2020-07-15 15:44:25 +08:00
|
|
|
|
.comment-logout(@click="commentLogout") 退出
|
2020-07-16 23:14:41 +08:00
|
|
|
|
.comment-btn(@click="commentCommit('editor')") 发布
|
2020-07-10 17:49:51 +08:00
|
|
|
|
.comment-reply-commit(id="comment-reply-commit", v-show="replyID")
|
|
|
|
|
.login(v-show="!visitorToken", @click="login")
|
|
|
|
|
img(src="https://cdn.wyr.me/imgs/GitHub-Login.png")
|
2020-07-08 23:44:33 +08:00
|
|
|
|
#editor-reply
|
2020-07-15 15:44:25 +08:00
|
|
|
|
.comment-toolbar
|
|
|
|
|
.comment-no-userinfo(v-if="!visitorToken") 尚未登陆
|
|
|
|
|
.comment-userinfo(v-else)
|
|
|
|
|
.comment-avatar
|
2020-07-16 22:51:18 +08:00
|
|
|
|
img(:src="visitorInfo.avatarURL")
|
2020-07-17 10:56:02 +08:00
|
|
|
|
.comment-nickname {{ visitorInfo.nickname ? visitorInfo.nickname : (visitorInfo.username || '匿名') }}
|
2020-07-15 15:44:25 +08:00
|
|
|
|
.comment-logout(@click="commentLogout") 退出
|
2020-07-16 23:14:41 +08:00
|
|
|
|
.comment-btn(@click="commentCommit('editor-reply')") 发布
|
2019-12-14 12:14:37 +08:00
|
|
|
|
ins.adsbygoogle(style="display:block; text-align:center; margin-top:20px;", data-ad-layout="in-article", data-ad-format="fluid", data-ad-client="ca-pub-2143583075951360", data-ad-slot="4741804954")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.articelRightToc(v-show="articels.post_toc_show && showRightToc", @click="articelRightTocClick")
|
2019-02-07 16:26:17 +08:00
|
|
|
|
.articelTitle 目录
|
2020-07-08 18:13:20 +08:00
|
|
|
|
.articelTocList(v-html="articels.post_toc")
|
|
|
|
|
nuxt-link(:to="articels.last ? '/post/' + articels.last.ID : ''")
|
|
|
|
|
.btnFooter.btnPrevt(:style="'color: ' + (articels.last ? '#333' : '#ccc')")
|
2019-02-07 16:26:17 +08:00
|
|
|
|
Icon(:icon="['fas', 'chevron-left']")
|
2020-07-08 18:13:20 +08:00
|
|
|
|
| 上一篇 {{ articels.last ? '(' + decodeTitle(articels.last.post_name) + ')' : ''}}
|
|
|
|
|
nuxt-link(:to="articels.next ? '/post/' + articels.next.ID : ''")
|
|
|
|
|
.btnFooter.btnNext(:style="'color: ' + (articels.next ? '#333' : '#ccc')")
|
|
|
|
|
| 下一篇 {{ articels.next ? '(' + decodeTitle(articels.next.post_name) + ')' : ''}}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
Icon(:icon="['fas', 'chevron-right']")
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
export default {
|
2019-12-13 11:46:15 +08:00
|
|
|
|
async asyncData ({ route, app, $axios }) {
|
2019-02-07 17:03:39 +08:00
|
|
|
|
const data = await $axios.$get(`/public/article/details?id=${route.params.id}`)
|
2019-02-07 16:26:17 +08:00
|
|
|
|
const result = data.result
|
|
|
|
|
result.post_date = app.$moment(result.post_date).utc().format('lll')// 格式化时间
|
|
|
|
|
// 热度值计算
|
|
|
|
|
if (result.postmetum !== null && result.postmetum !== '') {
|
|
|
|
|
result.hotValue = app.$getHatValue(result.postmetum.meta_value)
|
|
|
|
|
} else {
|
|
|
|
|
result.hotValue = 0
|
|
|
|
|
result.postmetum = {}
|
|
|
|
|
result.postmetum.meta_value = 0
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-06 18:13:28 +08:00
|
|
|
|
// 获取评论
|
|
|
|
|
const tmp = await $axios.$get(`/public/comments/post?ID=${route.params.id}`)
|
2020-07-08 18:13:20 +08:00
|
|
|
|
const comments = tmp.result.list || []
|
|
|
|
|
const commentAmount = tmp.result.amount || 0
|
2020-07-06 18:13:28 +08:00
|
|
|
|
|
2019-02-07 16:26:17 +08:00
|
|
|
|
return {
|
2020-07-16 23:14:41 +08:00
|
|
|
|
postID: route.params.id,
|
2020-07-08 18:13:20 +08:00
|
|
|
|
articels: result,
|
|
|
|
|
comments,
|
2020-07-09 18:16:27 +08:00
|
|
|
|
commentsMap: new Map(),
|
2020-07-08 18:13:20 +08:00
|
|
|
|
commentAmount,
|
2019-02-07 16:26:17 +08:00
|
|
|
|
showRightToc: false,
|
2020-07-08 23:44:33 +08:00
|
|
|
|
tocIds: result.post_toc_ids,
|
2020-07-09 00:01:48 +08:00
|
|
|
|
replyLastID: null,
|
2020-07-10 17:49:51 +08:00
|
|
|
|
replyID: null,
|
2020-07-16 22:51:18 +08:00
|
|
|
|
visitorToken: null,
|
|
|
|
|
visitorInfo: {
|
|
|
|
|
nickname: null,
|
|
|
|
|
avatarURL: null,
|
|
|
|
|
email: null,
|
|
|
|
|
blog: null
|
|
|
|
|
}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
}
|
|
|
|
|
},
|
2019-12-13 11:46:15 +08:00
|
|
|
|
mounted () {
|
2020-07-08 18:13:20 +08:00
|
|
|
|
// 创建编辑器
|
|
|
|
|
if (process.client) {
|
2020-07-17 14:00:01 +08:00
|
|
|
|
this.visitorToken = window.localStorage.visitorToken
|
|
|
|
|
if (this.visitorToken && window.localStorage.visitorInfo) {
|
|
|
|
|
try {
|
|
|
|
|
this.visitorInfo = JSON.parse(window.localStorage.visitorInfo)
|
|
|
|
|
this.getCommentWithVisitorInfo(this.postID)
|
|
|
|
|
} catch (_) { }
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-16 22:51:18 +08:00
|
|
|
|
window.setAuthToken = (visitorToken, visitorInfo) => {
|
|
|
|
|
window.localStorage.visitorToken = visitorToken
|
|
|
|
|
window.localStorage.visitorInfo = JSON.stringify(visitorInfo)
|
|
|
|
|
this.visitorToken = visitorToken
|
|
|
|
|
this.visitorInfo = visitorInfo
|
2020-07-17 10:32:06 +08:00
|
|
|
|
window.editorObj.vditor.options.upload.headers = {
|
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
|
|
|
|
}
|
|
|
|
|
window.editorReplyObj.vditor.options.upload.headers = {
|
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
|
|
|
|
}
|
2020-07-16 22:51:18 +08:00
|
|
|
|
}
|
2020-07-08 22:36:46 +08:00
|
|
|
|
if (!window.editorObj && window.Vditor) {
|
2020-07-17 10:32:06 +08:00
|
|
|
|
this.initEditor()
|
2020-07-08 18:13:20 +08:00
|
|
|
|
}
|
2020-07-09 18:16:27 +08:00
|
|
|
|
|
2020-07-16 23:14:41 +08:00
|
|
|
|
this.setCommentMap()
|
2020-07-08 18:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-02-07 16:26:17 +08:00
|
|
|
|
this.$finishLoad()
|
|
|
|
|
|
2020-07-08 18:13:20 +08:00
|
|
|
|
if (this.articels.post_toc_show) {
|
2019-02-07 16:26:17 +08:00
|
|
|
|
const tocShow = () => {
|
|
|
|
|
if (window.addEvent) {
|
|
|
|
|
window.addEvent(window, 'scroll', () => {
|
|
|
|
|
const windowWidth = window.innerWidth || document.documentElement.clientWidth
|
|
|
|
|
if (document.getElementById('articelToc') && !this.isOnScreen(document.getElementById('articelToc'))) {
|
|
|
|
|
if (windowWidth < 768) {
|
|
|
|
|
this.showRightToc = false
|
|
|
|
|
document.getElementById('mobileToc').style.display = 'block'
|
|
|
|
|
} else {
|
|
|
|
|
this.showRightToc = true
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.showRightToc = false
|
|
|
|
|
if (windowWidth < 768) {
|
|
|
|
|
document.getElementById('mobileToc').style.display = 'none'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
tocShow()
|
|
|
|
|
}, 50)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tocShow()
|
|
|
|
|
|
|
|
|
|
const tocIdsTop = []
|
|
|
|
|
const tocIdsTopMap = new Map()
|
|
|
|
|
for (const n in this.tocIds) {
|
|
|
|
|
const tTop = document.getElementById(this.tocIds[n]).offsetTop
|
|
|
|
|
tocIdsTop.push(tTop)
|
|
|
|
|
tocIdsTopMap.set(tTop, '#' + this.tocIds[n])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const findInIds = (arr, num) => { for (let x = 0; x < arr.length; x++) { if (arr[x] > num) { return x - 1 } } }
|
|
|
|
|
|
|
|
|
|
let debounce = null
|
|
|
|
|
let lastIdInx = null
|
|
|
|
|
|
|
|
|
|
const scrollToc = () => {
|
|
|
|
|
let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
|
|
|
|
|
const windowWidth = window.innerWidth || document.documentElement.clientWidth
|
2019-12-13 11:46:15 +08:00
|
|
|
|
if (windowWidth < 768) { scrollTop = scrollTop * 2.7 + 175 }
|
2019-02-07 16:26:17 +08:00
|
|
|
|
const tocIdsInx = findInIds(tocIdsTop, scrollTop + 130)
|
|
|
|
|
if (tocIdsInx !== -1 && lastIdInx !== tocIdsInx && document.getElementsByClassName('articelRightToc')[0]) {
|
|
|
|
|
const tocAList = document.getElementsByClassName('articelRightToc')[0].getElementsByTagName('a')
|
|
|
|
|
const nowId = tocIdsTopMap.get(tocIdsTop[tocIdsInx])
|
|
|
|
|
for (const i in tocAList) {
|
|
|
|
|
if (tocAList[i] && tocAList[i].getAttribute && tocAList[i].getAttribute('href') === nowId) {
|
|
|
|
|
tocAList[i].style.color = '#ff8a8a'
|
|
|
|
|
} else if (tocAList[i] && tocAList[i].style) {
|
|
|
|
|
tocAList[i].style.color = '#bbb'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
lastIdInx = tocIdsInx
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
window.addEvent(window, 'scroll', () => {
|
|
|
|
|
clearTimeout(debounce)
|
|
|
|
|
debounce = setTimeout(() => {
|
|
|
|
|
scrollToc()
|
|
|
|
|
}, 20)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
document.getElementById('mobileToc').onclick = () => {
|
|
|
|
|
this.showRightToc = !this.showRightToc
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-12-14 12:06:07 +08:00
|
|
|
|
|
2020-07-18 22:38:11 +08:00
|
|
|
|
if (this.$route.query.hash) {
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
window.location.hash = '#' + this.$route.query.hash
|
|
|
|
|
console.log('#' + this.$route.query.hash)
|
|
|
|
|
}, 50)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-06 18:13:28 +08:00
|
|
|
|
try {
|
|
|
|
|
(adsbygoogle = window.adsbygoogle || []).push({}) // eslint-disable-line
|
|
|
|
|
} catch (_) { }
|
2019-02-07 16:26:17 +08:00
|
|
|
|
},
|
|
|
|
|
methods: {
|
2020-07-17 10:32:06 +08:00
|
|
|
|
initEditor () {
|
|
|
|
|
const upload = {
|
|
|
|
|
accept: 'image/*, video/*, audio/*, text/*, application/*, .rar, .zip, .php, .pptx, .ppt, .doc, .docx, .txt, .xls, .xlsx',
|
|
|
|
|
url: process.env.baseURL + '/visitor/file/upload',
|
|
|
|
|
max: 10485760, // 10 MB
|
|
|
|
|
linkToImgUrl: process.env.baseURL + '/visitor/file/fetch',
|
|
|
|
|
headers: {
|
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
|
|
|
|
},
|
|
|
|
|
filename: name => encodeURIComponent(name.replace(/[^(a-zA-Z0-9\u4E00-\u9FA5\.)]/g, '') // eslint-disable-line
|
|
|
|
|
.replace(/[\?\\/:|<>\*\[\]\(\)\$%\{\}@~]/g, '') // eslint-disable-line
|
|
|
|
|
.replace('/\\s/g', '')),
|
|
|
|
|
format (files, responseText) {
|
|
|
|
|
return responseText
|
|
|
|
|
},
|
|
|
|
|
error: (_) => {
|
|
|
|
|
this.$modal.show('dialog', {
|
|
|
|
|
title: '提示',
|
|
|
|
|
text: '上传失败,请检查网络稍后重试。<br>允许上传的文件类型:图片、视频、压缩文件、文本文件、Office文件、各类代码文件。'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-07-19 01:03:30 +08:00
|
|
|
|
|
2020-07-17 10:32:06 +08:00
|
|
|
|
window.editorObj = new window.Vditor('editor', {
|
|
|
|
|
toolbar: [
|
|
|
|
|
'emoji',
|
|
|
|
|
'headings',
|
|
|
|
|
'bold',
|
|
|
|
|
'italic',
|
|
|
|
|
'strike',
|
|
|
|
|
'link',
|
|
|
|
|
'list',
|
|
|
|
|
'ordered-list',
|
|
|
|
|
'outdent',
|
|
|
|
|
'indent',
|
|
|
|
|
'quote',
|
|
|
|
|
'line',
|
|
|
|
|
'code',
|
|
|
|
|
'inline-code',
|
|
|
|
|
'upload',
|
|
|
|
|
'table',
|
|
|
|
|
'insert-before',
|
|
|
|
|
'insert-after',
|
|
|
|
|
'undo',
|
|
|
|
|
'redo',
|
|
|
|
|
'fullscreen',
|
|
|
|
|
{
|
|
|
|
|
name: 'more',
|
|
|
|
|
toolbar: [
|
|
|
|
|
'edit-mode',
|
|
|
|
|
'check',
|
|
|
|
|
'both',
|
|
|
|
|
'code-theme',
|
|
|
|
|
'content-theme',
|
|
|
|
|
'export',
|
|
|
|
|
'outline',
|
|
|
|
|
'preview',
|
|
|
|
|
'devtools'
|
|
|
|
|
]
|
|
|
|
|
}],
|
|
|
|
|
minHeight: 250,
|
|
|
|
|
toolbarConfig: {
|
|
|
|
|
pin: true
|
|
|
|
|
},
|
|
|
|
|
cache: {
|
|
|
|
|
enable: true
|
|
|
|
|
},
|
|
|
|
|
upload,
|
|
|
|
|
placeholder: '我们书写的不是代码,而是人生'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
window.editorReplyObj = new window.Vditor('editor-reply', {
|
|
|
|
|
toolbar: [
|
|
|
|
|
'emoji',
|
|
|
|
|
'headings',
|
|
|
|
|
'bold',
|
|
|
|
|
'italic',
|
|
|
|
|
'strike',
|
|
|
|
|
'link',
|
|
|
|
|
'list',
|
|
|
|
|
'ordered-list',
|
|
|
|
|
'outdent',
|
|
|
|
|
'indent',
|
|
|
|
|
'quote',
|
|
|
|
|
'line',
|
|
|
|
|
'code',
|
|
|
|
|
'inline-code',
|
|
|
|
|
'upload',
|
|
|
|
|
'insert-before',
|
|
|
|
|
'insert-after',
|
|
|
|
|
'undo',
|
|
|
|
|
'redo',
|
|
|
|
|
{
|
|
|
|
|
name: 'more',
|
|
|
|
|
toolbar: [
|
|
|
|
|
'table',
|
|
|
|
|
'fullscreen',
|
|
|
|
|
'edit-mode',
|
|
|
|
|
'check',
|
|
|
|
|
'both',
|
|
|
|
|
'code-theme',
|
|
|
|
|
'content-theme',
|
|
|
|
|
'export',
|
|
|
|
|
'outline',
|
|
|
|
|
'preview',
|
|
|
|
|
'devtools'
|
|
|
|
|
]
|
|
|
|
|
}],
|
|
|
|
|
minHeight: 220,
|
|
|
|
|
toolbarConfig: {
|
|
|
|
|
pin: true
|
|
|
|
|
},
|
|
|
|
|
cache: {
|
|
|
|
|
enable: false
|
|
|
|
|
},
|
|
|
|
|
upload,
|
|
|
|
|
placeholder: '我们书写的不是代码,而是人生'
|
|
|
|
|
})
|
|
|
|
|
},
|
2019-12-13 11:46:15 +08:00
|
|
|
|
decodeTitle (name) {
|
2019-03-23 22:11:40 +08:00
|
|
|
|
try {
|
2019-03-24 00:15:54 +08:00
|
|
|
|
return this.urldecode(name)
|
2019-03-23 22:11:40 +08:00
|
|
|
|
} catch (err) {
|
|
|
|
|
console.log(err)
|
|
|
|
|
return name
|
|
|
|
|
}
|
|
|
|
|
},
|
2019-12-13 11:46:15 +08:00
|
|
|
|
urldecode (encodedString) {
|
2019-03-24 00:15:54 +08:00
|
|
|
|
let output = encodedString
|
|
|
|
|
let binVal, thisString
|
|
|
|
|
const myregexp = /(%[^%]{2})/
|
2019-12-13 11:46:15 +08:00
|
|
|
|
function utf8to16 (str) {
|
2019-03-24 00:15:54 +08:00
|
|
|
|
let c
|
|
|
|
|
let char2, char3
|
|
|
|
|
|
|
|
|
|
let out = ''
|
|
|
|
|
const len = str.length
|
|
|
|
|
let i = 0
|
|
|
|
|
while (i < len) {
|
|
|
|
|
c = str.charCodeAt(i++)
|
|
|
|
|
switch (c >> 4) {
|
|
|
|
|
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
|
|
|
|
|
out += str.charAt(i - 1)
|
|
|
|
|
break
|
|
|
|
|
case 12: case 13:
|
|
|
|
|
char2 = str.charCodeAt(i++)
|
|
|
|
|
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F))
|
|
|
|
|
break
|
|
|
|
|
case 14:
|
|
|
|
|
char2 = str.charCodeAt(i++)
|
|
|
|
|
char3 = str.charCodeAt(i++)
|
|
|
|
|
out += String.fromCharCode(((c & 0x0F) << 12) |
|
|
|
|
|
((char2 & 0x3F) << 6) |
|
|
|
|
|
((char3 & 0x3F) << 0))
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let match = null
|
|
|
|
|
while ((match = myregexp.exec(output)) != null &&
|
|
|
|
|
match.length > 1 &&
|
|
|
|
|
match[1] !== '') {
|
|
|
|
|
binVal = parseInt(match[1].substr(1), 16)
|
|
|
|
|
thisString = String.fromCharCode(binVal)
|
|
|
|
|
output = output.replace(match[1], thisString)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
output = output.replace(/\\+/g, ' ')
|
|
|
|
|
output = utf8to16(output)
|
|
|
|
|
return output
|
|
|
|
|
},
|
2019-12-13 11:46:15 +08:00
|
|
|
|
articelRightTocClick () {
|
2019-02-07 16:26:17 +08:00
|
|
|
|
const windowWidth = window.innerWidth || document.documentElement.clientWidth
|
|
|
|
|
if (windowWidth < 768) {
|
|
|
|
|
this.showRightToc = false
|
|
|
|
|
}
|
|
|
|
|
},
|
2019-12-13 11:46:15 +08:00
|
|
|
|
isOnScreen (element) {
|
2019-02-07 16:26:17 +08:00
|
|
|
|
const ON_SCREEN_HEIGHT = 50
|
|
|
|
|
const ON_SCREEN_WIDTH = 50
|
|
|
|
|
|
|
|
|
|
const rect = element.getBoundingClientRect()
|
|
|
|
|
const windowHeight = window.innerHeight || document.documentElement.clientHeight
|
|
|
|
|
const windowWidth = window.innerWidth || document.documentElement.clientWidth
|
|
|
|
|
|
|
|
|
|
const elementHeight = element.offsetHeight
|
|
|
|
|
const elementWidth = element.offsetWidth
|
|
|
|
|
|
|
|
|
|
const onScreenHeight = ON_SCREEN_HEIGHT > elementHeight ? elementHeight : ON_SCREEN_HEIGHT
|
|
|
|
|
const onScreenWidth = ON_SCREEN_WIDTH > elementWidth ? elementWidth : ON_SCREEN_WIDTH
|
|
|
|
|
|
|
|
|
|
// 元素在屏幕上方
|
|
|
|
|
const elementBottomToWindowTop = rect.top + elementHeight
|
|
|
|
|
const bottomBoundingOnScreen = elementBottomToWindowTop >= onScreenHeight
|
|
|
|
|
|
|
|
|
|
// 元素在屏幕下方
|
|
|
|
|
const elementTopToWindowBottom = windowHeight - (rect.bottom - elementHeight)
|
|
|
|
|
const topBoundingOnScreen = elementTopToWindowBottom >= onScreenHeight
|
|
|
|
|
|
|
|
|
|
// 元素在屏幕左侧
|
|
|
|
|
const elementRightToWindowLeft = rect.left + elementWidth
|
|
|
|
|
const rightBoundingOnScreen = elementRightToWindowLeft >= onScreenWidth
|
|
|
|
|
|
|
|
|
|
// 元素在屏幕右侧
|
|
|
|
|
const elementLeftToWindowRight = windowWidth - (rect.right - elementWidth)
|
|
|
|
|
const leftBoundingOnScreen = elementLeftToWindowRight >= onScreenWidth
|
|
|
|
|
|
|
|
|
|
return bottomBoundingOnScreen && topBoundingOnScreen && rightBoundingOnScreen && leftBoundingOnScreen
|
2020-07-08 18:13:20 +08:00
|
|
|
|
},
|
|
|
|
|
reward () {
|
|
|
|
|
this.$modal.show('dialog', {
|
|
|
|
|
title: '感谢支持',
|
|
|
|
|
text: '<img src="https://cdn.wyr.me/imgs/reward.jpg" style="max-width: 100%; width: 400px"/>'
|
|
|
|
|
})
|
2020-07-08 23:44:33 +08:00
|
|
|
|
},
|
2020-07-09 00:01:48 +08:00
|
|
|
|
reply (id, replyLastID, cancel) {
|
2020-07-10 17:49:51 +08:00
|
|
|
|
const editorReplyObject = document.getElementById('comment-reply-commit')
|
2020-07-09 00:01:48 +08:00
|
|
|
|
if (cancel) {
|
|
|
|
|
this.replyID = null
|
|
|
|
|
this.replyLastID = null
|
2020-07-10 10:03:49 +08:00
|
|
|
|
window.location.hash = '_'
|
2020-07-09 00:01:48 +08:00
|
|
|
|
} else {
|
|
|
|
|
this.replyID = id
|
|
|
|
|
this.replyLastID = replyLastID
|
2020-07-09 18:16:27 +08:00
|
|
|
|
document.getElementById('comment_ID_' + id).appendChild(editorReplyObject)
|
|
|
|
|
const comment = this.commentsMap.get(replyLastID)
|
|
|
|
|
window.editorReplyObj.setValue('', true)
|
2020-07-10 10:03:49 +08:00
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
window.editorReplyObj.focus()
|
|
|
|
|
if (replyLastID !== null) {
|
|
|
|
|
window.editorReplyObj.insertValue('> ' + comment.comment_content + ' \n\n\n', true)
|
|
|
|
|
} else {
|
|
|
|
|
window.editorReplyObj.insertValue('', true)
|
|
|
|
|
}
|
|
|
|
|
window.location.hash = '#comment_ID_' + id
|
|
|
|
|
})
|
2020-07-09 00:01:48 +08:00
|
|
|
|
}
|
2020-07-10 17:49:51 +08:00
|
|
|
|
},
|
2020-07-16 23:14:41 +08:00
|
|
|
|
async commentCommit (type) {
|
|
|
|
|
const parentID = this.replyID || 0
|
|
|
|
|
const lastID = this.replyLastID || 0
|
|
|
|
|
const postID = this.postID
|
|
|
|
|
if (!postID) {
|
|
|
|
|
alert('致命错误')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-16 23:38:24 +08:00
|
|
|
|
const editorObj = type === 'editor-reply' ? window.editorReplyObj : window.editorObj
|
2020-07-18 17:46:34 +08:00
|
|
|
|
const content = editorObj.getValue()
|
|
|
|
|
|
|
|
|
|
if (!content || content === '\n') {
|
|
|
|
|
this.$toasted.show('请输入内容', {
|
|
|
|
|
position: 'top-center',
|
|
|
|
|
duration: 5000
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
2020-07-16 23:38:24 +08:00
|
|
|
|
|
|
|
|
|
const { data } = await this.$axios({
|
|
|
|
|
method: 'post',
|
|
|
|
|
url: process.env.baseURL + '/comments/commit',
|
|
|
|
|
headers: {
|
2020-07-17 14:00:01 +08:00
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
2020-07-16 23:38:24 +08:00
|
|
|
|
},
|
|
|
|
|
data: {
|
|
|
|
|
postID,
|
|
|
|
|
lastID,
|
|
|
|
|
parentID,
|
2020-07-18 17:46:34 +08:00
|
|
|
|
content
|
2020-07-16 23:38:24 +08:00
|
|
|
|
}
|
2020-07-16 23:14:41 +08:00
|
|
|
|
})
|
2020-07-15 15:44:25 +08:00
|
|
|
|
|
2020-07-16 23:14:41 +08:00
|
|
|
|
if (data.status === 1) {
|
2020-07-17 12:04:14 +08:00
|
|
|
|
this.replyID = null
|
|
|
|
|
this.replyLastID = null
|
|
|
|
|
window.location.hash = '_'
|
2020-07-17 14:00:01 +08:00
|
|
|
|
this.getCommentWithVisitorInfo(postID)
|
2020-07-16 23:38:24 +08:00
|
|
|
|
editorObj.setValue('', true)
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
editorObj.focus()
|
|
|
|
|
editorObj.insertValue('', true)
|
|
|
|
|
})
|
2020-07-16 23:14:41 +08:00
|
|
|
|
}
|
2020-07-15 15:44:25 +08:00
|
|
|
|
},
|
2020-07-17 18:10:55 +08:00
|
|
|
|
async check (ID, type) {
|
|
|
|
|
const { data } = await this.$axios({
|
|
|
|
|
method: 'post',
|
|
|
|
|
url: process.env.baseURL + '/comments/check',
|
|
|
|
|
headers: {
|
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
|
|
|
|
},
|
|
|
|
|
data: {
|
|
|
|
|
ID,
|
|
|
|
|
type
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (data.status === 1) {
|
|
|
|
|
this.getCommentWithVisitorInfo(this.postID)
|
|
|
|
|
this.$toasted.show(type === 2 ? '已删除' : '已通过', {
|
|
|
|
|
position: 'top-center',
|
|
|
|
|
duration: 5000
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
},
|
2020-07-17 14:00:01 +08:00
|
|
|
|
async getCommentWithVisitorInfo (postID) {
|
|
|
|
|
// 获取评论
|
|
|
|
|
const tmp = await this.$axios({
|
|
|
|
|
method: 'get',
|
|
|
|
|
url: process.env.baseURL + `/public/comments/post?ID=${postID}`,
|
|
|
|
|
headers: {
|
|
|
|
|
Authorization: 'Bearer ' + this.visitorToken
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
const comments = tmp.data.result.list || []
|
|
|
|
|
const commentAmount = tmp.data.result.amount || 0
|
|
|
|
|
this.comments = comments
|
|
|
|
|
this.commentAmount = commentAmount
|
|
|
|
|
this.setCommentMap()
|
|
|
|
|
},
|
2020-07-15 15:44:25 +08:00
|
|
|
|
commentLogout () {
|
2020-07-16 22:51:18 +08:00
|
|
|
|
window.localStorage.removeItem('visitorToken')
|
2020-07-15 15:44:25 +08:00
|
|
|
|
this.visitorToken = null
|
|
|
|
|
},
|
2020-07-10 17:49:51 +08:00
|
|
|
|
login () {
|
2020-07-15 01:22:34 +08:00
|
|
|
|
window.open('https://github.com/login/oauth/authorize?client_id=ce1673a37333e47e482d&redirect_uri=https://www.wyr.me/auth', 'Github授权', 'scrollbars=yes,resizable=yes,status=no,location=yes,toolbar=no,menubar=no,width=800,height=600,left=0,top=0')
|
2020-07-16 23:14:41 +08:00
|
|
|
|
},
|
|
|
|
|
setCommentMap () {
|
|
|
|
|
const comments = this.comments
|
|
|
|
|
for (let i = 0; i < comments.length; i++) {
|
|
|
|
|
this.commentsMap.set(comments[i].comment_ID, comments[i])
|
|
|
|
|
if (comments[i].children) {
|
|
|
|
|
for (let j = 0; j < comments[i].children.length; j++) {
|
|
|
|
|
this.commentsMap.set(comments[i].children[j].comment_ID, comments[i].children[j])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
}
|
2019-12-13 11:46:15 +08:00
|
|
|
|
},
|
|
|
|
|
head () {
|
|
|
|
|
return {
|
2020-07-08 18:13:20 +08:00
|
|
|
|
title: `${this.articels.post_title} - 轶哥`
|
2019-12-13 11:46:15 +08:00
|
|
|
|
}
|
2019-02-07 16:26:17 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
<style lang="stylus">
|
|
|
|
|
.postPage
|
|
|
|
|
.articleDetails
|
|
|
|
|
margin-top 30px
|
|
|
|
|
background-color #fff
|
|
|
|
|
padding 50px 10px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.articleTitle
|
|
|
|
|
text-align center
|
|
|
|
|
font-size 24px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.articalMeta
|
|
|
|
|
text-align center
|
|
|
|
|
padding 20px 0
|
|
|
|
|
font-size 12px
|
|
|
|
|
color #a1887f
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
ul
|
|
|
|
|
list-style none
|
|
|
|
|
padding-right 20px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
> li
|
|
|
|
|
display inline-block
|
|
|
|
|
margin-left 20px
|
|
|
|
|
line-height 2
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
> i
|
|
|
|
|
margin-right 8px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
> span a
|
|
|
|
|
color #a1887f
|
|
|
|
|
margin-left 10px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
a span
|
|
|
|
|
color #a1887f
|
|
|
|
|
|
|
|
|
|
> span a:first-child
|
|
|
|
|
margin-left 0
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
> li :first-child
|
2019-02-07 16:26:17 +08:00
|
|
|
|
margin-left 0
|
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.articelContent
|
|
|
|
|
margin-top 20px
|
|
|
|
|
margin-bottom 30px
|
|
|
|
|
line-height 2
|
|
|
|
|
font-weight 300
|
|
|
|
|
font-size responsive
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
pre
|
|
|
|
|
text-align 0.16rem
|
|
|
|
|
overflow-x auto
|
|
|
|
|
line-height 1
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
code
|
|
|
|
|
padding 16px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
|
|
|
|
code
|
2020-07-12 16:32:48 +08:00
|
|
|
|
color #24292e
|
|
|
|
|
background-color rgba(27, 31, 35, 0.05)
|
|
|
|
|
border-radius 3px
|
|
|
|
|
font-size 85%
|
|
|
|
|
padding 2px 5px
|
|
|
|
|
|
|
|
|
|
.comment
|
|
|
|
|
width 100%
|
|
|
|
|
margin-top 60px
|
|
|
|
|
|
|
|
|
|
.comment-title
|
|
|
|
|
color #777
|
|
|
|
|
margin-bottom 30px
|
|
|
|
|
|
|
|
|
|
.comment-item
|
|
|
|
|
margin-top 10px
|
|
|
|
|
padding 10px 8px
|
|
|
|
|
|
|
|
|
|
.comment-avatar
|
|
|
|
|
float left
|
|
|
|
|
margin-top 3px
|
|
|
|
|
|
|
|
|
|
img
|
|
|
|
|
border-radius 50%
|
|
|
|
|
width 40px
|
|
|
|
|
border-style none
|
|
|
|
|
cursor pointer
|
|
|
|
|
box-sizing border-box
|
|
|
|
|
margin 0
|
2020-07-08 18:13:20 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-area
|
|
|
|
|
margin-left 50px
|
2020-07-08 18:13:20 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-author, .comment-info
|
|
|
|
|
font-size 10px
|
2020-07-08 18:13:20 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-author
|
|
|
|
|
color #a1887f
|
2020-07-08 18:13:20 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-info
|
|
|
|
|
color #777
|
2020-07-08 18:13:20 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.reply
|
|
|
|
|
color #a1887f
|
|
|
|
|
cursor pointer
|
|
|
|
|
user-select none
|
|
|
|
|
margin-left 10px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-15 14:44:27 +08:00
|
|
|
|
.comment-no-userinfo
|
|
|
|
|
float left
|
|
|
|
|
font-size 12px
|
|
|
|
|
line-height 50px
|
|
|
|
|
margin-left 10px
|
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-userinfo
|
2020-07-15 14:44:27 +08:00
|
|
|
|
width 200px
|
|
|
|
|
position relative
|
|
|
|
|
cursor pointer
|
|
|
|
|
user-select none
|
|
|
|
|
margin-top 10px
|
|
|
|
|
margin-left 10px
|
|
|
|
|
display inline-block
|
|
|
|
|
height 30px
|
2020-07-08 22:36:46 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-avatar
|
2020-07-15 14:44:27 +08:00
|
|
|
|
position absolute
|
|
|
|
|
left 0
|
|
|
|
|
top 0
|
|
|
|
|
width 30px
|
|
|
|
|
height 30px
|
|
|
|
|
overflow hidden
|
2020-07-08 22:36:46 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
img
|
|
|
|
|
border-radius 50%
|
2020-07-15 14:44:27 +08:00
|
|
|
|
width 30px
|
|
|
|
|
height 30px
|
2020-07-12 16:32:48 +08:00
|
|
|
|
border-style none
|
|
|
|
|
box-sizing border-box
|
|
|
|
|
margin 0
|
2020-07-08 22:36:46 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-nickname
|
|
|
|
|
color #a1887f
|
2020-07-15 14:44:27 +08:00
|
|
|
|
margin-left 50px
|
|
|
|
|
height 30px
|
|
|
|
|
line-height 30px
|
|
|
|
|
font-size 12px
|
|
|
|
|
width 150px
|
|
|
|
|
overflow hidden
|
|
|
|
|
text-overflow ellipsis
|
|
|
|
|
white-space nowrap
|
|
|
|
|
|
2020-07-17 10:41:02 +08:00
|
|
|
|
.comment-content
|
|
|
|
|
width 100%
|
2020-07-17 12:04:14 +08:00
|
|
|
|
padding 5px 0
|
2020-07-17 10:41:02 +08:00
|
|
|
|
|
|
|
|
|
img
|
|
|
|
|
max-width 100%
|
|
|
|
|
|
2020-07-17 14:00:01 +08:00
|
|
|
|
.comment-status
|
|
|
|
|
color #ca7474
|
|
|
|
|
|
2020-07-15 14:44:27 +08:00
|
|
|
|
.comment-logout
|
|
|
|
|
width 51px
|
|
|
|
|
height 100%
|
|
|
|
|
line-height 30px
|
|
|
|
|
border 1px solid #586069
|
|
|
|
|
font-size 12px
|
|
|
|
|
border-radius 2px
|
|
|
|
|
box-sizing border-box
|
|
|
|
|
display none
|
|
|
|
|
text-align center
|
|
|
|
|
|
|
|
|
|
.comment-userinfo:hover
|
|
|
|
|
.comment-avatar, .comment-nickname
|
|
|
|
|
display none
|
|
|
|
|
|
|
|
|
|
.comment-logout
|
|
|
|
|
display block
|
|
|
|
|
|
|
|
|
|
.comment-userinfo:active
|
|
|
|
|
.comment-logout
|
|
|
|
|
background-color #586069
|
|
|
|
|
color #fff
|
2020-07-08 22:36:46 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
#editor
|
|
|
|
|
margin-top 10px
|
2020-07-15 14:44:27 +08:00
|
|
|
|
border-bottom-color #e6e5e5
|
|
|
|
|
border-bottom-style dotted
|
|
|
|
|
border-bottom-left-radius 0
|
|
|
|
|
border-bottom-right-radius 0
|
|
|
|
|
|
|
|
|
|
.comment-toolbar
|
|
|
|
|
width 100%
|
|
|
|
|
height 50px
|
|
|
|
|
flex-direction column
|
|
|
|
|
border 1px solid #d1d5da
|
|
|
|
|
border-radius 3px
|
|
|
|
|
box-sizing border-box
|
|
|
|
|
border-top none
|
|
|
|
|
border-top-left-radius 0
|
|
|
|
|
border-top-right-radius 0
|
|
|
|
|
color #586069
|
|
|
|
|
|
|
|
|
|
.comment-btn
|
|
|
|
|
color #586069
|
|
|
|
|
float right
|
|
|
|
|
line-height 12px
|
|
|
|
|
margin-top 12px
|
|
|
|
|
margin-right 10px
|
|
|
|
|
padding 6px 12px
|
|
|
|
|
border 1px solid #586069
|
|
|
|
|
box-sizing border-box
|
|
|
|
|
font-size 12px
|
|
|
|
|
cursor pointer
|
|
|
|
|
user-select none
|
|
|
|
|
border-radius 2px
|
|
|
|
|
|
|
|
|
|
.comment-btn:active
|
|
|
|
|
background-color #586069
|
|
|
|
|
color #fff
|
2020-07-08 22:36:46 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-reply-commit
|
|
|
|
|
margin 10px 0 10px 50px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-default-commit
|
|
|
|
|
margin-top 125px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.comment-default-commit, .comment-reply-commit
|
|
|
|
|
position relative
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.login
|
|
|
|
|
position absolute
|
|
|
|
|
left 0
|
|
|
|
|
top 0
|
|
|
|
|
width 100%
|
|
|
|
|
height 100%
|
|
|
|
|
text-align center
|
|
|
|
|
line-height 1
|
|
|
|
|
margin auto
|
|
|
|
|
z-index 99
|
|
|
|
|
cursor pointer
|
|
|
|
|
user-select none
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
img
|
|
|
|
|
margin-top 70px
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.login:hover
|
|
|
|
|
background-color #fff
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.login:before
|
|
|
|
|
content ''
|
|
|
|
|
position absolute
|
|
|
|
|
background rgba(0, 0, 0, 0.1)
|
|
|
|
|
top 0
|
|
|
|
|
left 0
|
|
|
|
|
width 100%
|
|
|
|
|
height 100%
|
|
|
|
|
filter blur(5px)
|
|
|
|
|
z-index 9
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
#editor-reply
|
|
|
|
|
margin 0
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.btnFooter
|
|
|
|
|
font-size 12px
|
|
|
|
|
margin-top 25px
|
|
|
|
|
|
|
|
|
|
i
|
|
|
|
|
margin 10px
|
|
|
|
|
|
|
|
|
|
.btnPrevt
|
|
|
|
|
float left
|
|
|
|
|
|
|
|
|
|
.btnNext
|
|
|
|
|
float right
|
|
|
|
|
|
|
|
|
|
footer .footer
|
|
|
|
|
color #cccccc
|
|
|
|
|
text-align left
|
|
|
|
|
line-height 1.5
|
|
|
|
|
margin 20px 0
|
|
|
|
|
|
|
|
|
|
.anchor-fix
|
|
|
|
|
display block
|
|
|
|
|
height 70px /* same height as header */
|
|
|
|
|
margin-top -70px /* same height as header */
|
|
|
|
|
visibility hidden
|
|
|
|
|
|
|
|
|
|
.articelRightToc
|
2020-07-15 14:44:27 +08:00
|
|
|
|
font-size 12px
|
2020-07-12 16:32:48 +08:00
|
|
|
|
position fixed
|
|
|
|
|
width 15%
|
|
|
|
|
top 0
|
|
|
|
|
right 0
|
|
|
|
|
overflow-y auto
|
|
|
|
|
background-color #000
|
|
|
|
|
padding 10px
|
|
|
|
|
box-shadow 0 0 8px #000
|
|
|
|
|
z-index 999999
|
2020-07-15 14:44:27 +08:00
|
|
|
|
padding-bottom 20px
|
|
|
|
|
min-width 240px
|
|
|
|
|
max-width 300px
|
2020-07-12 16:32:48 +08:00
|
|
|
|
|
|
|
|
|
.articelToc
|
|
|
|
|
width 100%
|
|
|
|
|
|
|
|
|
|
.articelToc, .articelRightToc
|
|
|
|
|
color #bbb
|
|
|
|
|
user-select none
|
|
|
|
|
|
|
|
|
|
.articelTitle
|
|
|
|
|
font-weight 400
|
|
|
|
|
margin-bottom 10px
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.articelTocList
|
|
|
|
|
color #bbb
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
a
|
2019-02-07 16:26:17 +08:00
|
|
|
|
color #bbb
|
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
&:visited
|
2020-07-10 17:49:51 +08:00
|
|
|
|
color #bbb
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
&:hover
|
|
|
|
|
color #d01c2e
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
ol.toc, ol.toc ol
|
|
|
|
|
counter-reset toc
|
|
|
|
|
list-style none
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
ol li
|
|
|
|
|
counter-increment toc
|
2020-07-15 14:44:27 +08:00
|
|
|
|
margin-top 6px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.toc li:before
|
|
|
|
|
content counters(toc, '.') ' '
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
ol
|
|
|
|
|
margin-left 20px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
li
|
|
|
|
|
font-weight 400
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
ol
|
|
|
|
|
margin-left 20px
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
li
|
|
|
|
|
font-weight 300
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.tools
|
|
|
|
|
margin-top 80px
|
|
|
|
|
margin-bottom 10px
|
|
|
|
|
text-align center
|
|
|
|
|
user-select none
|
|
|
|
|
|
|
|
|
|
.reward
|
|
|
|
|
margin 15px 0
|
|
|
|
|
border 1px solid #888
|
|
|
|
|
padding 5px 10px
|
|
|
|
|
display inline-block
|
|
|
|
|
color #888
|
|
|
|
|
font-weight 300
|
|
|
|
|
cursor pointer
|
|
|
|
|
margin auto
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
.vditor--fullscreen
|
|
|
|
|
z-index 9999999
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
2020-07-12 16:32:48 +08:00
|
|
|
|
@media (max-width: 768px)
|
|
|
|
|
.postPage
|
|
|
|
|
.articleDetails
|
|
|
|
|
padding 20px
|
|
|
|
|
margin-top 50px
|
2020-07-10 17:49:51 +08:00
|
|
|
|
|
|
|
|
|
.articelRightToc
|
|
|
|
|
position fixed
|
|
|
|
|
width 80%
|
|
|
|
|
top 100px
|
|
|
|
|
bottom 95px
|
|
|
|
|
right 10px
|
|
|
|
|
background-color #000
|
|
|
|
|
padding 10px
|
|
|
|
|
overflow-y auto
|
|
|
|
|
box-shadow 0 0 8px #000
|
|
|
|
|
|
|
|
|
|
.mobileToc
|
|
|
|
|
bottom 48px
|
2019-02-07 16:26:17 +08:00
|
|
|
|
</style>
|