| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340 |
- <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>-->
- <!-- <!–视频–>-->
- <!-- <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}} 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}} 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}} 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}} 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.$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>
|