今天在昨天的基础上完成首页的设计
1.首页设计
首页最重要的是显示按类别排序前几的新闻、按标签排序前几的新闻和推荐的新闻以及提供搜索新闻的功能,核心代码如下所示
@GetMapping("/")
public String index(@PageableDefault(size = 5, sort = "updateTime", direction = Sort.Direction.DESC) Pageable p,
Model model) {
model.addAttribute("types", typeService.listTypeTop(3));
model.addAttribute("tags", tagService.listTagTop(3));
// 最新推荐 将recommend为true的新闻 通过更新事件做降序排序
model.addAttribute("recommendNews", newsService.listRecommendNewsTop(3));
model.addAttribute("page", newsService.listNews(p));
return "index";
}
// 搜索
@PostMapping("/search")
public String search(@PageableDefault(size = 5, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam String query, Model model) {
// query 可能是匹配标题或者内容
model.addAttribute("page", newsService.listNews("%" + query + "%", pageable));
return "search";
}
- 显示按类别排序前几的新闻
按照分页显示的功能,选择前几项进行展示。
@Override
public List<Type> listTypeTop(int i) {
// 需求 查询新闻数量前i的分类
// 利用分页 查询第一页数据 第一页数据量为i 排序方式为News集合的长度 降序排序
Sort sort = Sort.by(Sort.Direction.DESC, "news.size");
// of方法 参数一 查询页数的索引 参数二 为每页的数据量 参数三 排序方式
Pageable p = PageRequest.of(0, i, sort);
return typeRepository.findTop(p);
}
@Query("select t from Type t")
List<Type> findTop(Pageable p);
- 按标签排序前几的新闻
按照分页显示的功能,选择前几项进行展示。
@Override
public List<Tag> listTagTop(int i) {
Sort sort = Sort.by(Sort.Direction.DESC, "newsList.size");
Pageable p = PageRequest.of(0, i, sort);
return tagRepository.findTop(p);
}
@Query("select t from Tag t")
List<Tag> findTop(Pageable p);
2.总结
在这里用到的“搜索”实际上是利用sql的模糊查询。
SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。
SELECT 字段 FROM 表 WHERE 某字段 Like 条件