博客学习交流平台项目冲刺三总结

  • Post author:
  • Post category:其他


在该阶段我主要负责博客评论相关的功能,在我看来其中收获最大的表的设计以及结合递归思想的评论查看。

表的设计影响后续的开发复杂程度,表设计好了,开发效率会大大提高。

评论,在我看来应该设计两张表,一张是对文章的评论,一张是对评论的评论,即回复评论。

文章评论表设计

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 版权协议,转载请附上原文出处链接和本声明。