美文网首页
回复列表-二级评论的展示和发布-(8)

回复列表-二级评论的展示和发布-(8)

作者: 弹钢琴的崽崽 | 来源:发表于2020-03-10 08:30 被阅读0次

    1. 回复列表

    1.1 question.html中增加标签

    <h4>
        <span th:text="${question.commentCount}"></span>个回复
    </h4>
    <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12 comment-sp">
    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 comments" th:each="comment : ${comments}">
        <div class="media">
            <div class="media-left">
                <a href="">
                    <img th:src="${comment.user.getAvatarUrl()}" class="media-object img-rounded">
                </a>
            </div>
            <div class="media-body">
                <h5 class="media-heading">
                    <span th:text="${comment.user.name}"></span>
                </h5>
                <div th:text="${comment.content}"></div>
                <div class="menu">
                    <span class="glyphicon glyphicon-thumbs-up icon"></span>
                    <span class="glyphicon glyphicon-comment icon"></span>
                    <span class="pull-right" th:text="${#dates.format(comment.gmtCreate,'yyyy-MM-dd')}"></span>
                </div>
            </div>
        </div>
    
    </div>
    

    1.2 增加样式

    1.3 CommentCreateDTO

    把之前的CommentDTO变为CommentCreateDTO

    它的意思是提供创建评论的数据,对应页面传来的参数

    1.4 新建CommentDTO

    比Comment多了个User对象,为了展示出所有的数据

    1.5 QuestionController

    package life.guohui.community.controller;
    @Controller
    public class QuestionController {
        @Autowired
        private QuestionService questionService;
    
        @Autowired
        private CommentService commentService;
    
        @GetMapping("question/{id}")
        public String question(@PathVariable(name = "id") Long id,
                               Model model){
            QuestionDTO questionDTO = questionService.getById(id);
            List<CommentDTO> comments = commentService.listByQuestionId(id);
            //累加阅读数
            questionService.inView(id);
            model.addAttribute("question",questionDTO);
            model.addAttribute("comments",comments);
            return "question";
        }
    }
    

    1.6 CommentService

    public List<CommentDTO> listByQuestionId(Long id) {
        CommentExample example = new CommentExample();
        example.createCriteria().andParentIdEqualTo(id).andTypeEqualTo(CommentTypeEnum.QUESTION.getType());
        List<Comment> comments = commentMapper.selectByExample(example);
        if(comments.size() == 0){
            return new ArrayList<>();
        }
        //获取去重的评论人
        Set<Long> commentators = comments.stream().map(comment -> comment.getCommentator()).collect(Collectors.toSet());
        List<Long> userIds = new ArrayList();
        userIds.addAll(commentators);
    
        //获取评论人并转换为map
        UserExample userExample = new UserExample();
        userExample.createCriteria().andIdIn(userIds);
        List<User> users = userMapper.selectByExample(userExample);
        Map<Long, User> userMap = users.stream().collect(Collectors.toMap(user -> user.getId(), user -> user));
    
        //转换comment为commentDTO
        List<CommentDTO> commentDTOS = comments.stream().map(comment -> {
            CommentDTO commentDTO = new CommentDTO();
            BeanUtils.copyProperties(comment,commentDTO);
            commentDTO.setUser(userMap.get(comment.getCommentator()));
            return commentDTO;
        }).collect(Collectors.toList());
        return commentDTOS;
    }
    

    页面显示效果

    2. 校验回复和页面调整

    2.1 CustomizeErrorCode中添加校验信息

    2.2 CommentController

    StringUtiles的使用需要导入依赖

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.9</version>
    </dependency>
    

    2.3 前端js添加验证

    在响应成功后刷新页面

    window.location.reload();
    

    2.4 把评论根据时间排序

    2.5 页面调整

    3. 二级评论展示

    3.1 点击信息后

    调用collapseComments方法

    function collapseComments(e) {
        //获得当前评论的id
        var id = e.getAttribute("data-id");
        //根据id获得此评论下的二级评论元素对象
        var comments = $("#comment-"+id);
    
        var collapse = e.getAttribute("data-collapse");
        if(collapse){
            //折叠二级评论
            comments.removeClass("in");
            e.removeAttribute("data-collapse");
            e.classList.remove("active");
        }else {
            var subCommentContainer = $("#comment-" + id);
            if (subCommentContainer.children().length != 1) {
                //展开二级评论
                comments.addClass("in");
                // 标记二级评论展开状态
                e.setAttribute("data-collapse", "in");
                e.classList.add("active");
            } else {
                $.getJSON("/comment/" + id, function (data) {
                    $.each(data.data.reverse(), function (index, comment) {
                        var mediaLeftElement = $("<div/>", {
                            "class": "media-left"
                        }).append($("<img/>", {
                            "class": "media-object img-rounded",
                            "src": comment.user.avatarUrl
                        }));
    
                        var mediaBodyElement = $("<div/>", {
                            "class": "media-body"
                        }).append($("<h5/>", {
                            "class": "media-heading",
                            "html": comment.user.name
                        })).append($("<div/>", {
                            "html": comment.content
                        })).append($("<div/>", {
                            "class": "menu"
                        }).append($("<span/>", {
                            "class": "pull-right",
                            "html": moment(comment.gmtCreate).format('YYYY-MM-DD')
                        })));
    
                        var mediaElement = $("<div/>", {
                            "class": "media"
                        }).append(mediaLeftElement).append(mediaBodyElement);
    
                        var commentElement = $("<div/>", {
                            "class": "col-lg-12 col-md-12 col-sm-12 col-xs-12 comments"
                        }).append(mediaElement);
    
                        subCommentContainer.prepend(commentElement);
                    });
                    //展开二级评论
                    comments.addClass("in");
                    // 标记二级评论展开状态
                    e.setAttribute("data-collapse", "in");
                    e.classList.add("active");
                });
            }
        }
    }
    

    3.2 信息图标高亮

    3.2 ResultDTO加一个泛型

    方便返回数据

    package life.guohui.community.dto;
    @Data
    public class ResultDTO<T> {
        private Integer code;
        private String message;
        private T data;
        public static ResultDTO errorOf(Integer code,String message){
            ResultDTO resultDTO = new ResultDTO();
            resultDTO.setCode(code);
            resultDTO.setMessage(message);
            return resultDTO;
        }
    
        public static ResultDTO errorOf(CustomizeErrorCode errorCode) {
            return errorOf(errorCode.getCode(),errorCode.getMessage());
        }
        public static ResultDTO okOf(){
            ResultDTO resultDTO = new ResultDTO();
            resultDTO.setCode(200);
            resultDTO.setMessage("请求成功");
            return resultDTO;
        }
        public static <T> ResultDTO okOf(T t){
            ResultDTO resultDTO = new ResultDTO();
            resultDTO.setCode(200);
            resultDTO.setMessage("请求成功");
            resultDTO.setData(t);
            return resultDTO;
        }
    
        public static ResultDTO errorOf(CustomizeException e) {
            return errorOf(e.getCode(),e.getMessage());
        }
    }
    

    3.3 重构listByTarget方法

    让它通过上级的id,和type(评论类型)去查对应的所有下级评论

    typeCommentTypeEnum类表示

    3.4 查询二级评论API

    4. 发布二级评论

    4.1 JS中comment()方法

    拿到它的父评论Id,和评论的内容,调用comment2target方法,0表示它属于二级评论

    4.2 comment2target方法Ajax

    向服务器发送请求,添加评论

    function comment2target(targetId,type,content) {
        if(!content){
            alert("不能回复空内容~~");
            return;
        }
        $.ajax({
            type:"post",
            url:"/comment",
            contentType:"application/json",
            data:JSON.stringify({
                "parentId":targetId,
                "content":content,
                "type":type
            }),
            success:function (response) {
                if(response.code == 200){
                    window.location.reload();
                }else {
                    if(response.code == 2003){
                        var isAccepted = confirm(response.message);
                        if(isAccepted){
                            window.open("https://github.com/login/oauth/authorize?client_id=Iv1.bf5154208e60707f&redirect_uri=http://localhost:8887/callback&scope=user&state=1");
                            window.localStorage.setItem("closable",true);
                        }
                    }
                }
                console.log(response);
            },
            dataType:"json"
        });
    }
    

    4.3 二级评论数的显示

    当添加一级评论-comment时,需要设置它的评论数初始值为0,给问题对象-question评论数+1。

    当添加二级评论-comment时,要获得它对应的一级评论对象,给它的评论数+1。

    对应的Mapper.xml

    <update id="incCommentCount" parameterType="life.guohui.community.model.Comment">
        update COMMENT
        set comment_count = comment_count + #{commentCount,jdbcType=INTEGER}
        where id = #{id}
    </update>
    

    相关文章

      网友评论

          本文标题:回复列表-二级评论的展示和发布-(8)

          本文链接:https://www.haomeiwen.com/subject/swsddhtx.html