基于 Spring Boot 博客系统开发(六)

基于 Spring Boot 博客系统开发(六)

本系统是简易的个人博客系统开发,为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。🌿🌿🌿
基于 Spring Boot 博客系统开发(五)👈👈

文章详情页实现

在Controller类中,编写处理HTTP请求的方法来获取文章详情并返回视图。
HomeController.java

	@RequestMapping("/article/{id}")public String article(@PathVariable Long id,Model model){Article article = articleService.getById(id);if(article == null){return "error/404";}model.addAttribute("article",article);return "client/article";}

修改视图中代码。article.html

<title th:text="${article.title}">函数式接口</title>
    <article class="main-content post-page"><div class="post-header"><h1 class="post-title" itemprop="name headline" th:text="${article.title}">函数式接口</h1><div class="post-data"><time datetime="2018-12-01" itemprop="datePublished"  >发布于 [[${article.created}]]</time></div></div><br /><div id="post-content" class="post-content content" th:utext="${@textUtils.md2Html(article.content)}"></div></article>

渲染后效果
在这里插入图片描述

文章评论实现

评论用户登录渲染

用户评论前需要进行登录

<span th:if="${@loginUtils.isLogin()}" class="response">Hello,<a data-no-instant="" th:text="${@loginUtils.getLoginUser().username}">admin</a>如果你想 <a href="/logout">注销</a> ?
</span>
<span th:unless="${@loginUtils.isLogin()}" class="response">用户想要评论,请先<a href="/login" title="登录" target="_blank" data-no-instant="">登录</a>!
</span>

LoginUtils.java

@Component
public class LoginUtils {@Autowiredpublic HttpServletRequest request;public boolean isLogin(){Object loginUser = request.getSession().getAttribute("loginUser");return loginUser!=null;}public User getLoginUser(){Object loginUser = request.getSession().getAttribute("loginUser");if(loginUser instanceof User){return (User)loginUser;}return null;}
}

用户登录前渲染效果:
在这里插入图片描述
用户登录后渲染效果:
在这里插入图片描述

评论列表渲染

创建CommentController.java,查询指定文章ID的评论列表并分页,以JSON格式返回。
这里注意要写@ResponseBody

@Controller
@RequestMapping("/comment")
public class CommentController {@Autowiredprivate ICommentService commentService;@RequestMapping("/list")@ResponseBodypublic PageInfo<Comment> list(Long articleId,@RequestParam(defaultValue = "1") Integer pageNum){PageHelper.startPage(pageNum,3);QueryWrapper<Comment> query = new QueryWrapper<>();query.eq("article_id",articleId);List<Comment> list = commentService.list(query);PageInfo<Comment> page = new PageInfo<>(list);return page;}
}

前端代码,需要引入JQ。由于之前有统一引入到公共JS里了,所以这里不需要引入。
引入JQ

<script src="/assets/js/jquery.min.js"></script>

HTML中添加文章ID

 <form id="comment-form" class="comment-form" role="form" ><input type="hidden" name="articleId" id="aid" th:value="${article.id}"><textarea name="content" id="textarea" class="form-control" placeholder="以上信息可以为空,评论不能为空哦!" required="required" minlength="5" maxlength="2000"></textarea><button type="button" class="submit" id="misubmit">提交</button>
</form>

编写渲染评论列表的JS脚本。这里没有使用模板技术,采用原生文本拼接。

 <script type="text/javascript">function loadComment(pageNum){$.ajax({type: 'get',url: '/comment/list',data: {articleId:$("#aid").val(),pageNum:pageNum},async: true,dataType: 'json',success: function (result) {console.log(result)let templates = '';$.each(result.list,function (i,o){// 渲染模板templates += '<li id="li-comment-15" class="comment-body comment-parent comment-odd">\n' +'                                <div id="comment-15">\n' +'                                    <div class="comment-view" οnclick="">\n' +'                                        <div class="comment-header">\n' +'                                            <!--设置人物头像和名称-->\n' +'                                            <img class="avatar" src="/assets/img/avatars.jpg" height="50">\n' +'                                            <a class="comment-author" rel="external nofollow">'+o.author+'</a>\n' +'                                        </div>\n' +'                                        <!-- 评论内容 -->\n' +'                                        <div class="comment-content">\n' +'                                            <span class="comment-author-at"></span>\n' +'                                            <p></p><p>'+o.content+'</p>\n' +'    <p></p>\n' +'                                        </div>\n' +'                                        <!-- 评论日期 -->\n' +'                                        <div class="comment-meta">\n' +'                                            <time class="comment-time">'+o.created+'</time>\n' +'\n' +'                                        </div>\n' +'                                    </div>\n' +'                                </div>\n' +'                            </li>';})$(".comment-list").html(templates);let pageText = '';$.each(result.navigatepageNums,function (i,o){pageText +='<li class="'+(o==result.pageNum?'current':'')+'">' +'<a>'+o+'</a>' +'</li>';});$(".page-navigator").html(pageText);$(".page-navigator a").click(function (){let pageNum = $(this).text();loadComment(parseInt(pageNum));});}});}loadComment(1);</script>

渲染效果:
在这里插入图片描述

评论提交实现

后端 CommentController 添加评论方法

@Controller
@RequestMapping("/comment")
@Slf4j
public class CommentController {@Autowiredprivate ICommentService commentService;@RequestMapping("/list")@ResponseBodypublic PageInfo<Comment> list(Long articleId,@RequestParam(defaultValue = "1") Integer pageNum){PageHelper.startPage(pageNum,3);QueryWrapper<Comment> query = new QueryWrapper<>();query.eq("article_id",articleId);List<Comment> list = commentService.list(query);PageInfo<Comment> page = new PageInfo<>(list);return page;}@Autowiredprivate LoginUtils loginUtils;@PostMapping("/add")@ResponseBodypublic AjaxResult add(Comment comment, HttpServletRequest request){comment.setCreated(new Date()); //实体created 属性修改成Date类型comment.setIp(request.getRemoteAddr());User loginUser = loginUtils.getLoginUser();if(loginUser == null){return new AjaxResult(-1,"请先登录");}comment.setAuthor(loginUser.getUsername());try {commentService.save(comment);return AjaxResult.success();}catch (Exception e){log.error(e.getMessage());}return  AjaxResult.error();}}

创建AjaxResult 用于返回异步状态结果
AjaxResult.java

@Data
public class AjaxResult {private int code = 0;private String msg ="操作成功" ;private Object data;public AjaxResult() {}public AjaxResult(int code, String msg) {this.code = code;this.msg = msg;}public AjaxResult(int code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public static AjaxResult success(){return new AjaxResult();}public static AjaxResult error(){return new AjaxResult(-1,"未知错误");}
}

前端提交的HTML

  <div><form id="comment-form" class="comment-form" role="form"  ><input type="hidden" name="articleId" id="aid" th:value="${article.id}"><textarea name="content" id="textarea" class="form-control" placeholder="以上信息可以为空,评论不能为空哦!" required="required" minlength="5" maxlength="2000"></textarea><button type="button" class="submit" id="misubmit">提交</button></form></div>

提交评论的JS脚本

 $("#misubmit").click(function (){$.ajax({type: 'post',url: '/comment/add',data: {articleId:$("#aid").val(),content:$("#textarea").val()},async: false,dataType: 'json',success: function (result) {if(result.code == 0){alert("评论成功");window.location.reload();}else{alert(result.msg)}}});});
成功提交评论效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696287.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链媒体发布推广7个的神奇方法助你脱颖而出-华媒舍

区块链技术的发展已经掀起了一场数字革命&#xff0c;引发了全球范围内的热议。在这个充满竞争的市场中&#xff0c;如何让自己的区块链项目脱颖而出&#xff0c;吸引更多的关注和参与呢&#xff1f;下面就为大家介绍7个神奇的区块链媒体发布推广方法&#xff0c;帮助你在激烈的…

实验名称:TCP 连接管理

目录 前言 TCP报文段格式 TCP建立连接 TCP释放连接 实验目的 实验原理 实验步骤 1. 启动WireShark&#xff0c;设置抓包状态 2. 访问指定服务器 &#xff0c;通过Wireshark抓取通信数据报文 3. 分析TCP连接建立的三次握手和连接释放的四次握手过程 原始数据记录 实验…

触摸OpenNJet,云原生世界触手可及

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 导言OpenNJet云原生引擎介绍云原生平台的介绍优化与创新 为什么选择OpenNJet云原生引擎如何在windo…

转移插槽笔记

4.3.4.转移插槽 我们要将num存储到7004节点&#xff0c;因此需要先看看num的插槽是多少&#xff1a; 如上图所示&#xff0c;num的插槽为2765. 我们可以将0~3000的插槽从7001转移到7004&#xff0c;命令格式如下&#xff1a; 具体命令如下&#xff1a; 建立连接&#xff1a;…

Office之Word应用(二)

一、页眉添加文件名称和页码 1、双击页眉&#xff0c;点击“页眉-空白&#xff08;三栏&#xff09;” 2、删掉第一处&#xff08;鼠标放在上面就会选中&#xff0c;Enter即可&#xff09;&#xff0c;第二处输入文档名称&#xff0c;第三处插入页码。 注&#xff1a;插入页码时…

鲁棒控制问题描述

复杂的合成问题成为一个具有特殊结构控制器的设计问题。 H无穷范数&#xff08;H∞ norm&#xff09;&#xff1a;对于线性时不变&#xff08;LTI&#xff09;系统&#xff0c;H∞范数通常定义为系统频率响应的最大幅值。换句话说&#xff0c;它是系统传递函数在复平面单位圆上…

网络编程:服务器模型-并发服务器-多进程

并发服务器概念&#xff1a; 并发服务器同一时刻可以处理多个客户机的请求 设计思路&#xff1a; 并发服务器是在循环服务器基础上优化过来的 &#xff08;1&#xff09;每连接一个客户机&#xff0c;服务器立马创建子进程或者子线程来跟新的客户机通信 &#xff08;accept之后…

文件操作IO网络编程网络原理

​ 文件操作—IO 文件在计算机中可以代表很多东西 在操作系统中, 文件主要是指硬盘文件 硬盘主要分为机械硬盘和固态硬盘。机械硬盘通过磁头在旋转的磁盘上读取数据&#xff0c;适合顺序读取。而固态硬盘则使用闪存芯片来存储数据&#xff0c;没有机械部件&#xff0c;因此读…

【面试经典题】环形链表

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 在面试中我们经常会遇到有关链表的相关题目&#xff0c;面试官通常会对题目给出拓展 下面我就两个leetcode上的一个双指针的题目为例&#xff0c;并对其进行拓展 题目链接&#xff1a;环形链表 题目描述&#xf…

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

网络基础-SSH协议(思科、华为、华三)

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和安全文件传输的协议。它提供了加密的通信通道&#xff0c;使得用户可以在不安全的网络上安全地远程登录到远程主机&#xff0c;并在远程主机上执行命令、访问文件以及传输文件&#xff0c;本篇主要讲解命令执行…

M 有效算法

M 有效算法 本题考验二分知识&#xff0c;思路是二分k的取值&#xff0c;就按第一组样例来说当我们k取值为1的时候我们遍历数组想让|8-x|<k1的话x的取值范围是7-9&#xff0c;想让|3-x|<k2的话x的取值范围是1-5&#xff0c;两者x的区间不重合&#xff0c;说明肯定没有x能…