210 lines
5.5 KiB
Vue
210 lines
5.5 KiB
Vue
<template>
|
|
<div class="comment-outer-box">
|
|
<div class="comment-box" ref="actionTabCommentRef">
|
|
<div v-if="commentList.length <= 0" class="action-box-empty">暂无评论</div>
|
|
<div v-else class="comment-list">
|
|
<el-timeline>
|
|
<el-timeline-item :timestamp="comment.createTime" placement="top" v-for="comment in commentList">
|
|
<el-card class="box-card comment-card" :body-style="{ padding: '10px' }">
|
|
<div :style="'background-color: ' + comment.color" class="head">
|
|
{{ comment.createUserName.substr(0, 1) }}
|
|
</div>
|
|
<div class="comment-user-name">
|
|
{{ comment.createUserName }}
|
|
<el-popconfirm v-if="canDeleteComment(comment)"
|
|
placement="top" width="160" trigger="click"
|
|
confirm-button-text="删除"
|
|
cancel-button-text="取消"
|
|
@confirm="deleteComment(comment.id)"
|
|
title="确定要删除此评论吗?">
|
|
<template #reference>
|
|
<el-icon class="icon-delete"><ElIconDelete /></el-icon>
|
|
</template>
|
|
</el-popconfirm>
|
|
</div>
|
|
<pre class="comment-content">{{ comment.content }}</pre>
|
|
</el-card>
|
|
</el-timeline-item>
|
|
</el-timeline>
|
|
</div>
|
|
</div>
|
|
<div class="comment-input-box">
|
|
<textarea rows="5" placeholder="发表评论" v-model="commentTextInput" :maxlength="500"></textarea>
|
|
<div class="comment-btn-box">
|
|
<el-button type="primary" size="small" @click="submitPageComment">发送</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {
|
|
Delete as ElIconDelete,
|
|
Loading as ElIconLoading,
|
|
} from '@element-plus/icons-vue'
|
|
import {toRefs, ref, reactive, onMounted, watch, defineProps, defineEmits, defineExpose, computed} from 'vue';
|
|
import {onBeforeRouteUpdate, useRoute, useRouter} from "vue-router";
|
|
import { ElMessageBox, ElMessage, ElNotification } from 'element-plus';
|
|
import pageApi from '@/assets/api/page';
|
|
import {useStorePageData} from "@/store/pageData";
|
|
import {useStoreUserData} from "@/store/userData";
|
|
|
|
let page = {
|
|
colorArr: ['#67C23A', '#409EFF', '#E6A23C', '#F56C6C', '#909399', '#303133'],
|
|
userHeadColor: {},
|
|
}
|
|
// 评论相关
|
|
let commentTextInput = ref('');
|
|
let commentList = ref([]);
|
|
let recommentInfo = ref({});
|
|
|
|
let route = useRoute();
|
|
let router = useRouter();
|
|
let storePage = useStorePageData();
|
|
let storeUser = useStoreUserData();
|
|
|
|
watch(() => storePage.pageInfo, (newVal) => {
|
|
if (storePage.pageInfo.editorType !== 0){
|
|
loadCommentList();
|
|
}
|
|
});
|
|
onMounted(() => {
|
|
loadCommentList();
|
|
});
|
|
let actionTabCommentRef = ref();
|
|
const scrollActionTabComment = () => {
|
|
setTimeout(() => {
|
|
let actionTabComment = actionTabCommentRef.value;
|
|
actionTabComment.scrollTop = actionTabComment.scrollHeight;
|
|
}, 0);
|
|
}
|
|
const loadCommentList = () => {
|
|
if (!storePage.pageInfo || !storePage.pageInfo.id) {
|
|
return;
|
|
}
|
|
cancelCommentUser();
|
|
pageApi.pageCommentList({pageId: storePage.pageInfo.id}).then((json) => {
|
|
let commentListRes = json.data || [];
|
|
for (let i = 0; i < commentListRes.length; i++) {
|
|
commentListRes[i].color = getUserHeadBgColor(commentListRes[i].createUserId);
|
|
let subCommentList = commentListRes[i].commentList || [];
|
|
for (let j = 0; j < subCommentList.length; j++) {
|
|
let subItem = subCommentList[j];
|
|
subItem.color = getUserHeadBgColor(subItem.createUserId);
|
|
}
|
|
commentListRes[i].commentList = subCommentList;
|
|
commentListRes[i].visible = false;
|
|
}
|
|
commentList.value = commentListRes;
|
|
scrollActionTabComment();
|
|
});
|
|
}
|
|
let canDeleteComment = (row) => {
|
|
return storeUser.userInfo.id === row.createUserId
|
|
|| storeUser.userInfo.id === storePage.pageInfo.createUserId;
|
|
}
|
|
const deleteComment = (id) => {
|
|
pageApi.deletePageComment({id: id}).then(() => {
|
|
// ElMessage.success("删除成功!");
|
|
loadCommentList();
|
|
});
|
|
}
|
|
const cancelCommentUser = () => {
|
|
recommentInfo.value = {};
|
|
}
|
|
const submitPageComment = () => {
|
|
if (commentTextInput.value.length <= 0) {
|
|
ElMessage.error('请输入评论内容');
|
|
return;
|
|
}
|
|
let param = {
|
|
pageId: storePage.pageInfo.id,
|
|
content: commentTextInput.value,
|
|
parentId: recommentInfo.value.id,
|
|
}
|
|
pageApi.updatePageComment(param).then((json) => {
|
|
let data = json.data;
|
|
data.color = getUserHeadBgColor(data.createUserId);
|
|
commentTextInput.value = '';
|
|
loadCommentList();
|
|
});
|
|
}
|
|
const getUserHeadBgColor = (userId) => {
|
|
let color = page.userHeadColor[userId];
|
|
if (!color) {
|
|
color = page.colorArr[Math.ceil(Math.random() * page.colorArr.length) - 1];
|
|
page.userHeadColor[userId] = color;
|
|
}
|
|
return color;
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.comment-box {
|
|
padding: 8px;
|
|
height: calc(100vh - 275px);
|
|
overflow: auto;
|
|
|
|
.comment-card {
|
|
.head {
|
|
float: left;
|
|
background-color: #ccc;
|
|
border-radius: 50%;
|
|
margin-right: 10px;
|
|
width: 45px;
|
|
height: 45px;
|
|
line-height: 45px;
|
|
text-align: center;
|
|
color: #fff;
|
|
}
|
|
|
|
.comment-user-name {
|
|
margin-bottom: 10px;
|
|
|
|
.icon-delete {
|
|
color: #888;
|
|
font-size: 13px;
|
|
cursor: pointer;
|
|
float: right;
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.comment-content {
|
|
padding: 0;
|
|
color: #666;
|
|
margin: 0;
|
|
white-space: pre-wrap;
|
|
word-wrap: break-word;
|
|
line-height: 20px;
|
|
}
|
|
}
|
|
|
|
.comment-card:hover {
|
|
.icon-delete {
|
|
display: inline-block;
|
|
}
|
|
}
|
|
}
|
|
|
|
.comment-input-box {
|
|
width: 100%;
|
|
background: #fff;
|
|
border-top: 1px solid #f1f1f1;
|
|
|
|
textarea {
|
|
resize: none;
|
|
width: 100%;
|
|
box-sizing: border-box;
|
|
border: 0;
|
|
outline: none !important;
|
|
padding: 10px;
|
|
}
|
|
|
|
.comment-btn-box {
|
|
text-align: right;
|
|
padding: 4px 15px 6px 0;
|
|
}
|
|
}
|
|
</style>
|