springboot新闻管理

文章目录

  • 条件查询与分页展示
  • 新增
  • 编辑与删除

条件查询与分页展示

1.Tag实体类新增属性,构造相应get,set函数

 @ManyToMany(mappedBy = "tags")
    private List<News> newsList = new ArrayList<>();

2.News中新增属性,构造相应get,set函数,改变toString函数

    @ManyToMany(cascade = CascadeType.PERSIST)   //级联
    private List<Tag> tags = new ArrayList<>();
    
    @Transient
    private String tagIds;

    private String description;

3.创建vo包,VO是指value object值对象,通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。一般来说,PO只能用在数据层,VO用在商业逻辑层和表示层。在vo包下创建NewsQuery类,我们利用NewsQuery类专门处理新闻管理界面的条件查询。因为我们需要通过新闻的标题、类型以及是否被推荐作为条件来查询数据库里的新闻,所以我们就利用这三个属性来组成一个查询类。

public class NewQuery {
     
    private String title;

    private Long typeId;

    private boolean recommend;


    public String getTitle() {
     
        return title;
    }

    public void setTitle(String title) {
     
        this.title = title;
    }

    public Long getTypeId() {
     
        return typeId;
    }

    public void setTypeId(Long typeId) {
     
        this.typeId = typeId;
    }

    public boolean isRecommend() {
     
        return recommend;
    }

    public void setRecommend(boolean recommend) {
     
        this.recommend = recommend;
    }

    @Override
    public String toString() {
     
        return "NewQuery{" +
                "title='" + title + '\'' +
                ", typeId=" + typeId +
                ", recommend=" + recommend +
                '}';
    }
}

4.新建NewService接口

public interface NewService {
     

    //新闻管理页面,组合条件查询
    Page<News> listNew(Pageable pageable, NewQuery newQuery);
}

5.新建NewServiceImpl类,实现上面接口

@Service
public class NewServiceImpl implements NewService {
     
    @Autowired
    private NewRepository newRepository;

    //新闻管理中的列表(包含了查询)
    @Override
    public Page<News> listNew(Pageable pageable, NewQuery newQuery) {
     
        return newRepository.findAll(new Specification<News>() {
     
            @Override
            public Predicate toPredicate(Root<News> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
     
                List<Predicate> predicates = new ArrayList<>();
                if(!"".equals(newQuery.getTitle())&&newQuery.getTitle()!=null){
     
                    predicates.add(cb.like(root.<String>get("title"),"%"+newQuery.getTitle()+"%"));
                }
                if(newQuery.getTypeId()!=null){
     
                    predicates.add(cb.equal(root.get("type").get("id"),newQuery.getTypeId()));
                }
                if(newQuery.isRecommend()){
     
                    predicates.add(cb.equal(root.get("recommend"),newQuery.isRecommend()));
                }
                cq.where(predicates.toArray(new Predicate[predicates.size()]));
                return null;
            }
        },pageable);
    }
}

6.在TypeService和Impl中添加新的接口和实现方法
接口:

List<Type> listType();

实现方法:

  @Override
    public List<Type> listType() {
     
        return typeRepository.findAll();
    }

7.新建NewController类

@Controller
@RequestMapping("/admin")
public class NewController {
     

    private static final String INPUT = "admin/news-input";

    private static final String LIST = "admin/news";

    private static final String REDIRECT_LIST = "redirect:/admin/news";

    @Autowired
    private NewService newService;

    @Autowired
    private TypeService typeService;

    @Autowired
    private TagService tagService;

    @GetMapping("/news")
    public String news(@PageableDefault(size = 3,sort = {
     "updateTime"},direction = Sort.Direction.DESC)
                       Pageable pageable, NewQuery newQuery, Model model){
     
        model.addAttribute("types",typeService.listType());
        model.addAttribute("page",newService.listNew(pageable,newQuery));
        return LIST;
    }
    
    @PostMapping("/news/search")
    public String search(@PageableDefault(size = 3,sort = {
     "updateTime"},direction = Sort.Direction.DESC)
                                 Pageable pageable, NewQuery newQuery, Model model) {
     
        model.addAttribute("page", newService.listNew(pageable, newQuery));
        return "admin/news :: newsList";
    }
}

至此,条件查询和分页展示完成

新增

1.在NewService中新加接口(包含添加,更新和删除),并在Impl中实现
接口:

    News saveNew(News news);

    News getNew(Long id);

    News updateNew(Long id,News news);
    
    void deleteNew(Long id);

实现:

    @Override
    public  News saveNew(News news){
     
        if(news.getId()==null){
     
            news.setCreatTime(new Date());
            news.setUpdateTime(new Date());
        }
        return newRepository.save(news);
    }

    @Override
    public News getNew(Long id) {
     
        return newRepository.findById(id).orElse(null);
    }

    @Override
    public News updateNew(Long id, News news) {
     
        News news1 = newRepository.findById(id).orElse(null);
        if(news1==null){
     
            System.out.println("未获得更新对象");
        }
        BeanUtils.copyProperties(news,news1);
        news1.setUpdateTime(new Date());
        return newRepository.save(news1);
    }

    @Override
    public void deleteNew(Long id) {
     
        newRepository.deleteById(id);
    }


2.在NewController中写上添加功能

    public void setTypeAndTag(Model model){
     
        model.addAttribute("types",typeService.listType());
        model.addAttribute("tags",tagService.listTag());
    }

    @GetMapping("/news/input")
    public String input(Model model){
     
        setTypeAndTag(model);
        model.addAttribute("news",new News());
        return INPUT;
    }
    
    @PostMapping("/news/add")
    public String post(News news, RedirectAttributes attributes, HttpSession session){
     
        System.out.println("controller接收的news为:"+news);
        news.setUser((User) session.getAttribute("user"));
        news.setType(typeService.getType(news.getType().getId()));
        news.setTags(tagService.listTag(news.getTagIds()));
        News news1;
        if(news.getId()==null){
     
            news1 = newService.saveNew(news);
        }else {
     
            news1 = newService.updateNew(news.getId(),news);
        }
        if(news1==null){
     
            attributes.addFlashAttribute("message","操作失败");
        }else {
     
            attributes.addFlashAttribute("message","操作成功");
        }
        return REDIRECT_LIST;
    }

至此,添加完成

编辑与删除

因为在写添加时,在NewService和Impl中已经将接口和实现方法写了,所以现在只需编写NewController类,实现编辑功和删除功能即可,又因为编辑和新增后的数据更新一样,所以编辑只用写页面跳转
1.在News新加一个初始函数与一个将List类型的数据转化为String类型的方法

    public void init(){
     
        this.tagIds = tagsToIds(this.getTags());
    }

    private String tagsToIds(List<Tag> tags){
     
        if(!tags.isEmpty()){
     
            StringBuffer ids = new StringBuffer();
            boolean flag = false;
            for(Tag tag:tags){
     
                if(flag){
     
                    ids.append(",");
                }else {
     
                    flag=true;
                }
                ids.append(tag.getId());
            }
            return ids.toString();
        }else {
     
            return tagIds;
        }
    }

2.编写编辑跳转和删除

    @GetMapping("news/{id}/toUpdate")
    public String toUpdate(@PathVariable Long id,Model model){
     
        setTypeAndTag(model);
        News news = newService.getNew(id);
        news.init();
        model.addAttribute("news",news);
        return INPUT;
    }

    @GetMapping("/news/{id}/delete")
    public String deleteNew(@PathVariable Long id,RedirectAttributes attributes){
     
        newService.deleteNew(id);
        attributes.addFlashAttribute("message","删除成功");
        return REDIRECT_LIST;
    }

至此,编辑和删除完成
运行结果如下:
1编辑:
springboot新闻管理_第1张图片
springboot新闻管理_第2张图片springboot新闻管理_第3张图片

2.删除
springboot新闻管理_第4张图片
springboot新闻管理_第5张图片
3.新增
springboot新闻管理_第6张图片springboot新闻管理_第7张图片

springboot新闻管理_第8张图片4.查询
springboot新闻管理_第9张图片

你可能感兴趣的:(java,spring,boot)