【中软国际实习】Day 9:Sprint Boot:TNews项目实现新闻的新建、编辑和搜索


本次迭代主要实现新闻的新建、编辑与搜索功能。新建与编辑与之前类似,不同的是新闻需要加入MarkDown文本编辑器,将编辑器内容保存起来。

一、新建

Controller层

@Controller
@RequestMapping("/admin/news")
public class NewsController {

    @Autowired
    private NewsService newsService;
    @Autowired
    private TypeService typeService;
    @Autowired
    private TagService tagService;

    //先查询所有
    @RequestMapping
    public String list(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC ) Pageable pageable,
                       Model model){
        //分页
        Page<News> page=newsService.findByPageable(pageable);
        model.addAttribute("page",page);
        model.addAttribute("types",typeService.listType());
        return "admin/news";
    }
    @RequestMapping("input/{id}")
    public String toInput(@PathVariable Long id,Model model){
        if(id==-1){
            //新增
            model.addAttribute("news",new News());
        }else{
            //编辑,根据id查找
            News news=newsService.findNewsById(id);
            String tagIds=tagService.getTagIds(news.getTags());
            news.setTagIds(tagIds);

            model.addAttribute("news",news);

        }
        List<Type> types=typeService.listType();//重载,查出所有的分类
        model.addAttribute("types",types);
        //查所有的标签
        List<Tag> tags=tagService.listTag();
        model.addAttribute("tags",tags);
        return "admin/news-input";
    }
}

Service层

@Override
public String getTagIds(List<Tag> tags) {
    
    StringBuffer ids=new StringBuffer();  //创建字符串
    if(!tags.isEmpty()){
        boolean flag=false;
        //第一次,第二次需要拼接逗号
        for(Tag t:tags){
            if(flag){
                ids.append(",");
                ids.append(t.getId());
            }else{  //第一次
                ids.append(t.getId());
                flag=true;
            }
        }
    }
    return ids.toString();
}

二、编辑

Controller层

@RequestMapping("input")
public String input(News news,HttpSession session ){
    //从session中取出用户
    User user=(User)session.getAttribute("users");
    news.setUser(user);
    //保存tag的id
    List<Tag> tags=tagService.findTagByTagId(news.getTagIds());
    news.setTags(tags);
    newsService.input(news);
    return "redirect:/admin/news";
}

Service层

其中input()方法用来保存新闻新建的时间和修改新闻的时间

@Override
public void input(News news) {
    if(news.getId()==null){
        //创建的时间
        news.setCreateTime(new Date());
        newsDao.save(news);
    }else{
        //更新时间
        news.setUpdateTime(new Date());
        News n=newsDao.getOne(news.getId());
        BeanUtils.copyProperties(news,n, MyBeanUtils.getNullPropertyNames(news));
        newsDao.save(n);
    }

}

@Override
public List<Tag> findTagByTagId(String tagIds) {
    List<Long> ids=new ArrayList<>();
    if(!StringUtils.isEmpty(tagIds)){
        String[] strings = tagIds.split(",");//以逗号分隔id,得到一个数组
        //对数组进行遍历
        for(String s:strings){
            if(!StringUtils.isEmpty(s)){
                ids.add(new Long(s));
            }
        }
    }
    return tagDao.findAllById(ids);
}

三、搜索

本次搜索功能设置了多项筛选内容以供搜索。

实体类

public class NewsQuery {
    private String title;
    private String typeId;
    private Boolean recommend;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTypeId() {
        return typeId;
    }
    public void setTypeId(String typeId) {
        this.typeId = typeId;
    }
    public Boolean getRecommend() {
        return recommend;
    }
    public void setRecommend(Boolean recommend) {
        this.recommend = recommend;
    }
    @Override
    public String toString() {
        return "NewsQuery{" +
                "title='" + title + '\'' +
                ", typeId='" + typeId + '\'' +
                ", recommend=" + recommend +
                '}';
    }
}

前端

初始化对象。此外,如果搜索的结果过多,我们还需要page对象来实现搜索结果的分页显示。

function page(obj){
  $("[name='page']").val($(obj).data("page"));
  load();
}
$("#search-btn").click(function () {
  $("[name='page']").val(0);
  load();
});
function load() {
  $("#table-container").load("/admin/news/search",{
            title: $("[name='title']").val(),
            typeId: $("[name='typeId']").val(),
            recommend: $("[name='recommend']").prop('checked'),
            page : $("[name='page']").val()
          }
    )
}

Controller层

page对象用于分页,newQuery对象用于查询,model对象用于将结果传递到前端

@RequestMapping("search")
public String search(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable,NewsQuery newsQuery,Model model){
    Page<News> page = newsService.searchNews(pageable,newsQuery);
    model.addAttribute("page",page);

    return "admin/news :: newsList";
}

Service层

实现在数据库搜索数据

@Override
public Page<News> searchNews(Pageable pageable, NewsQuery newsQuery) {
    Page<News> page = newsDao.findAll(new Specification<News>() {
        @Override
        public Predicate toPredicate(Root<News> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
            List<Predicate> predicates = new ArrayList<>();
            if(!StringUtils.isEmpty(newsQuery.getTitle())){
                predicates.add(criteriaBuilder.like(root.<String>get("title"),"%"+newsQuery.getTitle()+"%"));
            }
            if(!StringUtils.isEmpty(newsQuery.getTypeId())){
                predicates.add(criteriaBuilder.equal(root.<Type>get("type").get("id"),newsQuery.getTypeId()));
            }
            if(newsQuery.getRecommend()!=null && newsQuery.getRecommend()){
                predicates.add(criteriaBuilder.equal(root.<Boolean>get("recommend"),newsQuery.getRecommend()));
            }
            criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
            return null;
        }
    }, pageable);
    return page;
}

界面

在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页