要达到的效果:
- 在新闻管理界面显示所有已发布的新闻集合
- 可以在列表中对所需要的新闻根据分类和标签进行筛选搜索
- 可以对已有新闻删除
首先要显示所有新闻,就要从数据库中查找:
1 在dao层接口
@Query("select n from News n where n.recommend=true")
List<News> findTop(Pageable pageable);
2 Service层条件查找
在Service层中,对新闻根据标签进行筛选:
这里从前端页面获取查询,用find方法进行条件查找,这里用了一个匿名内部类,根据查到的数据Type、Tag、title是否和页面询问的一致来构建predict参数,进行查询。
@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("recommand"),newQuery.isRecommend()));
}
cq.where(predicates.toArray(new Predicate[predicates.size()]));
return null;
}
},pageable);
}
3 Controller层调用方法,传递给前端
两个方法,news是显示当前所有类型以供用户选择、同时分页显示所有新闻。
search方法用来响应搜索请求。
@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";
}
4 前端编写
用jquery获取页面中的参数。
function loaddata() {
$("#table-container").load(/*[[@{/admin/news/search}]]*/"/admin/news/search",{
title : $("[name='title']").val(),
typeId : $("[name='typeId']").val(),
recommend : $("[name='recommend']").prop('checked'),
page : $("[name='page']").val()
});
}
用th循环显示文章内容:
<tr th:each="news,iterStat : ${page.content}">
<td th:text="${iterStat.count}">1</td>
<td th:text="${news.title}">刻意练习清单</td>
<td th:text="${news.type.name}">认知升级</td>
<td th:text="${news.recommend} ? '是':'否'">是</td>
<td th:text="${news.published} ? '发布':'草稿'">草稿</td>
<td th:text="${news.updateTime}">2017-10-02 09:45</td>
<td>
<a href="#" th:href="@{/admin/news/{id}/toUpdate(id=${news.id})}" class="ui mini teal basic button">编辑</a>
<a href="#" th:href="@{/admin/news/{id}/delete(id=${news.id})}" class="ui mini red basic button">删除</a>
</td>
</tr>