200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > SpringBoot搭建个人博客v1.0 - 博客管理功能实现(七)

SpringBoot搭建个人博客v1.0 - 博客管理功能实现(七)

时间:2018-11-27 22:20:03

相关推荐

SpringBoot搭建个人博客v1.0 - 博客管理功能实现(七)

实现博客分页查询、新增、修改、删除

一、创建持久层(Dao层)

创建接口 BlogRepository 继承 JpaRepository

package com.example.dao;import com.example.po.Blog;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.jpa.domain.Specification;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import java.util.List;public interface BlogRepository extends JpaRepository<Blog,Long> {Page<Blog> findAll(Specification<Blog> blogSpecification, Pageable pageable);@Query("select b from Blog b where b.recommend = true ")List<Blog> findTop(Pageable pageable);@Query("select b from Blog b where b.title like ?1 or b.content like ?1")Page<Blog> findByQuery(String query,Pageable pageable);@Modifying@Query("update Blog b set b.views=b.views+1 where b.id= ?1")int updateViews(Long id);}

二、创建service层

1.定义博客业务层接口

创建博客接口 BlogService,定义博客相关的方法

代码如下:

package com.example.service;import com.example.po.Blog;import com.example.vo.BlogQuery;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import java.util.List;public interface BlogService {// 根据id查询blogBlog getBlog(Long id);//转换为markdown语法输出Blog getAndConvert(Long id);//分页查询 blog查询条件Page<Blog> listBlog(Pageable pageable, BlogQuery blog);Page<Blog> listBlog(Pageable pageable);//根据查询跳转页面Page<Blog> listBlog(String query, Pageable pageable);List<Blog> listRecommendBlogTop(Integer size);//新增Blog saveBlog(Blog blog);//更新博客Blog updateBlog(Long id,Blog blog);void deleteBlog(Long id);}

2.创建接口的实现类

创建 BlogServiceImpl实现 用户接口 BlogService

代码如下:

package com.example.service.impl;import com.example.NotFoundException;import com.example.dao.BlogRepository;import com.example.po.Blog;import com.example.po.Type;import com.example.service.BlogService;import com.example.util.MarkdownUtils;import com.example.util.MyBeanUtils;import com.example.vo.BlogQuery;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.Specification;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import javax.persistence.criteria.CriteriaBuilder;import javax.persistence.criteria.CriteriaQuery;import javax.persistence.criteria.Predicate;import javax.persistence.criteria.Root;import java.util.ArrayList;import java.util.Date;import java.util.List;@Servicepublic class BlogServiceImpl implements BlogService {@Autowiredprivate BlogRepository blogRepository;@Overridepublic Blog getBlog(Long id) {return blogRepository.findById(id).orElse(null);}@Transactional@Overridepublic Blog getAndConvert(Long id) {Blog blog = blogRepository.findById(id).orElse(null);if (blog == null){throw new NotFoundException("该博客不存在");}//浏览次数增加blogRepository.updateViews(id);//不操做数据库 只进行转换Blog b= new Blog();BeanUtils.copyProperties(blog,b);String content = b.getContent();b.setContent(MarkdownUtils.markdownToHtmlExtensions(content));return b;}@Overridepublic Page<Blog> listBlog(Pageable pageable, BlogQuery blog) {return blogRepository.findAll(new Specification<Blog>() {@Overridepublic 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);}@Overridepublic Page<Blog> listBlog(Pageable pageable) {return blogRepository.findAll(pageable);}@Overridepublic Page<Blog> listBlog(String query, Pageable pageable) {return blogRepository.findByQuery(query,pageable);}@Overridepublic List<Blog> listRecommendBlogTop(Integer size) {// 设置排序对象Sort sort = Sort.by(Sort.Direction.DESC,"updateTime");Pageable pageable = PageRequest.of(0, size, sort);return blogRepository.findTop(pageable);}@Transactional@Overridepublic Blog saveBlog(Blog blog) {blog.setCreateTime(new Date()); //添加日期blog.setUpdateTime(new Date());blog.setViews(0);return blogRepository.save(blog);}@Transactional@Overridepublic Blog updateBlog(Long id, Blog blog) {//本质还是执行 saveBlog操作Blog b = blogRepository.findById(id).orElse(null);if (b == null){throw new NotFoundException("该博客不存在");}BeanUtils.copyProperties(blog,b, MyBeanUtils.getNullPropertyNames(blog));//前面赋值给后面 解决使用save方法的问题,在save更新的时候,发生改变的会更新,没发生改变的会置为空。System.out.println(blog);b.setUpdateTime(new Date());System.out.println(b);return blogRepository.save(b);}@Transactional@Overridepublic void deleteBlog(Long id) {blogRepository.deleteById(id);}}

三、博客控制器

创建 BlogController 博客控制器,在这里实现分页查询、添加、保存、修改分类、删除功能,代码如下:

package com.example.web.admin;import com.example.po.Blog;import com.example.po.User;import com.example.service.BlogService;import com.example.service.TagService;import com.example.service.TypeService;import com.example.vo.BlogQuery;import jdk.internal.util.xml.impl.Input;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 org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.mvc.support.RedirectAttributes;import javax.servlet.http.HttpSession;@Controller@RequestMapping("/admin")public class BlogController {private static final String INPUT = "admin/blogs-input";private static final String LIST = "admin/blogs";private static final String REDIRECT_LIST = "redirect:/admin/blogs";@Autowiredprivate BlogService blogService;@Autowiredprivate TypeService typeService;@Autowiredprivate TagService tagService;/*** 显示博客列表* @param pageable* @param blog* @param model* @return*/@GetMapping("/blogs")public String list(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC) //设置pageable 设置排序方式Pageable pageable, BlogQuery blog, Model model){model.addAttribute("types",typeService.listType()); //获取所有分类model.addAttribute("page", blogService.listBlog(pageable, blog));return LIST;}/*** 显示搜索博客的数据 (只显示搜索部分)* @param pageable* @param blog* @param model* @return*/@PostMapping("/blogs/search")public String search(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC) //设置pageable 设置排序方式Pageable pageable, BlogQuery blog, Model model){model.addAttribute("page", blogService.listBlog(pageable, blog));return "admin/blogs :: blogList"; //返回blogList片段}/*** 跳转新增页面* @param model* @return*/@GetMapping("/blogs/input")public String input(Model model){setTypeAndTag(model);model.addAttribute("blog",new Blog());return INPUT;}/*** 跳转修改页面* @param model* @return*/@GetMapping("/blogs/{id}/input")public String editInput(@PathVariable Long id,Model model){setTypeAndTag(model);Blog blog = blogService.getBlog(id);blog.init(); //将blog初始化一个字符串model.addAttribute("blog",blog);return INPUT;}private void setTypeAndTag(Model model) {model.addAttribute("types", typeService.listType());model.addAttribute("tags", tagService.listTag());}/*** 新增博客请求* @param blog* @param attributes* @param session* @return*/@PostMapping("/blogs")public String post(Blog blog, RedirectAttributes attributes, HttpSession session) {blog.setUser((User) session.getAttribute("user")); //设置创建博客的对象blog.setType(typeService.getType(blog.getType().getId()));blog.setTags(tagService.listTag(blog.getTagIds()));Blog b;if (blog.getId() == null) {b = blogService.saveBlog(blog); //新增博客} else {b = blogService.updateBlog(blog.getId(), blog); //修改博客}if (b == null ) {attributes.addFlashAttribute("message", "操作失败");} else {attributes.addFlashAttribute("message", "操作成功");}return REDIRECT_LIST;}@GetMapping("blogs/{id}/delete")public String delete(@PathVariable Long id, RedirectAttributes attributes){blogService.deleteBlog(id);attributes.addFlashAttribute("message","删除成功");return REDIRECT_LIST;}}

四、创建查询对象类

创建 BlogQuery

package com.example.vo;public class BlogQuery {private String title;private Long typeId;private boolean recommend;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。