在该阶段我主要负责博客评论相关的功能,在我看来其中收获最大的表的设计以及结合递归思想的评论查看。
表的设计影响后续的开发复杂程度,表设计好了,开发效率会大大提高。
评论,在我看来应该设计两张表,一张是对文章的评论,一张是对评论的评论,即回复评论。
文章评论表设计
sql语句
CREATE TABLE `comments` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT, //评论自增id
`article_id` int(11) NOT NULL, //文章id
`user_id` int(11) NOT NULL, //评论用户id
`content` varchar(500) NOT NULL, //评论内容
`date` varchar(20) NOT NULL, //评论时间
`numbers` int(11) DEFAULT '0', //点赞数
PRIMARY KEY (`comment_id`)
)ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8;
其中numbers点赞数可根据客户需求加上或者不加
回复评论表设计
sql语句
CREATE TABLE `comments_reply` (
`id` int(11) NOT NULL AUTO_INCREMENT, //回复表的自增id
`reply_id` int(11) NOT NULL DEFAULT '0', //文章评论id,建立两张表的联系
`father_id` int(11) NOT NULL DEFAULT '0', //父级id,回复的哪条评论即回复表的自增id
`article_id` int(11) NOT NULL, //文章id,方便后期功能开发,可不要
`user_id` int(11) NOT NULL, //评论用户的id
`to_userid` int(11) NOT NULL, //回复哪个用户的id
`content` varchar(500) NOT NULL, //评论内容
`date` varchar(20) NOT NULL, //评论日期
`numbers` int(11) DEFAULT '0', //同上
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;
评论表实体类设计
public class Comment {
private int comment_id; //评论id 自增
private int article_id; //文章id
private int user_id; //用户id
private String username; //用户名称
private String picture; //用户头像
private String content; //评论内容
private String date; //时间
private int numbers; //点赞量
private boolean flag=false; //点赞状态
private List<CommentsReply> sons;//为满足层层嵌套
}
点赞状态也是看需求而定,想要简单的可以不要,但是sons成员变量不能不要,评论的评论需要知道是回复的是哪条评论,就需要评论之间的关系,sons就是该评论下的所有回复评论
回复表实体类设计
public class CommentsReply {
private int id; //自增id
private int reply_id; //回复一级评论id
private int father_id; //父级id
private String article_id; //文章id
private int user_id; //用户id
private String username; //用户昵称
private String picture; //用户头像
private int to_userid; //回复的用户id
private String to_username; //回复的用户昵称
private String to_picture; //回复的用户头像
private String content; //评论内容
private String date; //时间
private int numbers; //点赞量
private boolean flag=false; //点赞状态
private List<CommentsReply> son;
}
同上,评论有回复评论,需要层层嵌套
代码设计
/**
* 查看评论
*
* @param comment
* @return
*/
public ResultInfo lookComment(Comment comment, int pageNum, int pageSize,int login_userid) {
ResultInfo resultInfo = null;
PageInfo<Comment> pageInfo = null;
try {
resultInfo = new ResultInfo();
//根据分页插件获取数据
PageHelper.startPage(pageNum, pageSize);
//根据文章id查找对该文章的一级评论
List<Comment> commentList = commentMapper.lookComment(comment);
pageInfo = new PageInfo<Comment>(commentList);
//遍历一级评论
for (Comment comment1 : commentList) {
//根据comment_id和login_userid判断用户是否点赞,如果不要点赞可删除这个判断
CommentsLikes likes = commentMapper.selectCommentLikes1(comment1.getComment_id(), login_userid);
if (likes!=null){
comment1.setFlag(true);
}
//根据comment_id找到回复表是否有回复一级的评论
List<CommentsReply> replyList = commentMapper.lookCommentReplyByReplyId(comment1.getComment_id());
if (replyList!=null){
//调用递归方法找到子评论
List<CommentsReply> sons = getSons(replyList,login_userid);
comment1.setSons(sons);
}
}
resultInfo.setData(pageInfo);
resultInfo.setFlag(true);
} catch (Exception e) {
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
}
return resultInfo;
}
上面代码中的递归方法
/**
* 递归查找子评论
*
* @param commentsReplyList
* @return
*/
private List<CommentsReply> getSons(List<CommentsReply> commentsReplyList,int login_userid) {
try {
//commentsReplyList 回复表的第一层评论
for (CommentsReply commentsReply : commentsReplyList) {
//根据回复id和login_userid判断用户是否点赞,同上
CommentsLikes likes = commentMapper.selectCommentLikes2(commentsReply.getId(), login_userid);
if (likes!=null){
commentsReply.setFlag(true);
}
//根据id与father_id之间的关系找子评论
List<CommentsReply> replyList = commentMapper.selectByid(commentsReply.getId());
//没有子评论返回
if (replyList == null) {
return commentsReplyList;
}
commentsReply.setSon(getSons(replyList,login_userid));
}
} catch (Exception e) {
e.printStackTrace();
}
return commentsReplyList;
}
最终评论层层嵌套,评论之间的关系,谁回复谁都能清楚的看到
版权声明:本文为qingmenghan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。