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

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

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

文章详情页实现

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

HomeController.java

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

html 复制代码
<title th:text="${article.title}">函数式接口</title>
html 复制代码
    <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>

渲染后效果

文章评论实现

评论用户登录渲染

用户评论前需要进行登录

html 复制代码
<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

java 复制代码
@Component
public class LoginUtils {

    @Autowired
    public 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

java 复制代码
@Controller
@RequestMapping("/comment")
public class CommentController {

    @Autowired
    private ICommentService commentService;

    @RequestMapping("/list")
    @ResponseBody
    public 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

html 复制代码
<script src="/assets/js/jquery.min.js"></script>

HTML中添加文章ID

html 复制代码
 <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脚本。这里没有使用模板技术,采用原生文本拼接。

javascript 复制代码
 <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 添加评论方法

java 复制代码
@Controller
@RequestMapping("/comment")
@Slf4j
public class CommentController {

    @Autowired
    private ICommentService commentService;

    @RequestMapping("/list")
    @ResponseBody
    public 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;
    }

    @Autowired
    private LoginUtils loginUtils;

    @PostMapping("/add")
    @ResponseBody
    public 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

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

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脚本

javascript 复制代码
 $("#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)
                        }
                    }
                });
            });
成功提交评论效果:
相关推荐
想学习java初学者16 分钟前
SpringBoot整合GS1编码解码
java·spring boot·后端
i220818 Faiz Ul1 小时前
智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·智慧养老平台
Flittly2 小时前
【日常小问】Spring Cloud Gateway 5.x 跨域和路由配置踩坑实录
java·spring boot·spring cloud
斯特凡今天也很帅3 小时前
新建数据源报错No bean named ‘SqlSessionFactorykf‘ available
java·数据库·spring boot·mybatis
小钻风33663 小时前
Spring Boot WebSocket 两种集成方式深度解析
spring boot·后端·websocket
SuniaWang3 小时前
AgentX 专栏-00前言:一个Java开发者的Agent实践之路
java·人工智能·spring boot·langchain·系统架构
逍遥德4 小时前
Java编程高频的“踩坑点”-01:fastjson.JSON 转换时泛型擦除问题
java·spring boot·spring·系统架构·json
闪电悠米4 小时前
黑马点评短信登录01_session_sms_login
java·spring boot·redis·git·spring·面试
Advancer-4 小时前
黑马点评plus --异步秒杀重构升级
java·spring boot·重构·intellij-idea