SpringBoot个人博客开发(十七)----功能实现6.其余展示

功能实现6.其余展示

效果图
在这里插入图片描述
还是先传html文件内容吧

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head th:replace="_fragments :: head(~{::title})">
    <title>分类</title>
</head>
<body>
    <!--导航-->
    <nav  th:replace="_fragments :: menu(2)"></nav>
    <!--页面主体-->
    <div class="m-padded-tb-big m-container-small">
        <div class="ui container">
            <!--左边头部-->
            <div class="ui top attached segment">
                <!--左边头部拆分为两部分-->
                <div class="ui middle aligned two column grid">
                    <div class="column">
                        <!--左边-->
                        <h3 class="ui teal header">分类</h3>
                    </div>
                    <!--右边-->
                    <div class="right aligned column"><h2 class="ui orange header m-inline-block m-text-thin" th:text="${#arrays.length(types)}">1</h2></div>
                </div>
            </div>
            <!--分类列表-->
            <div class="ui attached segment m-padded-tb-mini">
                <div class="ui labeled teal button m-margin-tb-tiny" th:each="type : ${types}">
                    <a href="" th:href="@{/types/{id}(id=${type.id})}" th:classappend="${type.id==activeTypeId} ? 'violet'" th:text="${type.name}" class="ui teal button">Blog</a>
                    <div class="ui basic teal left pointing label" th:classappend="${type.id==activeTypeId} ? 'violet'" th:text="${#arrays.length(type.blogs)}">1</div>
                </div>
            </div>
            <!--博客列表-->
            <div class="ui top attached teal segment">
                <div class="ui padded vertical segment m-padded-tb" th:each="blog : ${page.content}">
                    <div class="ui mobile aligned reversed stackable grid">
                        <!--list left 博客标题和内容-->
                        <div class="eleven wide column">
                            <h3 class="ui header"><a href="#" class="m-black" target="_blank" th:href="@{/blog/{id}(id=${blog.id})}" th:text="${blog.title}">叽里呱啦</a></h3>
                            <p class="m-text" th:text="|${blog.description}.....|">叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦</p>
                            <div class="ui grid">
                                <!--list left bottom left 用户名、日期、浏览量-->
                                <div class="eleven wide column">
                                    <div class="ui horizontal link list">
                                        <div class="item">
                                            <img th:src="@{${blog.user.avatar}}" alt="" class="ui avatar image"  >
                                            <div class="content"><a href="#" th:text="${blog.user.nickname}" class="header">作者</a></div>
                                        </div>
                                        <div class="item">
                                            <i class="calendar icon" ></i>
                                            <span th:text="${#dates.format(blog.updateTime, 'yyyy-MM-dd')}">2021-6-2</span>
                                        </div>
                                        <div class="item">
                                            <i class="eye icon" >
                                            </i><span th:text="${blog.views}">111</span>
                                        </div>
                                    </div>
                                </div>
                                <!--list left bottom right 认知升级-->
                                <div class="right aligned five wide column">
                                    <a href="" target="_blank" class="ui teal basic label m-padded-tiny m-text-thin" th:text="${blog.type.name}">这是标签</a>
                                </div>
                            </div>
                        </div>
                        <!--list right 这里是图片-->
                        <div class="four wide column">
                            <a href="#" target="_blank" th:href="@{/blog/{id}(id=${blog.id})}">
                                <img th:src="@{${blog.firstPicture}}" alt=""
                                     class="ui rounded image">
                            </a>
                        </div>
                    </div>
                </div>
            </div>
            <!--注意jio下-->
            <div class="ui bottom attached segment" th:if="${page.totalPages}>1">
                <div class="ui middle aligned two column grid">
                    <div class="column">
                        <a href="#" th:href="@{/(page=${page.number}-1)}" class="ui mini teal basic button" th:unless="${page.first}">上一页</a>
                    </div>
                    <div class="right aligned column">
                        <a href="#" th:href="@{/(page=${page.number}+1)}" class="ui mini teal basic button" th:unless="${page.last}">下一页</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>

    <!--底部footer-->
    <footer th:replace="_fragments :: footer" class="ui inverted vertical segment m-padded-tb-massive"></footer>

    <!--导入的script-->
    <th:block th:replace="_fragments :: script"></th:block>
    <script>
        $('.menu.toggle').click(function () {
            $('.m-item').toggleClass('m-mobile-hide');
        });

    </script>
</body>
</html>

这个内容有了后就是控制器的一个制作编写了,在controller子包中创建TypeShowController
注入两个服务类

package net.yq.springbootblog.controller;


import net.yq.springbootblog.PersisentObject.Type;
import net.yq.springbootblog.service.BlogService;
import net.yq.springbootblog.service.TypeService;
import net.yq.springbootblog.vo.BlogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;

@Controller
public class TypeShowController {

    @Autowired
    private TypeService typeService;
    @Autowired
    private BlogService blogService;

    @GetMapping("/types/{id}")
    public String types(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable,
                        @PathVariable Long id, Model model){//和博客展示首页的获取最新分类一样
        List<Type> types = typeService.listTypeTop(1000);//但是在这个位置,给定的值是1000,然后分类远远没有1000,所以他会直接查询完。
        if (id == -1) {//这里由于_fragments里面定的id是-1所以下面直接就定id是0.从数组第一个开始
            id = types.get(0).getId();
        }
        BlogQuery blogQuery = new BlogQuery();
        blogQuery.setTypeId(id);
        model.addAttribute("types",types);
        model.addAttribute("page",blogService.listBlog(pageable,blogQuery));
        model.addAttribute("activeTypeId",id);
        return "types";
    }
}

不多说了,看注释吧。
分类页弄完了后,弄标签页了,
效果图
在这里插入图片描述

标签页和分类页其实是一样的
所有东西除了名字都是一样的,包括网页,所有东西里面都是修改对应的type为tag
这里就直接上代码了。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head th:replace="_fragments :: head(~{::title})">
    <title>标签</title>
</head>
<body>
<!--导航-->
<nav  th:replace="_fragments :: menu(3)"></nav>
<!--页面主体-->
<div class="m-padded-tb-big m-container-small">
    <div class="ui container">
        <!--左边头部-->
        <div class="ui top attached segment">
            <!--左边头部拆分为两部分-->
            <div class="ui middle aligned two column grid">
                <div class="column">
                    <!--左边-->
                    <h3 class="ui teal header">标签</h3>
                </div>
                <!--右边-->
                <div class="right aligned column"><h2 class="ui orange header m-inline-block m-text-thin" th:text="${#arrays.length(tags)}">1</h2></div>
            </div>
        </div>
        <!--标签列表-->
        <div class="ui attached segment m-padded-tb-mini">
            <div class="ui labeled teal button m-margin-tb-tiny" th:each="tag : ${tags}">
                <a href="" th:href="@{/tags/{id}(id=${tag.id})}" th:classappend="${tag.id==activeTypeId} ? 'violet'" th:text="${tag.name}" class="ui teal button">Blog</a>
                <div class="ui basic teal left pointing label" th:classappend="${tag.id==activeTypeId} ? 'violet'" th:text="${#arrays.length(tag.blogs)}">1</div>
            </div>
        </div>
        <!--博客列表-->
        <div class="ui top attached teal segment">
            <div class="ui padded vertical segment m-padded-tb" th:each="blog : ${page.content}">
                <div class="ui mobile aligned reversed stackable grid">
                    <!--list left 博客标题和内容-->
                    <div class="eleven wide column">
                        <h3 class="ui header"><a href="#" class="m-black" target="_blank" th:href="@{/blog/{id}(id=${blog.id})}" th:text="${blog.title}">叽里呱啦</a></h3>
                        <p class="m-text" th:text="|${blog.description}.....|">叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦叽里呱啦</p>
                        <div class="ui grid">
                            <!--list left bottom left 用户名、日期、浏览量-->
                            <div class="eleven wide column">
                                <div class="ui horizontal link list">
                                    <div class="item">
                                        <img th:src="@{${blog.user.avatar}}" alt="" class="ui avatar image"  >
                                        <div class="content"><a href="#" th:text="${blog.user.nickname}" class="header">作者</a></div>
                                    </div>
                                    <div class="item">
                                        <i class="calendar icon" ></i>
                                        <span th:text="${#dates.format(blog.updateTime, 'yyyy-MM-dd')}">2021-6-2</span>
                                    </div>
                                    <div class="item">
                                        <i class="eye icon" >
                                        </i><span th:text="${blog.views}">111</span>
                                    </div>
                                </div>
                            </div>
                            <!--list left bottom right 认知升级-->
                            <div class="right aligned five wide column">
                                <a href="" target="_blank" class="ui teal basic label m-padded-tiny m-text-thin" th:text="${blog.type.name}">这是标签</a>
                            </div>
                            <div class="row">
                                <a href="#" th:href="@{/tags/{id}(id=${tag.id})}" target="_blank" class="ui basic teal left pointing label m-padded-tb-mini m-text-thin" th:each="tag : ${blog.tags}" th:text="${tag.name}"></a>
                            </div>
                        </div>
                    </div>
                    <!--list right 这里是图片-->
                    <div class="four wide column">
                        <a href="#" target="_blank" th:href="@{/blog/{id}(id=${blog.id})}">
                            <img th:src="@{${blog.firstPicture}}" alt=""
                                 class="ui rounded image">
                        </a>
                    </div>
                </div>
            </div>
        </div>
        <!--注意jio下-->
        <div class="ui bottom attached segment" th:if="${page.totalPages}>1">
            <div class="ui middle aligned two column grid">
                <div class="column">
                    <a href="#" th:href="@{/(page=${page.number}-1)}" class="ui mini teal basic button" th:unless="${page.first}">上一页</a>
                </div>
                <div class="right aligned column">
                    <a href="#" th:href="@{/(page=${page.number}+1)}" class="ui mini teal basic button" th:unless="${page.last}">下一页</a>
                </div>
            </div>
        </div>
    </div>
</div>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

<!--底部footer-->
<footer th:replace="_fragments :: footer" class="ui inverted vertical segment m-padded-tb-massive"></footer>

<!--导入的script-->
<th:block th:replace="_fragments :: script"></th:block>
<script>
    $('.menu.toggle').click(function () {
        $('.m-item').toggleClass('m-mobile-hide');
    });

</script>
</body>
</html>

TagShowController.java

package net.yq.springbootblog.controller;

import net.yq.springbootblog.PersisentObject.Tag;
import net.yq.springbootblog.service.BlogService;
import net.yq.springbootblog.service.TagService;
import net.yq.springbootblog.vo.BlogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;
@Controller
public class TagShowController {
    @Autowired
    private BlogService blogService;
    @Autowired
    private TagService tagService;

    @GetMapping("/tags/{id}")
    public String types(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable,
                        @PathVariable Long id, Model model){
        List<Tag> tags = tagService.listTagTop(1000);
        if (id == -1) {
            id = tags.get(0).getId();
        }
        model.addAttribute("tags",tags);
        model.addAttribute("page",blogService.listBlog(id,pageable));
        model.addAttribute("activeTypeId",id);
        return "tags";
    }
}

。弄完了标签页。到了最后的归档页
效果图
在这里插入图片描述
在这个里面呢.还是先放HTML代码。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/" xmlns:yh="http://www.thymeleaf.org/">
<head th:replace="_fragments :: head(~{::title})">
    <title>归档</title>
</head>
<body>
    <!--头部导航-->
    <nav th:replace="_fragments :: menu(4)" ></nav>


    <!--页面主体-->
    <div class="m-padded-tb-large m-container-small">
            <div class="ui container">
                <!--文章列表的头部(显示篇数)-->
                <div class="ui top attached padded segment">
                    <div class="ui middle aligned two column grid"><!--middle 代表垂直方向的居中   two column grid将div框分为2列的布局设置-->
                        <!--第一列-->
                        <div class="column">
                            <h3 class="ui teal header">归档</h3><!--tear 一种色彩-->
                        </div>
                        <!--第二列-->
                        <div class="right aligned column"><!--靠右--><h3 class="ui orange header m-inline-block m-text-thin" th:text="${blogCount}">114</h3><!--h3标签会自动换行,-->
                        </div>
                    </div>
                </div>


                <!--按照年份做列表-->
                <th:block th:each="item : ${archiveMap}">
                    <h3 class="ui center aligned header" th:text="${item.key}">2017</h3>
                    <div class="ui fluid vertical menu">
                        <a href="#" th:href="@{/blog/{id}(id=${blog.id})}"  target="_blank" class="item" th:each="blog:${item.value}">
                    <span>
                        <i class=" ui teal circle icon"></i><span th:text="${blog.title}">关于刻意练习的清单</span>
                        <div class="ui teal basic left pointing label m-padded-tb-mini" th:text="${#dates.format(blog.updateTime,'MMMdd')}">9月03</div>
                    </span>
                            <div class="ui orange basic left pointing label m-padded-mini" th:text="${blog.flag}">原创</div>
                        </a>
                    </div>
                </th:block>
                </div>
    </div>



    <!--底部footer-->
    <footer th:replace="_fragments :: footer" class="ui inverted vertical segment m-padded-tb-massive"></footer>
    <!--导入的script-->
    <th:block th:replace="_fragments :: script"> </th:block>
    <script>
        $('.menu.toggle').click(function () {
            $('.m-item').toggleClass('m-mobile-hide');
        });

    </script>
</body>
</html>

这里更正一个问题,上面在复制我的代码发出来的时候,忘记发对应的服务类,实现类什么的了。
这里就一起发一遍最新的
在这里插入图片描述
除开UserRepository外,依次直接粘贴出来

package net.yq.springbootblog.repository;

import net.yq.springbootblog.PersisentObject.Blog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface BlogRepository extends JpaRepository<Blog,Long>,JpaSpecificationExecutor<Blog>{
//    int saveViews(@Param("views") int views, @Param("id") Long id);  //浏览量+1
    @Query("select b from t_blog b where b.recommend = true ")
    List<Blog> findTop(Pageable pageable);
    //select * from t_blog where title like '%内容%'
    @Query("select b from t_blog b where b.title like ?1 or b.content like ?1")
    Page<Blog> findByQuery(String query, Pageable pageable);

    @Transactional
    @Modifying
    @Query("update t_blog b set b.views = b.views+1 where b.id = ?1")
    int updateView(Long id);

    @Query("select function('date_format',b.updateTime,'%Y') as year from t_blog b group by" +
            " function('date_format',b.updateTime,'%Y') order by year desc")
    List<String> findGroupYear();

    @Query("select b from t_blog b where function('date_format',b.updateTime,'%Y') = ?1")
    List<Blog> findByYear(String year);
}

package net.yq.springbootblog.repository;

import net.yq.springbootblog.PersisentObject.Comment;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface CommentRepository extends JpaRepository<Comment,Long> {
    List<Comment> findByBlogIdAndParentCommentNull(Long blogId, Sort sort);
}

package net.yq.springbootblog.repository;

import net.yq.springbootblog.PersisentObject.Tag;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface TagRepository extends JpaRepository<Tag,Long>, JpaSpecificationExecutor<Tag> {
    Tag findByName(String name);
    @Query("select t from t_tag t")
    List<Tag> findTop(Pageable pageable);

}

package net.yq.springbootblog.repository;

import net.yq.springbootblog.PersisentObject.Type;
import org.springframework.data.domain.Pageable;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface TypeRepository extends JpaRepository<Type,Long> {
    Type findByName(String name);

    @Query("select t from t_type t")
    List<Type> findTop(Pageable pageable);
}

package net.yq.springbootblog.service;

import net.yq.springbootblog.PersisentObject.Blog;
import net.yq.springbootblog.vo.BlogQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

public interface BlogService {
    Blog getBlog(Long id);//获取博客
    Page<Blog> listBlog(Pageable pageable, BlogQuery blog);//博客管理搜索时分页获取博客
    Blog saveBlog(Blog blog);//保存博客
    Blog updateBlog(Long id,Blog blog);//更新博客
    void deleteBlog(Long id);//删除博客
    List<Blog> listRecommendBlogTop(Integer size);//获取最新博客
    Map<String,List<Blog>> archiveBlog();//博客归档
    Long countBlog();//获取博客条数
    Blog getAndConvert(Long id);//获取并转换markdown格式文章
    Page<Blog> listBlog(Pageable pageable);//分页获取博客
    Page<Blog> listBlog(Long tagId,Pageable pageable);//博客和标签的关联性获取博客
    Page<Blog> listBlog(String query,Pageable pageable);//全局搜索并展示

}

package net.yq.springbootblog.service;

import net.yq.springbootblog.NotFoundException;
import net.yq.springbootblog.PersisentObject.Blog;
import net.yq.springbootblog.PersisentObject.Type;
import net.yq.springbootblog.repository.BlogRepository;
import net.yq.springbootblog.util.MarkdownUtils;
import net.yq.springbootblog.util.MyBeanUtils;
import net.yq.springbootblog.vo.BlogQuery;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Transient;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.*;
import java.util.*;


@Service
public class BlogServiceImpl implements BlogService{

    @Autowired
    private BlogRepository blogRepository;

    @Override
    public Blog getBlog(Long id) {
        return blogRepository.getById(id);//根据ID获取博客
    }

    @Override
    public Page<Blog> listBlog(Pageable pageable, final BlogQuery blog) {
        return blogRepository.findAll(new Specification<Blog>() {
            @Override
            public Predicate toPredicate(Root<Blog> root,
                                         CriteriaQuery<?> cq,
                                         CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<>();
                if (!"".equals(blog.getTitle()) && blog.getTitle() != null) {
                    predicates.add(cb.like(root.<String>get("title"), "%" + blog.getTitle() + "%"));
                }
                if (blog.getTypeId() != null) {
                    predicates.add(cb.equal(root.<Type>get("type").get("id"), blog.getTypeId()));
                }
                if (blog.isRecommend()) {
                    predicates.add(cb.equal(root.<Boolean>get("recommend"), blog.isRecommend()));
                }
                cq.where(predicates.toArray(new Predicate[predicates.size()]));
                return null;
            }
        },pageable);//博客管理搜索时分页获取博客
    }

    @Override
    public Page<Blog> listBlog(Pageable pageable) {
        return blogRepository.findAll(pageable);//分页获取博客
    }


    @Transactional
    @Override
    public Blog saveBlog(Blog blog) {
        if (blog.getId() == null){//保存博客
            blog.setCreateTime(new Date());
            blog.setUpdateTime(new Date());
            blog.setViews(0);
        }else {
            blog.setUpdateTime(new Date());
        }
        return blogRepository.save(blog);
    }

    @Transactional
    @Override
    public Blog updateBlog(Long id, Blog blog) {//新增博客
        Blog b = blogRepository.getById(id);//先根据ID获取
        if (b == null){//获取不到
            throw new NotFoundException("博客不存在!");//抛出错误
        }
        BeanUtils.copyProperties(blog,b, MyBeanUtils.getNullPropertNames(blog));//获取得到就不该ID去改内容
        b.setUpdateTime(new Date());//设置更新时间
        return blogRepository.save(b);//保存
    }
    @Transactional
    @Override
    public void deleteBlog(Long id) {
        blogRepository.deleteById(id);//根据ID删除
    }

    @Override
    public List<Blog> listRecommendBlogTop(Integer size) {
        Sort sort=Sort.by(Sort.Direction.DESC,"updateTime");
        Pageable pageable=PageRequest.of(0,size,sort);
        return blogRepository.findTop(pageable);
    }

    @Override
    public Map<String, List<Blog>> archiveBlog() {//归档页
        List<String> years = blogRepository.findGroupYear();
        Map<String,List<Blog>> map = new HashMap<>();
        for (String year : years){
            map.put(year,blogRepository.findByYear(year));
        }
        return map;
    }

    @Override
    public Long countBlog() {
        return blogRepository.count();
    }

    @Override
    public Blog getAndConvert(Long id) {
        Blog blog = blogRepository.getById(id);//根据ID获取博客
        if (blog == null){
            throw new NotFoundException("NotFound");
        }
        Blog b = new Blog();//new一个对象
        BeanUtils.copyProperties(blog,b);//复制内容进之前new的对象
        String content = b.getContent();//获取对象中的正文内容
        b.setContent(MarkdownUtils.markdownToHtmlExtensions(content));//用工具转换格式
        blogRepository.updateView(id);//更新阅读次数
        return b;
    }

    @Override
    public Page<Blog> listBlog(final Long tagId, Pageable pageable) {
        return blogRepository.findAll(new Specification<Blog>() {
            @Override
            public Predicate toPredicate(Root<Blog> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Join join = root.join("tags");
                return criteriaBuilder.equal(join.get("id"),tagId);
            }
        },pageable);
    }

    @Override
    public Page<Blog> listBlog(String query, Pageable pageable) {
        return blogRepository.findByQuery(query,pageable);//搜索博客内容来展示
    }
}

package net.yq.springbootblog.service;

import net.yq.springbootblog.PersisentObject.Comment;

import java.util.List;

public interface CommentService {
    List<Comment> listCommentByBlogId(Long blogId);

    Comment saveComment(Comment comment);
}

package net.yq.springbootblog.service;

import net.yq.springbootblog.PersisentObject.Comment;
import net.yq.springbootblog.repository.CommentRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentServiceImpl implements CommentService{

    @Autowired
    private CommentRepository commentRepository;


    @Override
    public List<Comment> listCommentByBlogId(Long blogId) {
        Sort sort = Sort.by(Sort.Direction.ASC,"createTime");
        List<Comment> comments = commentRepository.findByBlogIdAndParentCommentNull(blogId,sort);
        return eachComment(comments);
    }

    @Transactional
    @Override
    public Comment saveComment(Comment comment) {
        Long parentCommentId = comment.getParentComment().getId();
        if (parentCommentId != -1){
            comment.setParentComment(commentRepository.getById(parentCommentId));
        }else {
            comment.setParentComment(null);
        }
        comment.setCreateTime(new Date());
        return commentRepository.save(comment);
    }
    private List<Comment> eachComment(List<Comment> comments){
        List<Comment> commentsView = new ArrayList<>();
        for (Comment comment : comments){
            Comment c = new Comment();
            BeanUtils.copyProperties(comment,c);
            commentsView.add(c);
        }
        //合并评论的各层子代到第一级子代集合中
        combineChildren(commentsView);
        return commentsView;
    }
    private void combineChildren(List<Comment> comments){
        for (Comment comment : comments){
            List<Comment> replys1 = comment.getReplyComments();
            for (Comment reply1 : replys1){
                //循环迭代,找出子代,存放在tempReplys中
                recursively(reply1);
            }
            //修改顶级节点的reply集合为迭代处理后的集合
            comment.setReplyComments(tempReplys);
            //清除临时存放区
            tempReplys = new ArrayList<>();
        }
    }
    //存放迭代找出的所有子代集合
    private List<Comment> tempReplys = new ArrayList<>();

    /**
     *
     * @param comment
     */
    private void recursively(Comment comment){
        tempReplys.add(comment);//顶节点添加到临时存放集合
        if (comment.getReplyComments().size()>0){
            List<Comment> replys = comment.getReplyComments();
            for (Comment reply : replys){
                tempReplys.add(reply);
                if (reply.getReplyComments().size()>0){
                    recursively(reply);
                }
            }
        }
    }

}

package net.yq.springbootblog.service;

import net.yq.springbootblog.PersisentObject.Tag;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

public interface TagService {
    Tag saveTag(Tag tag);//保存
    Tag getTag(Long id);//根据ID获取
    Page<Tag> listType(Pageable pageable);//分页展示
    List<Tag> listTag();//获取全部
    Tag updateTag(Long id,Tag tag);//更新
    void deleteTag(long id);//删除
    Tag getTagByName(String name);//根据值获取
    List<Tag> listTagTop(Integer size);
    List<Tag> listTags(String ids);//传递的是一个
}

package net.yq.springbootblog.service;


import net.yq.springbootblog.NotFoundException;
import net.yq.springbootblog.PersisentObject.Tag;
import net.yq.springbootblog.repository.TagRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.JpaSort;
import org.springframework.stereotype.Service;


import javax.transaction.Transactional;
import java.util.*;

@Service
public class TagServiceImpl implements TagService{
    @Autowired
    private TagRepository tagRepository;//注入

    @Transactional
    @Override
    public Tag saveTag(Tag tag) {
        return tagRepository.save(tag);//保存
    }
    @Transactional
    @Override
    public Tag getTag(Long id) {
        return tagRepository.getById(id);//根据ID获取
    }

    @Transactional
    @Override
    public Page<Tag> listType(Pageable pageable) {
        return tagRepository.findAll(pageable);//分页查找全部
    }

    @Override
    public List<Tag> listTag() {//查找全部
        return tagRepository.findAll();
    }

    @Transactional
    @Override
    public Tag updateTag(Long id, Tag tag) {
        Tag t = tagRepository.getById(id);//先根据ID获取
        if (t == null){
            throw new NotFoundException("Not Found");
        }
        BeanUtils.copyProperties(tag,t);//不修改id的情况下修改值
        return tagRepository.save(t);
    }
    @Transactional
    @Override
    public void deleteTag(long id) {
        tagRepository.deleteById(id);//根据ID删除
    }
    @Override
    public List<Tag> listTagTop(Integer size) {//根据博客数量以倒序分页查询出标签数量,
        Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
        Pageable pageable = PageRequest.of(0,size,sort);
        return tagRepository.findTop(pageable);
    }

    @Transactional
    @Override
    public Tag getTagByName(String name) {
        return tagRepository.findByName(name);//根据值获取
    }

    @Override
    public List<Tag> listTags(String ids) {//1,2,3
        return tagRepository.findAllById(convertToList(ids));
    }

    private List<Long> convertToList(String ids){
        List<Long> list = new ArrayList<>();
        if (!"".equals(ids)&& ids!=null){
            String[] array = ids.split(",");
            for (int i=0; i<array.length;i++){
                list.add(new Long(array[i]));
            }
        }
        return list;
    }
}

package net.yq.springbootblog.service;

import net.yq.springbootblog.PersisentObject.Type;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

public interface TypeService {
    Type saveType(Type type);//保存
    Type getType(Long id);//根据ID查询
    Page<Type> listType(Pageable pageable);//分页
    Type updateType(Long id,Type type);//更新
    void deleteType(long id);//删除
    Type getTypeByName(String name);//根据值查询
    List<Type> listType();
    List<Type> listTypeTop(Integer size);
}

package net.yq.springbootblog.service;

import net.yq.springbootblog.NotFoundException;
import net.yq.springbootblog.PersisentObject.Type;
import net.yq.springbootblog.repository.TypeRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;


@Service
public class TypeServiceImpl implements TypeService{

    @Autowired
    private TypeRepository typeRepository;

    @Transactional
    @Override
    public Type saveType(Type type) {
        return typeRepository.save(type);//保存分类
    }
    @Transactional
    @Override
    public Type getType(Long id) {
        return typeRepository.getById(id);//根据ID查询
    }



    @Transactional
    @Override
    public Page<Type> listType(Pageable pageable) {
        return typeRepository.findAll(pageable);//分页查询
    }
    @Transactional
    @Override
    public Type updateType(Long id, Type type) {//更新分类
        Type t = typeRepository.getById(id);
        if (t == null){
            throw new NotFoundException("不存在该类型");
        }
        BeanUtils.copyProperties(type,t);
        return typeRepository.save(t);
    }
    @Transactional
    @Override
    public void deleteType(long id) {//删除分类
        typeRepository.deleteById(id);

    }

    @Override
    public Type getTypeByName(String name) {//根据内容值来查询
        return typeRepository.findByName(name);
    }

    @Override
    public List<Type> listType() {//获取全部分类以数组列表显示。
        return typeRepository.findAll();
    }

    @Override
    public List<Type> listTypeTop(Integer size) {//以倒叙获取到采用了这个分类的博客。
        Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
        Pageable pageable = PageRequest.of(0,size,sort);
        return typeRepository.findTop(pageable);
    }
}

代码放了后,就轮到控制器了。
也直接代码吧。

package net.yq.springbootblog.controller;


import net.yq.springbootblog.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class ArchivesShowController {

    @Autowired
    private BlogService blogService;

    @GetMapping("/archives")
    public String archives(Model model){
        model.addAttribute("archiveMap",blogService.archiveBlog());
        model.addAttribute("blogCount",blogService.countBlog());
        return "archives";
    }
}

至此就已经弄完了。基本没有别的改变了。完事

















































这是我的项目源文件压缩为7z丢在蓝奏云了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值