使用thymeleaf模板实现博客评论的异步刷新

使用thymeleaf模板实现博客评论的异步刷新

最简单的一个要求:用户可以在博客下面进行评论,然后评论后点击提交后直接上传到数据库,并且局部刷新
这是前端页面的展示,使用的semanticUI进行构造出来的模型,另外semanticUi已经不再更新了。
进入重点:如果想要进行局部刷新,使用fragment标签进行更新,如下第二行可以看到将这一块的所有信息都给包裹起来。

        <div id="comment-container" class="ui teal segment">
            <div th:fragment="commentList">
                <div class="ui threaded comments" style="max-width: 100%">
                    <h3 class="ui dividing header">评论</h3>
                    <div class="comment"  th:each="comment : ${comments}">
                        <a class="avatar">
                            <img src="https://unsplash.it/100/100?image=1005" th:src="@{${comment.avatar}}">
                        </a>
                        <div class="content" >
                            <a class="author" >
                                <span th:text="${comment.nickname}">Matt</span>
                                <div class="ui mini basic teal left pointing label m-padded-mini" th:if="${comment.adminComment}">
                                    博主
                                </div>
                            </a>
                            <div class="metadata">
                                <span class="date" th:text="${#dates.format(comment.createTime,'yyyy-MM-dd HH:mm')}">Today at 5:42PM</span>
                            </div>
                            <div class="text" th:text="${comment.content}">
                                How artistic!
                            </div>
                            <div class="actions">
                                <a class="reply" data-commentid="1" data-commentnickname="Matt" th:attr="data-commentid=${comment.id},data-commentnickname=${comment.nickname}" onclick="reply(this)">回复</a>
                            </div>
                        </div>

                        <!--第二层-->
                        <div class="comments" th:if="${#arrays.length(comment.replyComments)}>0">
                            <div class="comment"  th:each="reply : ${comment.replyComments}">
                                <a class="avatar">
                                    <img src="https://unsplash.it/100/100?image=1005" th:src="@{${reply.avatar}}">
                                </a>
                                <div class="content" >
                                    <a class="author" >
                                        <span th:text="${reply.nickname}">小红</span>&nbsp;
                                        <div class="ui mini basic teal left pointing label m-padded-mini" th:if="${reply.adminComment}">
                                            博主
                                        </div>
                                        <span th:text="|@ ${reply.parentComment.nickname}|" class="m-teal">@ 小白</span>
                                    </a>
                                    <div class="metadata">
                                        <span class="date" th:text="${#dates.format(reply.createTime,'yyyy-MM-dd HH:mm')}">Today at 5:42PM</span>
                                    </div>
                                    <div class="text" th:text="${reply.content}">
                                        How artistic!
                                    </div>
                                    <div class="actions">
                                        <a class="reply" data-commentid="1" data-commentnickname="Matt" th:attr="data-commentid=${reply.id},data-commentnickname=${reply.nickname}" onclick="reply(this)">回复</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </div>


这里是提交表单的所有内容,由于评论是一个嵌套的类,即一个评论可以有多个评论,一层层的嵌套下来,在这里需要注意的是,使用springdatajpa的过程中,尽量避免使用Lombok插件中的@Data进行注解类,它会直接产生所有属性的toString,如果使用了,会报出stackoverflow异常,原因是你一直调用的toString方法,一直递归下去,导致栈溢出。最简便的方法就是破坏toString方法中的输出该类的信息,在这里就是不要输出Comment的信息。

提交评论信息的同时,需要设置一个字段证明是新提交的信息而不是回复别人的信息。<input type="hidden" name="parentComent.id" value="-1">这段代码就是实现这个功能,如果是评论博客而不是回复别人的信息,则直接将parentComent.id设置成-1,然后在后端进行判断如果是-1则是新评论。

        <div id="comment-form" class="ui form">
            <input type="hidden" name="blog.id" th:value="${blog.id}">
            <input type="hidden" name="parentComent.id" value="-1">
            <div class="field">
                <textarea name="content" placeholder="请输入评论信息..."></textarea>
            </div>
            <div class="fields">
                <div class="field m-mobile-wide m-margin-bottom-small">
                    <div class="ui left icon input">
                        <i class="user icon"></i>
                        <input type="text" name="nickname" placeholder="姓名" th:value="${session.user}!= null ? ${session.user.nickName}">
                    </div>
                </div>
                <div class="field m-mobile-wide m-margin-bottom-small">
                    <div class="ui left icon input">
                        <i class="mail icon"></i>
                        <input type="text" name="email" placeholder="邮箱" th:value="${session.user}!= null ? ${session.user.email}">
                    </div>
                </div>
                <div class="field  m-margin-bottom-small m-mobile-wide">
                    <button id="commentpost-btn" type="button" class="ui teal button m-mobile-wide"><i class="edit icon"></i>发布</button>
                </div>
            </div>

        </div>


js部分:

$(function () {
    //当页面加载完成之后,需要把评论都给加载出来
    $("#comment-container").load(/*[[@{/comments/{id}(id=${blog.id})}]]*/"comments/6");
});

$("#commentpost-btn").click(function () {
    let boo=$('.ui.form').form('validate form');
    if (boo){
        postData();
        console.log('校验成功');
    }else{
        console.log('校验失败');
    }
});
function postData(){
    $("#comment-container").load(/*[[@{/comments}]]*/"",{
        "parentComment.id":$("[name='parentComent.id']").val(),
        "blog.id":$("[name='blog.id']").val(),
        "nickname":$("[name='nickname']").val(),
        "email":$("[name='email']").val(),
        "content":$("[name='content']").val()
    },function (responseTxt,statusTxt,xhr) {
        clearContent();
        //滚动到最上面的评论

    })
}
function clearContent(){
    $("[name='content']").val('');
    $("[name='parentComent.id']").val(-1);
    $("[name='content']").attr("placeholder","请输入评论信息...");
}

function reply(obj) {
    let commentId=$(obj).data('commentid');
    let nickNickname=$(obj).data('commentnickname');
    $("[name='content']").attr("placeholder","@"+nickNickname).focus();
    $("[name='parentComent.id']").val(commentId);
    $(window).scrollTo($("#comment-form"),500);
}

以上着重讲下异步的过程:
commentpost-btn是提交按钮的id,有一个点击事件,点击后进行提交 postData()方法,然后找到div的id为comment-container的标签进行重新加载,加载的数据源为

/*[[@{/comments}]]*/

也就是找到controller层的url进行提交数据,然后将表单中的数据进行传递给后台,后台进行处理:

@PostMapping("/comments")
    public String post(Comment comment, HttpSession session){
        Long blogId = comment.getBlog().getId();
        comment.setBlog(blogService.getBlog(blogId));
        User user=(User)session.getAttribute("user");
        if (user!=null){
            comment.setAvatar(user.getAvatar());
            comment.setAdminComment(true);
           /* comment.setNickname(user.getNickName());*/
        }else{
            comment.setAvatar(avatar);
        }
        commentService.saveComment(comment);
        return "redirect:/comments/" + blogId;
    }

提交后在重定向给获取所有评论的controller的url:

@GetMapping("/comments/{blogId}")
    public String comments(@PathVariable Long blogId, @NotNull Model model){
        model.addAttribute("comments",commentService.listCommentByBlogId(blogId));
        return "blog :: commentList";
    }

这里将所有的数据全部返回给blog页面的commentList的fragment。
到此,异步刷新结束。

$(function () {
    //当页面加载完成之后,需要把评论都给加载出来
    $("#comment-container").load(/*[[@{/comments/{id}(id=${blog.id})}]]*/"comments/6");
});

这段代码的意思是党页面加载完成之后,将所有的评论都加载出来。

原文地址:https://www.cnblogs.com/chenyameng/p/12250700.html

时间: 2024-11-06 15:06:02

使用thymeleaf模板实现博客评论的异步刷新的相关文章

wordpress关闭博客评论的两种方法

勾掉允许评论即可. 第二种,应部分企业建站需求,需要关闭全站资讯评论. 把以下代码copy到主题的function.php文件即可 /**禁用博客评论功能*/ function disable_page_comments( $posts ) { if ( is_page()) { $posts[0]->comment_status = 'disabled'; $posts[0]->ping_status = 'disabled'; } return $posts; } add_filter( 

Python开发爬虫之动态网页抓取篇:爬取博客评论数据

以爬取<Python 网络爬虫:从入门到实践>一书作者的个人博客评论为例.网址:http://www.santostang.com/2017/03/02/hello-world/ 1)"抓包":找到真实的数据地址 右键点击"检查",点击"network",选择"js".刷新一下页面,选中页面刷新时返回的数据list?callback....这个js文件.右边再选中Header.如图: 其中,Request URL即

0415 博客评论

郭明茵 http://www.cnblogs.com/mingyin/p/5393961.html 丘惠敏 http://www.cnblogs.com/qiuhuimin/p/5393985.html 刘皓   http://www.cnblogs.com/shuaibi/p/5393499.html 李浩然 http://www.cnblogs.com/range/p/5393506.html 陈嘉慧  http://www.cnblogs.com/hui1005039632/p/53928

博客评论

李浩然    http://www.cnblogs.com/range/p/5393506.html 刘皓       http://www.cnblogs.com/shuaibi/p/5393499.html 林志杰    http://www.cnblogs.com/15linzhijie/p/5392575.html 陈嘉慧    http://www.cnblogs.com/hui1005039632/p/5392882.html 林宇粲    http://www.cnblogs.co

博客项目实现文章评论功能(重点是评论回复)

我开发的博客网站的地址:http://118.89.29.170/RiXiang_blog/ 博客项目代码github:https://github.com/SonnAdolf/sonne_blog 有了我的已成型的项目和代码,可以更容易理解这篇文章. 本篇文章记录下自己博客项目评论功能实现的全过程,重点其实是评论回复功能. [一,写评论] 写评论部分我没有使用富文本编辑器,只是单纯地使用了textarea标签,所以后台不需要作html标签的白名单检验(关于防范xss攻击,可以看我之前的一篇文章

Android应用开发-小巫CSDN博客client之获取评论列表

Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文具体内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能.获取评论列表,这个功能的实现跟前面获取文章列表和文章具体的内容不一样,CSDN博客获取评论是通过js来请求server载入评论列表的,返回数据为json数据.我们这里要做的事情就是找到这种一个js文件,再找到请求url的拼接字符串.然后依据我们的需求,请求文章的评论列表获取到当前文章的评论json数据,然后进行解析工作.最后展示到我们的界面其

分享3一个博客HTML5模板

1.材类别:半透明 博客html模板 个人博客 半透明html5博客主题,半透明,博客,博客html模板,个人博客,html5,灰色,半透明html5博客主题是一款适合用于个人博客主题,风格非常不错. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHNxZHM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 半透明html5博客主题 2.素材

Android应用开发-小巫CSDN博客客户端之获取评论列表

Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文详细内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能,获取评论列表,这个功能的实现跟前面获取文章列表和文章详细的内容不一样,CSDN博客获取评论是通过js来请求服务器加载评论列表的,返回数据为json数据,我们这里要做的事情就是找到这样的一个js文件,再找到请求url的拼接字符串,然后根据我们的需求,请求文章的评论列表获取到当前文章的评论json数据,然后进行解析工作,最后展示到我们的界面当中.

搭建自己的技术博客系列(三)让你的博客拥有评论功能!

给大家介绍一个博客评论神器,Valine. 本来hexo博客用的是gitment,我也非常喜欢,看着逼格就超高呀.无奈我用着bug略多,而且毕竟有github账户的小伙伴似乎并不多.于是我就忍痛准备换评论系统.然后在最近刚刚加入的hexo博客群里,看见了一个神器.也就是本篇主人公--Valine.js. 具体配置就见如下的文章吧.它的定义-- 一款极简的无后端评论系统. 在多说和网易云跟帖相继倒闭的情况下,这个简直是救人一命胜造七级浮屠呀. Valine -- 一款极简的评论系统 Valine官