模仿qq空间评论以及回复

先看需求是怎么样的:

再看评论表结构的设计:

 

create table t_comment
(
  id varchar(32) primary key, #主键Id
  customer_id varchar(32) not null, #用户Id
  parent_comment_id varchar(32) not null, #父评论Id
  content_id varchar(32) not null, #评论对象的Id
  type int(11), #评论对象的类型
  content varchar(140) null, #评论内容
  comment_date varchar(10) null, #评论日期
  comment_time varchar(12) null, #评论时间
  state int(11) null #评论的状态 0显示或者1不显示
);


在看实体的设计:

 

 

	private String id;// id
	private String customerId;// 用户id
	private String parentCommentId;// 父评论id
	private String contentId;// 内容id
	private String content;// 评论内容
	private String commentDate;// 评论日期
	private String commentTime;// 评论时间
	private Integer state;// 评论的状态
	private Integer type;// 评论类型

	//=================================
	private List<Comment> replyComment; // 评论回复信息
	private Customer customer;// 评论者信息
	private Customer replyCustomer; // 回复评论的人

 

 

以上是Comment实体设计:省略了getter/setter

分析问题的解决方案,我先说说我解决问题的方案:

首先根据我们要评论的对象得Id,查询出评论该对象的所有父评论;

然后根据父评论的Id去查询子评论的信息。

 

分析完毕后:我们开始写sql:

下面的t_item 为评论对象中的一种类型, 他的类型码为1 所有tco.type = 1

 

SELECT tco.* FROM t_comment tco 
	LEFT JOIN t_item tit ON tco.content_id = tit.id
	WHERE tco.parent_comment_id = 0
	AND tco.type = 1
	AND tco.state = 0
	AND tit.id = #{itemId}
	ORDER BY tco.comment_date DESC, tco.comment_time DESC


以上为查询所有的父评论信息;

 

然后我们再根据父评论的Id查询子评论的信息:

 

SELECT tco.* FROM t_comment tco 
	WHERE tco.parent_comment_id = #{parentCommentId} 
	AND tco.state = 0

 

以上是查询子评论的信息

通过上面的sql,我们只是简单的查询了语句:

我们在看看java中怎么去构建评论的集合

dao的编写:就是把以上的两个sql语句变成两个方法。

根据评论对象的Id查询所有父评论:List<Comment> findParentCommentByItemId(String itemId, int offset, int limit);

根据父评论的Id查询所有子评论:List<Comment> findReplyCommentByCommentId(String parentCommentId, int offset, int limit);

然后我们看service怎么实现:

根据评论对象的Id查询所有评论:List<Comment> findCommentByItemId(String itemId, int offset, int limit);

具体的实现:

 

public List<Comment> findCommentByItemId(String itemId, int offset, int limit) {
		List<Comment> comments = commentDao.findParentCommentByItemId(itemId, offset, limit);
		for(Comment comment : comments){
			List<Comment> replys = new ArrayList<Comment>(); // 实例化回复的集合
			comment.setReplyComment(replys); // 设置评论的回复集合
			String customerId = comment.getCustomerId(); // 获取评论的人的Id
			Customer customer = customerService.getCustomerByCustomerId(customerId); // 通过评论人的Id获取评论人的信息
			comment.setCustomer(customer); // 设置评论的人的信息
			buildReplyComment(comment, replys, offset, limit); // 构建评论与回复信息
		}
		return comments;
	}

 

/**
	 * 构建评论与回复评论的关系
	 * @param comment
	 * @param offset
	 * @param limit
	 */
	private void buildReplyComment(Comment comment, List<Comment> replys, int offset, int limit){
		List<Comment> replyComments = commentDao.findReplyCommentByCommentId(comment.getId(), offset, limit); // 获取评论的所有回复
		replys.addAll(replyComments); // 把所有的回复添加到评论实例化的回复集合中
		for(Comment c : replyComments){ // 遍历回复中的回复
			String customerId = c.getCustomerId(); // 获取回复人的id
			Customer replyCustomer = customerService.getCustomerByCustomerId(customerId); // 获取回复人信息
			Customer customer = customerService.getCustomerByCustomerId(comment.getCustomerId()); // 获取评论人的信息
			c.setCustomer(customer); // 设置评论人的信息
			c.setReplyCustomer(replyCustomer); // 设置回复人的信息
			buildReplyComment(c, replys, offset, limit); // 递归调用
		}
	}


最后看页面的展示:

 

 

<c:forEach var="comment" items="${itemComments}">
		<span class="ellipsis">【<c:out value="${comment.customer.nickName}" />】:</span>  
	<span class="ellipsis">${comment.content}</span>
		<span class="ellipsis">(<c:out value="${comment.commentDate}" />)
		</span><br/>
		<c:if test="${!empty comment.replyComment}">
			<c:forEach var="reply" items="${comment.replyComment}">  
	【${reply.replyCustomer.nickName}】回复了【${reply.customer.nickName}】
	<span class="ellipsis">${reply.content}</span>
				<span class="ellipsis">(<c:out value="${comment.commentDate}" />)
				</span>
				<br/>
			</c:forEach>
		</c:if>
	</c:forEach>

 

 

 


样式方面需要调整,大体的功能就这个样子了,

 

 

 

还有不足请指出来,谢谢

 

 

 

 

 

 

 

 

 

 

 

 

2021已然来临,在此之际debug抽空撸了一套 类似“QQ空间”、“新浪微博”、“微信朋友圈”PC版的互联网社交软件系统,并将其录制成了视频,特此分享给诸位进行学习,以掌握、巩固更多的技术栈和项目、产品开发经验! 言归正常,下面以问答的方式重点介绍下本门课程/系统的相关内容!  (1)问题一:这是一门什么样的课程? 本门课程是一门项目实战课程,基于Spring Boot2.X开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统!,大纲图如下所示:  而整个系统的系统架构设计如下图所示(注意:该图表示的是整个系统架构将经历N个阶段的演进,目前初定是4个阶段的演进,分别是架构1.0、2.0、3.0、4.0 !)   (2)问题二:可以学到哪些技术? 本课程对应着系统架构1.0,即第一阶段,主要的目标在于实现一个完整的系统,可以学到的技术还是比较多的:Spring Boot2.X、Java基础、Java8、JUC、NIO、微服务、分布式、系统架构设计、SpringMVC、MySQL、Lucene、多线程、并发编程、Bootstrap、HTML5、CSS3、JQuery、AdminLTE、VUE、LayUI相关组件等等 从架构2.0,即第二阶段的内容(对应第2门课程)开始将慢慢融入更多地技术栈,用以解决更多的业务、性能和服务拆分等问题!本门课程是后续其他阶段对应的课程的奠基,因此如果想要学习后续架构2.0、3.0、4.0的演进,则必须得先学习本门课程!   (3)问题三:系统运行起来有效果图看吗?   (4)问题四:学习本课程之前有什么要求? 要求的话,主要有两点,一是要有一定的Spring Boot、MySQL 以及 Web开发基础;二是最好学过Debug录制的 “企业权限管理平台(Spring Boot2.X+Shiro+Vue)”项目实战课程,因为本门课程“仿微博系统全程实战”的后台管理正是基于 “企业权限管理平台”项目二次开发的,因此建议最好先撸了那个课程再来学习本门课程! 友情提示:“企业权限管理平台(Spring Boot2.X+Shiro+Vue)”项目实战课程的购买学习地址:https://edu.youkuaiyun.com/course/detail/25646  (TIP:可以考虑购买组合套餐课程哦,更加实惠!!!)  岁末将至,人心浮躁 当此之际,应当沉下心,摒弃浮躁 要相信技术是第一生产力 相信技术改变生活、技术成就梦想! 特别是那些即将在过完年准备跳槽面试的小伙伴,本系统将可以为你增添几分亮点!!!  寄语:购买本课程的小伙伴将可获得本课程完整的视频教程、系统源代码数据库、课件PPT以及其他相关的工具跟资料,还可以进专属技术交流群交流技术!!!
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值