hbt-moore-stone-ui/component/ms-comment.htm

1342 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script type="text/x-template" id="ms-comment">
<div class="comment-container">
<!--评论开始-->
<div class="article-comment">
<a style="width: 50px;height: 50px;margin-right: 10px;">
<img src="/upload/1/people/icon/1872457333638361088.png" alt="icon">
</a>
<!--输入框-start-->
<el-form ref="form" :model="form" :rules="rules" style="width:100%;margin-top: 5px;">
<el-form-item prop="commentContent" style="margin-top: -5px">
<el-input type="textarea" placeholder="快来评论吧~" v-model="form.commentContent">
</el-input>
</el-form-item>
<el-form-item>
<el-button style="margin-left: 40px" type="primary" plain @click="send()" :disabled="!form.commentContent">提交评论</el-button>
</el-form-item>
</el-form>
<!--输入框-end-->
</div>
<!--评论结束-->
<!--评论回复列表-start-->
<div class="messages" v-if="total>0">
<div class="w-commentlist-header">
<div class="w-commentlist-total">{{total}}条评论</div>
</div>
<!--评论列表-start-->
<div class="messages-item">
<div class="w-comment-list">
<!-- 评论模型 -->
<div v-show="flag" v-for="(item,index) in commentDataList" :key="item.id + item.parentName"
style="margin-bottom: 20px;">
<!-- 父级评论start -->
<div class="w-comment-item" style="display:flex">
<!--头像默认用一个图标替代-start-->
<a class="w-comment-userpic" style="margin-right: 10px;">
<img class="w-user-pic" v-if="item.puIcon"
:src="item.puIcon" />
<img class="w-user-pic" v-else
src="/upload/1/people/icon/1872457333638361088.png" />
</a>
<!--头像默认用一个图标替代-end-->
<!--评论内容-start-->
<div class="w-comment-item-box">
<!-- 评论用户名start -->
<div class="w-comment-item-box-head">
<a class="w-comment-item-username">
{{item.peopleName?item.peopleName:'游客'}}
</a>
</div>
<!-- 评论用户名end -->
<!--具体评论内容-start-->
<div class="w-comment-item-box-content">
<p> {{item.commentContent}} </p>
<!--图片-->
<!-- <div v-if="item.commentPicture">-->
<!-- <template v-for="picture in JSON.parse(item.commentPicture)">-->
<!-- <el-image-->
<!-- style="width: 100px; height: 100px;margin: 0 10px 10px 0px"-->
<!-- :src="`{ms:global.contextPath/}`+picture.path"-->
<!-- :preview-src-list="item.pictureList"-->
<!-- >-->
<!-- </el-image>-->
<!-- </template>-->
<!-- </div>-->
<!-- &lt;!&ndash;视频&ndash;&gt;-->
<!-- <div v-if="item.commentFileJson">-->
<!-- <template v-for="file in JSON.parse(item.commentFileJson)">-->
<!-- <video class="video-demo">-->
<!-- <source :src="file.path" type="video/mp4"/>-->
<!-- </video>-->
<!-- </template>-->
<!-- </div>-->
</div>
<!--具体评论内容-start-->
<!-- 评论底部交互start -->
<div class="w-comment-item-box-bottom">
<span class="w-comment-time">{{item.commentTime}}&nbsp;&nbsp;IP 属地:{{item.commentIp}} </span>
<div class="w-comment-interaction">
<button class="w-comment-reply-btn">
<i class="iconfont icon-pinglun label"></i>
<label :for="'reply-input'+index" class="value" @click="switchShowComment(item)">
回复
</label>
</button>
<button class="w-comment-like-btn" @click="like(item)" :class="{checked:item.likeLabel=='取消'}">
<i class="iconfont icon-zan label"></i>
<span v-if="!item.likeTotal"></span>
<span class="value" v-else>
{{item.likeTotal}}
</span>
</button>
</div>
</div>
<!-- 评论底部交互end -->
<!-- 回复框start -->
<div class="w-comment-reply" v-show="item.showChildComment">
<el-input style="width: 98%;margin-right: 10px" type="text" :placeholder="'请输入回复内容'" v-model="form.replyContent"
:id="'reply-input'+index">
</el-input>
<el-button @click="reply(item)" :disabled="!form.replyContent" type="primary">发送</el-button>
</div>
<!-- 回复框end -->
</div>
</div>
<!-- 父级评论end -->
<!-- 子评论列表start -->
<div
v-for="child,index in (showChildComment?item.childCommentDataLists:item.childCommentDataLists.slice(0,2))"
:key="child.id+child.parentName">
<div class="w-comment-item w-child-reply" style="display:flex">
<!--头像默认用一个图标替代-start-->
<a class="w-comment-userpic" style="margin-right: 10px;">
<img class="w-user-pic" v-if="child.puIcon"
:src="child.puIcon" />
<img class="w-user-pic" v-else
src="https://pic2.zhimg.com/v2-abed1a8c04700ba7d72b45195223e0ff_xl.jpg?source=32738c0c" />
</a>
<!--头像默认用一个图标替代-end-->
<!--评论内容-start-->
<div class="w-comment-item-box">
<!-- 评论用户名start -->
<div class="w-comment-item-box-head">
<a class="w-comment-item-username">
{{child.peopleName?child.peopleName:'游客'}}
</a>
<i class="el-icon-caret-right"
style="font-size: 12px;color:rgb(153, 153, 153);margin: 0px 4px;"></i>
<a class="w-comment-item-replyname">{{child.parentName?child.parentName:'游客'}}</a>
</div>
<!-- 评论用户名end -->
<!--具体评论内容-start-->
<div class="w-comment-item-box-content">
<p> {{child.commentContent}} </p>
</div>
<!--具体评论内容-start-->
<!-- 评论底部交互start -->
<div class="w-comment-item-box-bottom">
<span class="w-comment-time">{{child.commentTime}}&nbsp;&nbsp;IP 属地:{{item.commentIp}} </span>
<div class="w-comment-interaction">
<button class="w-comment-reply-btn">
<i class="iconfont icon-pinglun label"></i>
<label class="value" :for="'child-reply'+index" @click="switchShowComment(child)">
回复
</label>
</button>
<button class="w-comment-like-btn" @click="like(child)"
:class="{checked:child.likeLabel=='取消'}">
<i class="iconfont icon-zan label"></i>
<span v-if="!child.likeTotal"></span>
<span class="value" v-else>
{{child.likeTotal}}
</span>
</button>
</div>
</div>
<!-- 评论底部交互end -->
<!-- 回复框start -->
<div class="w-comment-reply" v-show="child.showChildComment">
<el-input style="width: 98%;margin-right: 10px" type="text" :placeholder="'请输入回复内容'" v-model="form.replyContent"
:id="'child-reply'+index">
</el-input>
<el-button @click="reply(child)" :disabled="!form.replyContent" type="primary">发送</el-button>
</div>
<!-- 回复框end -->
</div>
</div>
</div>
<!-- 子评论列表end -->
<!-- 当子列表大于2时出现start -->
<button class="w-show-other-childcomment"
v-if="item.childCommentDataLists.length > 2 && item.childCommentDataLists.length <= 5 && !showChildComment"
@click="showOtherchildComment(item)">
展开其他 {{item.childCommentDataLists.length - 2}} 条回复<i class="el-icon-arrow-right"></i>
</button>
<button class="w-show-other-childcomment" v-else-if="item.childCommentDataLists.length > 5"
@click="showAllChildComment(item)">
查看全部 {{item.childCommentDataLists.length}} 条回复<i class="el-icon-arrow-right"></i>
</button>
<!-- 当子列表大于2时出现end -->
</div>
<!-- -->
<el-dialog title="评论回复" :visible.sync="dialogTableVisible" v-if="currentComment" class="w-dialog-container"
:lock-scroll="false">
<div class="w-dialog-reply">
<div class="current-comment">
<div class="w-comment-item" style="display:flex">
<!--头像默认用一个图标替代-start-->
<a class="w-comment-userpic" style="margin-right: 10px;">
<img class="w-user-pic" v-if="currentComment.puIcon"
:src="currentComment.puIcon" />
<img class="w-user-pic" v-else
src="https://pic2.zhimg.com/v2-abed1a8c04700ba7d72b45195223e0ff_xl.jpg?source=32738c0c" />
</a>
<!--头像默认用一个图标替代-end-->
<!--评论内容-start-->
<div class="w-comment-item-box">
<!-- 评论用户名start -->
<div class="w-comment-item-box-head">
<a class="w-comment-item-username">
{{currentComment.peopleName?currentComment.peopleName:'游客'}}
</a>
</div>
<!-- 评论用户名end -->
<!--具体评论内容-start-->
<div class="w-comment-item-box-content">
<p> {{currentComment.commentContent}} </p>
</div>
<!--具体评论内容-start-->
<!-- 评论底部交互start -->
<div class="w-comment-item-box-bottom">
<span class="w-comment-time">{{currentComment.commentTime}}&nbsp;&nbsp;IP 属地:{{item.commentIp}} </span>
<div class="w-comment-interaction">
<button class="w-comment-reply-btn">
<i class="iconfont icon-pinglun label"></i>
<label class="value" :for="'dialog-reply'+currentComment.puNickname"
@click="switchShowComment(currentComment)">
回复
</label>
</button>
<button class="w-comment-like-btn" @click="like(currentComment)"
:class="{checked:currentComment.likeLabel=='取消'}">
<i class="iconfont icon-zan label"></i>
<span v-if="!currentComment.likeTotal"></span>
<span class="value" v-else>
{{currentComment.likeTotal}}
</span>
</button>
</div>
</div>
<!-- 评论底部交互end -->
<div class="w-comment-reply" v-show="currentComment.showChildComment">
<el-input style="width: 98%" type="text" :placeholder="'请输入回复内容'" v-model="form.replyContent"
:id="'dialog-reply'+currentComment.puNickname">
</el-input>
<el-button @click="reply(currentComment)" :disabled="!form.replyContent" type="primary">发送
</el-button>
</div>
</div>
</div>
</div>
<div class="w-reply-list">
<div class="w-commentlist-header">
<div class="w-commentlist-total">{{currentComment.childCommentDataLists.length}}条回复</div>
</div>
<div class="w-reply-list-container">
<div class="w-reply-item" v-for="childReply,index in currentComment.childCommentDataLists"
:key="childReply.id">
<div class="w-comment-item w-child-reply" style="display:flex">
<!--头像默认用一个图标替代-start-->
<a class="w-comment-userpic" style="margin-right: 10px;">
<img class="w-user-pic" v-if="childReply.puIcon"
:src="childReply.puIcon" />
<img class="w-user-pic" v-else="childReply.puIcon"
src="https://pic2.zhimg.com/v2-abed1a8c04700ba7d72b45195223e0ff_xl.jpg?source=32738c0c" />
</a>
<!--头像默认用一个图标替代-end-->
<!--评论内容-start-->
<div class="w-comment-item-box">
<!-- 评论用户名start -->
<div class="w-comment-item-box-head">
<a class="w-comment-item-username">
{{childReply.peopleName?childReply.peopleName:'游客'}}
</a>
<i class="el-icon-caret-right"
style="font-size: 12px;color:rgb(153, 153, 153);margin: 0px 4px;"></i>
<a class="w-comment-item-replyname">{{childReply.parentName?childReply.parentName:'游客'}}</a>
</div>
<!-- 评论用户名end -->
<!--具体评论内容-start-->
<div class="w-comment-item-box-content">
<p> {{childReply.commentContent}} </p>
</div>
<!--具体评论内容-start-->
<!-- 评论底部交互start -->
<div class="w-comment-item-box-bottom">
<span class="w-comment-time">{{childReply.commentTime}}&nbsp;&nbsp;IP 属地:{{item.commentIp}} </span>
<div class="w-comment-interaction">
<button class="w-comment-reply-btn" @click="switchShowComment(childReply)">
<i class="iconfont icon-pinglun label"></i>
<label class="value" :for="'dialog-reply'+index">
回复
</label>
</button>
<button class="w-comment-like-btn" @click="like(childReply)"
:class="{checked:reply.likeLabel=='取消'}">
<i class="iconfont icon-zan label"></i>
<span v-if="!reply.likeTotal"></span>
<span class="value" v-else>
{{childReply.likeTotal}}
</span>
</button>
</div>
</div>
<!-- 评论底部交互end -->
<!-- 回复框start -->
<div class="w-comment-reply" v-show="childReply.showChildComment">
<el-input style="width: 98%" type="text" :placeholder="'请输入回复内容'" v-model="form.replyContent"
:id="'dialog-reply'+index">
</el-input>
<el-button @click="reply(childReply)" :disabled="!form.replyContent" type="primary">发送
</el-button>
</div>
<!-- 回复框end -->
</div>
</div>
</div>
</div>
</div>
</div>
</el-dialog>
</div>
</div>
<!--评论列表-end-->
<!-- 当子列表大于2时出现start -->
<button class="w-show-other-comment"
:style="loadMoreStyle"
@click="showNextComment()"
:disabled="isMoreDisabled"
>
{{moreText}}<i class="el-icon-arrow-right"></i>
</button>
<!-- 当子列表大于2时出现end -->
</div>
<div v-else class="emptyText">
<span>{{emptyText}}</span>
</div>
<!--评论回复列表-end-->
</div>
</script>
<script>
Vue.component('ms-comment',{
template: "#ms-comment",
name: "ms-comment",
props:{
// 业务编号
dataId:{
type: String
},
// 当前页
pageNo:{
type: String
},
// 业务名称(文章标题)
dataTitle:{
type: String
},
// 业务类型
dataType: {
type: String
},
},
data: function(){
return{
// 加载更多控制
loadMoreStyle:'',
// 控制加在更多按钮的禁用
isMoreDisabled: false,
// 加载更多文本
moreText: '加载更多',
// 已弃用web接口默认移除验证码校验
verifCode: ms.base + "/code?t=" + (new Date).getTime(),//ms.base + "/code?t=" + new Date().getTime()
windowScrollStyle: '',
flag: true,
commentDataList: [], //评论表列表
pageSize: 10, //页面数量
currentPage: 1, //初始页,
emptyText: '',
//总记录数量
total: 0,
form: {
//评论内容
commentContent: '',
//文章商品id
dataId: this.dataId,
//业务链接
collectionDataUrl: window.location.href,
//业务类型
dataType: this.dataType,
// 业务名称
dataTitle: this.dataTitle,
//回复内容
replyContent: '',
// 评论图片
commentPicture: [],
// 附件JSON
commentFileJson: [],
// 评论打分
commentPoints: 0
},
rules: {
commentContent: [{
// "required": true,
// "message": "请输入评论"
}]
},
isVisitor: 'false', //是否开启游客
// likeLabel: '点赞', //评论点赞label
dialogTableVisible: false,
showChildComment: false, //是否展开其他的子评论
dialogTableVisible: false,
// 展示当前评论的所有子评论
currentComment: null,
// 评价颜色
commentPointsColor: ['#99A9BF', '#F7BA2A', '#FF9900'],
}
},
computed: {
//表格最大高度 用来自适应
tableHeight: function () {
return document.documentElement.clientHeight - 171;
}
},
methods: {
// 加载更多
showNextComment: function () {
this.pageNo = this.pageNo+1
// 默认返回了所有数据,此方法弃用
// this.list()
},
//初始化评论数据
initCommentItem: function(data) {
//回复框的显示与隐藏
data.showChildComment = false
//初始化评论点赞总数
data.likeTotal = 0
//初始化评论点赞的状态
data.likeLabel = "点赞"
//初始化子评论列表
data.childCommentDataLists = []
// 查询当前评论的点赞数
ms.http.post( ms.base + "/attention/collectionLog/count.do", {
dataId: data.id,
dataType: '评论点赞'
}).then(function (res) {
// 将点赞数添加到data中
if (res.result) {
data.likeTotal = res.data;
}
})
},
//展开其他的子评论列表
showOtherchildComment: function(item) {
this.showChildComment = true
this.childCommentList = item.childCommentDataLists
},
//展示所有的子评论列表
showAllChildComment: function(item) {
this.dialogTableVisible = true
this.currentComment = item
},
//转换时间
dateHandler: function(millisecond) {
var timdedetail = millisecond; //假如是10位毫秒需要乘1000
//获取年份
var year = new Date(timdedetail).getFullYear();
//获取月份获取的月份比实际小1所以在使用的时候需要+1
var month = new Date(timdedetail).getMonth() + 1;
//获取日
var date = new Date(timdedetail).getDate();
//获取时
var hours = new Date(timdedetail).getHours();
//获取分
var minutes = new Date(timdedetail).getMinutes();
//获取秒
var seconds = new Date(timdedetail).getSeconds();
//组合格式为年-月-日 时2021-7-5 21:21:21
var time = year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds;
return time
},
// 回复评论
reply: function (item) {
var that = this;
ms.http.post( ms.base + '/people/comment/save.do', {
commentId: item.id,
dataId: that.form.dataId,
commentContent: that.form.replyContent,
dataType: that.dataType, //业务类型
dataTitle: that.dataTitle,
}).then(function (res) {
if (res.result) {
that.form.replyContent = ""
item.showChildComment = false
that.$notify({
title: '成功',
type: 'success',
message: '回复成功!',
duration: 1000,
onClose: function () {
that.$refs.form.resetFields()
location.reload();
}
});
} else {
that.clearForm();
that.$message.error(res.msg);
}
}).catch(function (err) {
that.clearForm();
that.$notify({
title: '提示',
dangerouslyUseHTMLString: true,
message: '需要安装评论插件才能使用请先进入后台MStore安装评论插件使用。<span style="color: #409EFF; text-decoration: underline;">'
+'<a href="http://store.mingsoft.net/#/detail?id=268&type=plugin" target="_blank">点击查看评论插件</a></span>',
type: 'warning'
});
console.log(err);
})
},
// 评论点赞
like: function (item) {
var that = this
ms.http.post( ms.base + "/people/attention/collection/save.do", {
dataId: item.id,
dataType: '评论点赞',
collectionDataTitle: item.commentContent,
}).then(function (res) {
if (res.data){
that.$message({
message: '点赞成功',
type: 'success'
});
item.likeLabel = '取消'
} else {
that.$message('取消点赞');
item.likeLabel = '点赞'
}
that.likeTotals(item)
});
},
// 评论点赞数
likeTotals: function (item) {
var that = this;
//用户-关注接口
ms.http.post( ms.base + "/attention/collection/queryCollectionCount.do", {
dataIds: item.id,
dataType: "评论点赞"
}).then((res) => {
item.likeTotal = 0;
if (res.data && res.data.rows.length > 0) {
item.likeTotal = res.data.rows[0].dataCount;
}
})
},
// 判断是否开启游客
// 已弃用,开发者可以自由扩展游客功能
enableVisitor: function () {
var that = this;
ms.http.get( ms.base + '/mdiy/config/get.do', {
configName: '评论配置',
key: 'enableVisitor'
}).then(function (res) {
if (res.result) {
that.isVisitor = res.data
}
})
},
hide: function (arr) {
var that = this
arr.forEach(function (x) {
let e = that.$el.querySelector("#key_" + x)
if (e) {
e.style.display = 'none'
}
})
},
//vue方法异步请求评论保存接口
send: function () {
var that = this;
that.form.dataType = that.dataType;
ms.http.post( ms.base + '/people/comment/save.do', that.form).then(function (res) {
if (res.result) {
that.$notify({
title: '成功',
type: 'success',
message: '评论成功!',
duration: 1000,
onClose: function () {
that.$refs.form.resetFields()
location.reload();
}
});
} else {
that.clearForm();
that.$message.error(res.msg);
}
}).catch(function (err) {
that.clearForm();
that.$notify({
title: '提示',
dangerouslyUseHTMLString: true,
message: '需要安装会员插件才能使用请先进入后台MStore安装会员插件使用。<span style="color: #409EFF; text-decoration: underline;">' +
'<a href="http://store.mingsoft.net/#/detail?id=269&type=plugin" target="_blank">点击查看会员插件</a></span>',
type: 'warning'
});
})
},
//查询所有评论
list: function () {
var that = this;
ms.http.post( ms.base + '/comment/list.do', {
dataId: that.dataId,
dataType: that.dataType,
//当前页数
pageNo: that.pageNo,
//每页文章条数
pageSize: 9999,
}).then(function (res) {
if (res.result) {
// 所有评论
var allComment = res.data.rows;
if (allComment.length <= 0) {
that.emptyText = '还没有评论,发表第一个评论吧'
} else {
// 控制 加载更多按钮是否显示
if (allComment.length < 10){
// 按钮添加禁用
that.loadMoreStyle = "background:none #1214191a;cursor: not-allowed;"
// 按钮禁用
that.isMoreDisabled = true
// 更改提示信息
that.moreText = '已加载全部'
}
ms.http.get( ms.base + '/comment/count.do', {
dataId: that.dataId,
dataType: that.dataType
}).then(function (res) {
that.total = res.data;
});
var commentDataIds = [];
// 取出dataId
allComment.forEach(function (data) {
commentDataIds.push(data.id);
})
var allCommentCount = [];
// 先请求一遍点赞数据
ms.http.post( ms.base + "/attention/collection/queryCollectionCount.do", {
dataIds: commentDataIds.toString(),
dataType: '评论点赞'
}).then(function (res) {
allCommentCount = res.data;
allComment.forEach(function (comment) {
comment.likeTotal = 0;
comment.likeLabel = '点赞';
allCommentCount.rows.forEach(function (item) {
if (comment.id == item.dataId) {
comment.likeTotal = item.dataCount;
comment.likeLabel = item.isLike ? '取消' : '点赞';
}
})
})
// 评论数据处理
that.commentDataFormat(allComment);
}).catch(function (err) {
console.log(err);
// 异常处理,抛异常且处理评论数据格式
that.commentDataFormat(allComment);
})
}
} else{
that.$notify({
title: '失败',
message: res.msg,
type: 'warning'
});
}
}).catch(function (err){
that.emptyText = '需要安装评论插件才能使用请先进入后台MStore安装评论插件使用。'
that.$notify({
title: '提示',
dangerouslyUseHTMLString: true,
message: '需要安装评论插件才能使用请先进入后台MStore安装评论插件使用。<span style="color: #409EFF; text-decoration: underline;">' +
'<a href="http://store.mingsoft.net/#/detail?id=268&type=plugin" target="_blank">点击查看评论插件</a></span>',
type: 'warning'
});
})
},
//
commentDataFormat: function (allComment) {
var that = this;
// 第一级评论
var topComment = allComment.filter(c => !c.topId || c.topId==0)
// 遍历所有评论,设置层级关系
topComment.forEach(function (data) {
// 如果有peopleInfo 取出头像
if (data.peopleInfo && data.peopleInfo!='{}'){
var peopleInfo = JSON.parse(data.peopleInfo)
data.puIcon = peopleInfo.puIcon;
}
// 处理ip
if (data.commentIp){
data.commentIp = JSON.parse(data.commentIp).addr;
}
//回复框的显示与隐藏
data.showChildComment = false
//初始化子评论列表
data.childCommentDataLists = [];
// 当前遍历到评论的所有子评论
var childComments = allComment.filter(item => item.topId && item.topId==data.id)
childComments.forEach(function (childData) {
// 子评论头像
if (childData.peopleInfo && childData.peopleInfo!='{}'){
var peopleInfo = JSON.parse(childData.peopleInfo)
childData.puIcon = peopleInfo.puIcon;
}
// 处理ip
if (childData.commentIp){
childData.commentIp = JSON.parse(childData.commentIp).addr;
}
//回复框的显示与隐藏
childData.showChildComment = false
// 如果父评论为顶级评论则直接赋值
if (childData.commentId == data.id){
childData.parentName = data.peopleName;
} else {
// 找到当前遍历子评论的父评论
var parentComment = childComments.find(function (item) {
return item.id == childData.commentId;
})
if (parentComment){
childData.parentName = parentComment.peopleName;
}
}
// 将处理完的数据push到顶级评论的子集中
data.childCommentDataLists.push(childData);
});
// 存放顶级评论
that.commentDataList.push(data)
});
},
// 清理评论表单数据
clearForm: function () {
var that = this;
that.$refs.form.resetFields();
},
show: function (arr) {
var that = this
arr.forEach(function (x) {
let e = that.$el.querySelector("#key_" + x)
if (e) {
e.style.display = 'flex'
}
})
},
//切换回复框
switchShowComment: function(comment) {
if (comment.showChildComment) comment.showChildComment = !comment.showChildComment
else {
this.commentDataList.forEach((item) => {
item.showChildComment = false;
item.childCommentDataLists.forEach((child) => {
child.showChildComment = false;
})
})
comment.showChildComment = true
}
},
switchShow: function (arr) {
var that = this
arr.forEach(function (x) {
let e = that.$el.querySelector("#key_" + x)
if (e) {
e.style.display = e.style.display == 'none' ? 'flex' : 'none'
}
})
},
windowScroll: function() {
// 滚动条距离页面顶部的距离
// 以下写法原生兼容
let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
if (scrollTop > 200) {
this.windowScrollStyle = "rgba(255, 255, 255, 1)"
} else {
this.windowScrollStyle = "rgba(255, 255, 255, 0.4)"
}
},
// 验证码 看不清换一张
code: function () {
this.verifCode = ms.base + "/code?t=" + (new Date).getTime();//
},
// 移除图片交互效果
commentPictureHandRemove: function (file, files) {
var index = -1;
index = this.form.commentPicture.findIndex(function (text) {
return text == file;
});
if (index != -1) {
this.form.commentPicture.splice(index, 1);
}
},
//上传超过限制
commentPictureHandExceed: function (files, fileList) {
this.$notify({
title: '失败',
message: '当前最多上传5张图片',
type: 'warning'
});
},
// 上传图片成功后
successImg: function (response, file, fileList) {
var that = this;
if(response.result){
that.form.commentPicture.push({
url: response.data,
name: file.name,
uid: file.uid,
});
}else {
this.$notify({
title: '失败',
message: response.msg,
type: 'warning'
});
}
},
// 附件上传
// 点击已上传文件
fileHandlePreview: function (file){
console.log(file);
},
// 移除附件前
beforeRemove: function (file, fileList){
return this.$confirm(`确定移除 ${ file.name }`);
},
// 移除附件
handleRemove: function (file,fileList){
var fileJsonList = this.form.commentFileJson;
this.form.commentFileJson = fileJsonList.filter(function (fileJson){
return fileJson.uid != file.uid;
})
},
// 超出限制
fileHandleExceed: function (files, fileList){
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
// 上传附件成功后
successFile: function (response, file, fileList) {
var that = this;
if(response.result){
that.form.commentFileJson.push({
url: response.data,
name: file.name,
uid: file.uid,
});
}else {
this.$notify({
title: '失败',
message: response.msg,
type: 'warning'
});
}
},
// 视频播放
playVideo: function (){
var myVideo = document.getElementsByClassName("video-demo");
if (myVideo.paused)
myVideo.play();
else
myVideo.pause();
}
},
created: function () {
this.list();
this.enableVisitor();
},
mounted: function () {
window.addEventListener('scroll', this.windowScroll)
},
beforeDestroy: function () {
window.removeEventListener('scroll', this.windowScroll)
}
})
</script>
<style scoped>
.thumbsUpchecked {
color: #06f;
}
.w-show-other-comment{
width: 50%;
display: inline-block;
font-size: 14px;
line-height: 32px;
text-align: center;
cursor: pointer;
background: none rgba(133, 144, 166, 0.1);
border: 1px solid transparent;
border-radius: 3px;
margin: 10px 0px 10px 150px;
padding: 0px 6px 0px 12px;
height: 32px;
color: rgb(133, 144, 166);
font-weight: 500;
}
.emptyText {
display: flex;
width: 50%;
min-height: 100px;
flex-direction: column;
justify-content: center;
align-items: center;
border: 1px solid #c1c1c1;
border-radius: 2px;
font-size: 20px;
color: rgb(133, 144, 166);
margin-bottom: 40px;
}
.messages {
margin-bottom: 10px;
display: flex;
flex-direction: column;
align-items: stretch;
width: 50%;
border: 1px solid rgb(235, 235, 235);
border-radius: 4px;
box-sizing: border-box;
}
.messages a:hover {
cursor: pointer;
color: #444444;
}
.messages .w-comment-list {
padding-top: 10px;
padding-bottom: 10px;
}
.messages .w-comment-list .w-show-other-childcomment {
display: inline-block;
font-size: 14px;
line-height: 32px;
text-align: center;
cursor: pointer;
background: none rgba(133, 144, 166, 0.1);
border: 1px solid transparent;
border-radius: 3px;
margin: 10px 0px 10px 54px;
padding: 0px 6px 0px 12px;
height: 32px;
color: rgb(133, 144, 166);
font-weight: 500;
}
.messages .w-commentlist-header {
box-sizing: border-box;
position: relative;
flex: 0 0 auto;
padding-left: 20px;
padding-right: 20px;
height: 50px;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: justify;
justify-content: space-between;
display: flex;
}
.messages .w-commentlist-header::before {
display: block;
content: " ";
position: absolute;
inset: -50%;
pointer-events: none;
transform: scale(0.5, 0.5);
border-bottom: 1px solid rgb(235, 235, 235);
}
.messages .w-commentlist-header .w-commentlist-total {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
font-size: 15px;
color: rgb(68, 68, 68);
font-weight: 600;
}
.messages .w-comment-item {
box-sizing: border-box;
display: flex;
padding: 10px 20px 14px;
}
.w-comment-item .w-comment-userpic {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
color: rgb(23, 81, 153);
flex: 0 0 auto;
height: 24px;
width: 24px;
}
.w-comment-item .w-comment-userpic .w-user-pic {
box-sizing: border-box;
max-width: 100%;
background-color: rgb(255, 255, 255);
width: 24px;
height: 24px;
border-radius: 2px;
filter: brightness(0.95);
flex: 0 0 auto;
}
.messages .w-comment-item-box-head {
display: flex;
align-items: center;
}
.messages .w-comment-item-box-head .w-comment-item-username,
.messages .w-comment-item-box-head .w-comment-item-replyname {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
font-size: 15px;
font-weight: bold;
text-decoration: none;
color: #444444;
}
.messages .w-comment-item-box {
width: 100%;
}
.messages .w-comment-item-box .w-comment-reply {
box-sizing: border-box;
margin: 8px 0px 0px;
min-width: 0px;
flex: 1 1 auto;
display: flex;
}
.messages .w-comment-item-box-content {
color: rgb(68, 68, 68);
overflow-wrap: break-word;
font-size: 15px;
line-height: 21px;
margin-top: 5px;
box-sizing: border-box;
}
.messages .w-comment-item-box-bottom {
box-sizing: border-box;
margin: 4px 0px 0px;
min-width: 0px;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: justify;
justify-content: space-between;
display: flex;
}
.messages .w-comment-item-box-bottom .w-comment-time {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
-webkit-box-align: center;
align-items: center;
flex: 0 0 auto;
font-size: 14px;
color: rgb(153, 153, 153);
display: flex;
}
.w-comment-interaction button {
margin-left: 16px;
}
.w-comment-interaction .w-comment-reply-btn {
display: inline-block;
padding: 0px;
font-size: 14px;
line-height: inherit;
color: rgb(133, 144, 166);
text-align: center;
cursor: pointer;
background: none transparent;
border: none;
border-radius: 0px;
height: auto;
}
.w-comment-interaction .w-comment-reply-btn label {
cursor: pointer;
}
.w-comment-interaction .w-comment-like-btn {
display: inline-block;
padding: 0px;
font-size: 14px;
line-height: inherit;
color: rgb(133, 144, 166);
text-align: center;
cursor: pointer;
background: none transparent;
border: none rgb(133, 144, 166);
border-radius: 0px;
height: auto;
}
.w-comment-interaction .checked {
color: rgb(0, 97, 242);
}
.messages .w-child-reply {
padding: 10px 20px 14px 54px;
}
/* 弹出全部回复 */
.w-dialog-container {
overflow: hidden auto;
z-index: 2001;
display: flex;
flex-direction: column;
justify-content: center;
position: fixed;
}
.el-dialog__title {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
color: rgb(68, 68, 68);
font-weight: 600;
}
.el-dialog__body {
overflow-y: scroll;
padding: 0;
}
.current-comment {
border-top: 1px solid rgb(235, 235, 235);
border-bottom: 20px solid rgba(133, 144, 166, 0.1);
padding: 20px;
}
.current-comment .w-comment-item {
padding: 0;
}
.el-dialog {
margin-top: 0 !important;
height: calc(100vh - 48px);
display: flex;
flex-direction: column;
position: relative;
z-index: 1;
box-sizing: border-box;
max-height: calc(100vh - 48px);
box-sizing: border-box;
margin: 0 auto;
width: 700px;
}
.w-reply-list-container .w-reply-item {
padding: 20px;
}
.w-reply-list-container .w-reply-item .w-child-reply {
padding: 0;
}
.w-reply-bottom-input {
box-sizing: border-box;
margin: 0px;
min-width: 0px;
display: flex;
flex: 0 0 auto;
padding: 10px 20px;
box-shadow: rgb(18 18 18 / 12%) 0px -1px 3px;
}
.w-reply-bottom-input .w-avatar {
box-sizing: border-box;
margin: 0px 10px 0px 0px;
min-width: 0px;
max-width: 100%;
background-color: rgb(255, 255, 255);
width: 40px;
height: 40px;
border-radius: 3px;
}
.comment-container {
width: 100%;
}
.comment-container .article-comment {
display: flex;
box-sizing: border-box;
border-top-left-radius: 0px;
padding-bottom: 12px;
flex-wrap: nowrap;
border-bottom-left-radius: 0px;
width: 50%;
border-bottom-right-radius: 0px;
margin-bottom: 0px;
border-top-right-radius: 0px;
padding-top: 12px;
margin-top: 30px;
}
.article-comment>span {
padding-bottom: 0px;
color: #333333;
flex-direction: row;
word-wrap: break-word;
display: inline-block;
padding-right: 0px;
width: 100%;
font-size: 32PX;
margin-bottom: 6px;
padding-top: 0px;
padding-left: 0px;
margin-top: 0px;
}
.article-comment .ms-input {
border-color: #DCDFE6;
background-color: #FFFFFF;
align-items: center;
flex-direction: row;
display: flex;
padding-right: 4px;
box-sizing: border-box;
justify-content: space-between;
border-top-left-radius: 2px;
padding-bottom: 0px;
flex-wrap: nowrap;
border-bottom-left-radius: 2px;
border-width: 1px;
width: 100%;
border-bottom-right-radius: 2px;
border-top-right-radius: 2px;
margin-bottom: 0px;
padding-top: 0px;
border-style: solid;
padding-left: 4px;
margin-top: 0px;
height: 100px;
}
.article-comment .ms-input span {
color: #DCDFE6;
flex-direction: row;
word-wrap: break-word;
display: inline-block;
padding-right: 0px;
border-top-left-radius: 0px;
padding-bottom: 0px;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
border-top-right-radius: 0px;
font-size: 14PX;
padding-top: 0px;
padding-left: 0px;
}
.article-comment>.post-comment {
cursor: pointer;
background-color: #0099ff;
color: #FFFFFF;
text-align: center;
display: inline-block;
padding-right: 20px;
box-sizing: border-box;
border-top-left-radius: 8px;
padding-bottom: 0px;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
line-height: 42px;
font-size: 16px;
margin-bottom: 0px;
border-top-right-radius: 8px;
padding-top: 0px;
padding-left: 20px;
margin-top: 10px;
height: 42px;
}
.article-comment>.hot-comment {
padding-bottom: 0px;
flex-wrap: nowrap;
flex-direction: column;
display: flex;
padding-right: 0px;
width: 100%;
box-sizing: border-box;
padding-top: 0px;
padding-left: 0px;
justify-content: center;
margin-top: 20px;
}
.article-comment>.hot-comment span {
flex-direction: row;
word-wrap: break-word;
display: inline-block;
width: 100%;
font-size: 16PX;
line-height: 36px;
margin-top: 0px;
height: 36px;
}
.article-comment>.hot-comment div {
padding-bottom: 0px;
flex-wrap: nowrap;
flex-direction: row;
display: flex;
padding-right: 0px;
width: 100%;
box-sizing: border-box;
padding-top: 0px;
padding-left: 0px;
margin-top: 12px;
height: 100px;
}
.article-comment>.hot-comment div img {
width: 100%;
margin-top: 0px;
height: 100%;
}
.el-upload--picture-card i {
line-height: unset !important;
}
</style>