mirror of https://github.com/halo-dev/halo-admin
Support view comment detail.
parent
f785d84e53
commit
086b6f0acd
|
@ -45,6 +45,14 @@ commentApi.create = (target, comment) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commentApi.update = (target, commentId, comment) => {
|
||||||
|
return service({
|
||||||
|
url: `${baseUrl}/${target}/comments/${commentId}`,
|
||||||
|
data: comment,
|
||||||
|
method: 'put'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a comment.
|
* Creates a comment.
|
||||||
* @param {String} target
|
* @param {String} target
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
<template>
|
||||||
|
<a-drawer
|
||||||
|
title="评论详情"
|
||||||
|
:width="isMobile()?'100%':'460'"
|
||||||
|
closable
|
||||||
|
:visible="visiable"
|
||||||
|
destroyOnClose
|
||||||
|
@close="onClose"
|
||||||
|
>
|
||||||
|
<a-row
|
||||||
|
type="flex"
|
||||||
|
align="middle"
|
||||||
|
>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-skeleton
|
||||||
|
active
|
||||||
|
:loading="detailLoading"
|
||||||
|
:paragraph="{rows: 8}"
|
||||||
|
>
|
||||||
|
<a-list itemLayout="horizontal">
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta :description="comment.author">
|
||||||
|
<span slot="title">评论者昵称:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta :description="comment.email">
|
||||||
|
<span slot="title">评论者邮箱:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta :description="comment.ipAddress">
|
||||||
|
<span slot="title">评论者 IP:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta>
|
||||||
|
<a
|
||||||
|
slot="description"
|
||||||
|
target="_blank"
|
||||||
|
:href="comment.authorUrl"
|
||||||
|
>{{ comment.authorUrl }}</a>
|
||||||
|
<span slot="title">评论者网址:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta>
|
||||||
|
<span slot="description">
|
||||||
|
<a-badge :status="comment.statusProperty.status" />
|
||||||
|
{{ comment.statusProperty.text }}
|
||||||
|
</span>
|
||||||
|
<span slot="title">评论状态:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta>
|
||||||
|
<a
|
||||||
|
slot="description"
|
||||||
|
target="_blank"
|
||||||
|
:href="options.blog_url+'/archives/'+comment.post.url"
|
||||||
|
v-if="this.type=='posts'"
|
||||||
|
>{{ comment.post.title }}</a>
|
||||||
|
<a
|
||||||
|
slot="description"
|
||||||
|
target="_blank"
|
||||||
|
:href="options.blog_url+'/s/'+comment.sheet.url"
|
||||||
|
v-else-if="this.type=='sheets'"
|
||||||
|
>{{ comment.sheet.title }}</a>
|
||||||
|
<span
|
||||||
|
slot="title"
|
||||||
|
v-if="this.type=='posts'"
|
||||||
|
>评论文章:</span>
|
||||||
|
<span
|
||||||
|
slot="title"
|
||||||
|
v-else-if="this.type=='sheets'"
|
||||||
|
>评论页面:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
<a-list-item>
|
||||||
|
<a-list-item-meta>
|
||||||
|
<template
|
||||||
|
slot="description"
|
||||||
|
v-if="editable"
|
||||||
|
>
|
||||||
|
<a-input
|
||||||
|
type="textarea"
|
||||||
|
:autosize="{ minRows: 5 }"
|
||||||
|
v-model="comment.content"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<span
|
||||||
|
slot="description"
|
||||||
|
v-html="comment.content"
|
||||||
|
v-else
|
||||||
|
></span>
|
||||||
|
<span slot="title">评论内容:</span>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-list-item>
|
||||||
|
</a-list>
|
||||||
|
</a-skeleton>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-divider class="divider-transparent" />
|
||||||
|
<div class="bottom-control">
|
||||||
|
<a-button
|
||||||
|
type="dashed"
|
||||||
|
style="marginRight: 8px"
|
||||||
|
@click="handleEditComment"
|
||||||
|
v-if="!editable"
|
||||||
|
>编辑</a-button>
|
||||||
|
<a-button
|
||||||
|
type="primary"
|
||||||
|
style="marginRight: 8px"
|
||||||
|
@click="handleUpdateComment"
|
||||||
|
v-if="editable"
|
||||||
|
>保存</a-button>
|
||||||
|
<a-popconfirm
|
||||||
|
title="你确定要将此评论者加入黑名单?"
|
||||||
|
okText="确定"
|
||||||
|
cancelText="取消"
|
||||||
|
>
|
||||||
|
<a-button type="danger">加入黑名单</a-button>
|
||||||
|
</a-popconfirm>
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
||||||
|
import commentApi from '@/api/comment'
|
||||||
|
import optionApi from '@/api/option'
|
||||||
|
export default {
|
||||||
|
name: 'CommentDetail',
|
||||||
|
mixins: [mixin, mixinDevice],
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
detailLoading: true,
|
||||||
|
editable: false,
|
||||||
|
commentStatus: commentApi.commentStatus,
|
||||||
|
options: [],
|
||||||
|
keys: ['blog_url']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'visiable',
|
||||||
|
event: 'close'
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
comment: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
visiable: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: 'posts',
|
||||||
|
validator: function(value) {
|
||||||
|
return ['posts', 'sheets', 'journals'].indexOf(value) !== -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.loadSkeleton()
|
||||||
|
this.loadOptions()
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
visiable: function(newValue, oldValue) {
|
||||||
|
this.$log.debug('old value', oldValue)
|
||||||
|
this.$log.debug('new value', newValue)
|
||||||
|
if (newValue) {
|
||||||
|
this.loadSkeleton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
loadSkeleton() {
|
||||||
|
this.detailLoading = true
|
||||||
|
setTimeout(() => {
|
||||||
|
this.detailLoading = false
|
||||||
|
}, 500)
|
||||||
|
},
|
||||||
|
loadOptions() {
|
||||||
|
optionApi.listAll(this.keys).then(response => {
|
||||||
|
this.options = response.data.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleEditComment() {
|
||||||
|
this.editable = true
|
||||||
|
},
|
||||||
|
handleUpdateComment() {
|
||||||
|
commentApi.update(this.type, this.comment.id, this.comment).then(response => {
|
||||||
|
this.$log.debug('Updated comment', response.data.data)
|
||||||
|
this.$message.success('评论修改成功!')
|
||||||
|
})
|
||||||
|
this.editable = false
|
||||||
|
},
|
||||||
|
onClose() {
|
||||||
|
this.$emit('close', false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
</style>
|
|
@ -203,6 +203,13 @@
|
||||||
>
|
>
|
||||||
<a href="javascript:;">删除</a>
|
<a href="javascript:;">删除</a>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
|
|
||||||
|
<a-divider type="vertical" />
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="javascript:;"
|
||||||
|
@click="handleShowDetailDrawer(record)"
|
||||||
|
>详情</a>
|
||||||
</span>
|
</span>
|
||||||
</a-table>
|
</a-table>
|
||||||
<div class="page-wrapper">
|
<div class="page-wrapper">
|
||||||
|
@ -243,12 +250,19 @@
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-form>
|
</a-form>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
|
<CommentDetail
|
||||||
|
v-model="commentDetailVisible"
|
||||||
|
v-if="selectComment"
|
||||||
|
:comment="selectComment"
|
||||||
|
:type="this.type"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import commentApi from '@/api/comment'
|
import commentApi from '@/api/comment'
|
||||||
import optionApi from '@/api/option'
|
import optionApi from '@/api/option'
|
||||||
import marked from 'marked'
|
import marked from 'marked'
|
||||||
|
import CommentDetail from './CommentDetail'
|
||||||
const postColumns = [
|
const postColumns = [
|
||||||
{
|
{
|
||||||
title: '昵称',
|
title: '昵称',
|
||||||
|
@ -263,22 +277,25 @@ const postColumns = [
|
||||||
title: '状态',
|
title: '状态',
|
||||||
className: 'status',
|
className: 'status',
|
||||||
dataIndex: 'statusProperty',
|
dataIndex: 'statusProperty',
|
||||||
|
width: '100px',
|
||||||
scopedSlots: { customRender: 'status' }
|
scopedSlots: { customRender: 'status' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '评论文章',
|
title: '评论文章',
|
||||||
dataIndex: 'post',
|
dataIndex: 'post',
|
||||||
|
width: '200px',
|
||||||
scopedSlots: { customRender: 'post' }
|
scopedSlots: { customRender: 'post' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '日期',
|
title: '日期',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
|
width: '170px',
|
||||||
scopedSlots: { customRender: 'createTime' }
|
scopedSlots: { customRender: 'createTime' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
dataIndex: 'action',
|
dataIndex: 'action',
|
||||||
width: '150px',
|
width: '180px',
|
||||||
scopedSlots: { customRender: 'action' }
|
scopedSlots: { customRender: 'action' }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -296,27 +313,33 @@ const sheetColumns = [
|
||||||
title: '状态',
|
title: '状态',
|
||||||
className: 'status',
|
className: 'status',
|
||||||
dataIndex: 'statusProperty',
|
dataIndex: 'statusProperty',
|
||||||
|
width: '100px',
|
||||||
scopedSlots: { customRender: 'status' }
|
scopedSlots: { customRender: 'status' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '评论页面',
|
title: '评论页面',
|
||||||
dataIndex: 'sheet',
|
dataIndex: 'sheet',
|
||||||
|
width: '200px',
|
||||||
scopedSlots: { customRender: 'sheet' }
|
scopedSlots: { customRender: 'sheet' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '日期',
|
title: '日期',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
|
width: '150px',
|
||||||
scopedSlots: { customRender: 'createTime' }
|
scopedSlots: { customRender: 'createTime' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
dataIndex: 'action',
|
dataIndex: 'action',
|
||||||
width: '150px',
|
width: '180px',
|
||||||
scopedSlots: { customRender: 'action' }
|
scopedSlots: { customRender: 'action' }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
export default {
|
export default {
|
||||||
name: 'CommentTab',
|
name: 'CommentTab',
|
||||||
|
components: {
|
||||||
|
CommentDetail
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -351,7 +374,8 @@ export default {
|
||||||
loading: false,
|
loading: false,
|
||||||
commentStatus: commentApi.commentStatus,
|
commentStatus: commentApi.commentStatus,
|
||||||
options: [],
|
options: [],
|
||||||
keys: ['blog_url']
|
keys: ['blog_url'],
|
||||||
|
commentDetailVisible: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
@ -492,6 +516,10 @@ export default {
|
||||||
name: comment.author
|
name: comment.author
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
handleShowDetailDrawer(comment) {
|
||||||
|
this.selectComment = comment
|
||||||
|
this.commentDetailVisible = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -415,6 +415,7 @@ const columns = [
|
||||||
title: '状态',
|
title: '状态',
|
||||||
className: 'status',
|
className: 'status',
|
||||||
dataIndex: 'statusProperty',
|
dataIndex: 'statusProperty',
|
||||||
|
width: '100px',
|
||||||
scopedSlots: { customRender: 'status' }
|
scopedSlots: { customRender: 'status' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -428,7 +429,8 @@ const columns = [
|
||||||
scopedSlots: { customRender: 'tags' }
|
scopedSlots: { customRender: 'tags' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '评论量',
|
title: '评论',
|
||||||
|
width: '70px',
|
||||||
dataIndex: 'commentCount'
|
dataIndex: 'commentCount'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -438,6 +440,7 @@ const columns = [
|
||||||
{
|
{
|
||||||
title: '发布时间',
|
title: '发布时间',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
|
width: '170px',
|
||||||
scopedSlots: { customRender: 'createTime' }
|
scopedSlots: { customRender: 'createTime' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue