Преглед на файлове

fix:5.4.3 模版更新

msgroup преди 10 месеца
родител
ревизия
21c53766ab
променени са 2 файла, в които са добавени 1462 реда и са изтрити 0 реда
  1. 1340 0
      src/main/webapp/template/1/default/component/ms-comment.htm
  2. 122 0
      src/main/webapp/template/1/default/component/ms-mattention.htm

+ 1340 - 0
src/main/webapp/template/1/default/component/ms-comment.htm

@@ -0,0 +1,1340 @@
+<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.$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>

+ 122 - 0
src/main/webapp/template/1/default/component/ms-mattention.htm

@@ -0,0 +1,122 @@
+<script type="text/x-template" id="ms-mattention">
+	<div class="interaction-like interaction-btn" :class="{thumbsUpchecked:thumbsUp == true}">
+		<i :class="icon" @click="saveAttention()"></i>
+		<span class="value">
+            {{attentionTotal}}
+		</span>
+	</div>
+</script>
+<script>
+	Vue.component('ms-mattention',{
+		template: "#ms-mattention",
+		name: "ms-mattention",
+		props:{
+			// 业务编号
+			dataId:{
+				type: String
+			},
+			// 类型
+			dataType:{
+				type: String
+			},
+			// 图标
+			icon:{
+				type: String
+			},
+			// 标题
+			label:{
+				type: String
+			}
+		},
+		data: function(){
+			return{
+				// 数量
+				attentionTotal: 0,
+				thumbsUp: false,
+			}
+		},
+		methods: {
+			// 保存
+			saveAttention: function () {
+				var that = this
+				ms.http.post( ms.base + "/people/attention/collection/save.do", {
+					dataId: that.dataId,
+					dataType: that.dataType,
+					collectionDataTitle: that.label,
+				}).then(function (res) {
+					if (res.result) {
+						that.attentionTotals(that.dataType)
+						that.thumbsUp = res.data;
+					}
+				});
+			},
+			// 关注数量
+			attentionTotals: function (dataType) {
+				var that = this;
+				//用户-关注接口
+				ms.http.post(ms.base + "/attention/collection/queryCollectionCount.do", {
+					dataIds: that.dataId,
+					dataType: dataType
+				}).then(function (res) {
+					if(res.result && res.data.rows.length > 0){
+						that.attentionTotal = 0;
+						res.data.rows.forEach(function (item) {
+							if (item.dataId == that.dataId) {
+								that.attentionTotal = item.dataCount;
+								if (item.isLike) {
+									that.thumbsUp = item.isLike;
+								}
+							}
+						})
+					} else {
+						that.attentionTotal = 0
+					}
+				}).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=265&type=plugin" target="_blank">点击查看关注插件</a></span>',
+						type: 'warning'
+					});
+				})
+			},
+		},
+		created: function () {
+			this.icon = "iconfont "+this.icon+" label"
+			this.attentionTotals(this.dataType)
+		}
+	})
+</script>
+<style scoped>
+	.news-detail .detail-bottom-interaction .interaction-like {
+		min-height: 50px;
+		margin-right: 20px;
+		align-items: center;
+		flex-wrap: nowrap;
+		flex-direction: row;
+		display: flex;
+		flex-shrink: 0;
+		width: unset;
+		box-sizing: border-box;
+		margin-top: 0px;
+		height: 100%;
+	}
+
+	.news-detail .detail-bottom-interaction .interaction-like .label {
+		margin-right: 5px;
+		font-size: 28PX;
+		margin-top: -8px;
+	}
+
+	.news-detail .detail-bottom-interaction .interaction-like .value {
+		margin-right: 0px;
+		flex-direction: row;
+		word-wrap: break-word;
+		display: inline-block;
+	}
+
+	.interaction-btn {
+		cursor: pointer;
+	}
+</style>