1.添加热搜词功能
1.数据库表结构分析
热搜词表一共有三个字段,分别为主键id,搜索的关键词,及该关键字被搜索的次数
2.需求分析
当用户在前端进行搜索操作的时候,我们需要对该关键字进行判断,去根据搜索内容去表中查询,是否有记录,如果表中没有该记录,则说明该关键字是第一次被查询,需要做新增的操作,我们需要将该关键字存入数据库的表中并将搜索次数赋值为1,如果该字段在数据库中存在的话,就将该条数据的num字段进行+1,然后再存入数据库。
3.代码实现
dao层代码
public interface HotDao extends JpaRepository<Hot,String> {
//通过Content查询 jpa自定义查询的固定格式findBy+对应条件的字段
Hot findByContent(String key);
}
service层代码会在原来的查询全部视频列表的方法中进行扩展,会在原来查询的方法中新增加一个参数,搜索的关键字searchValue字段,在service层对该字段进行一个判断,如果该字段为空则说明,用户并没有做查询操作,只是进行小程序视频首页的浏览,会执行原来的逻辑,如果该关键字不为空,则说明用户在进行查询操作,这是我们就要对当前的关键字进行处理了
/**
* 查询全部的视频,分页
* @param searchValue
* @param pageNum
* @param size
* @return
*/
@Override
@Transactional
public PageResult findAllVideos(final String searchValue , Integer pageNum, Integer size) {
//创建一个分页结果类
PageResult pageResult =new PageResult();
List<VideosVo> videosVoList =new ArrayList<VideosVo>();
Page<Videos> videosPage=null;
//对搜索的关键字进行查询,如果数据库中没有,就新添加一条数据,如果有,就在num上做+1的操作
if (!StringUtils.isEmpty(searchValue)){
//根据搜索内容查询
Hot byContent = hotDao.findByContent(searchValue);
//如果返回值为空,则说明该关键字没有被人搜索过,所以将该关键字添加到数据库,并将搜索次数设置为1
if (StringUtils.isEmpty(byContent)){
Hot hot =new Hot();
hot.setId(IdUtils.getId());
hot.setContent(searchValue);
hot.setNum(1l);
hotDao.save(hot);
}
//如果返回结果不为空,则说明该关键字已经被搜索过,在该关键字的搜索次数字段自增1,并保存
if (!StringUtils.isEmpty(byContent)){
byContent.setNum(byContent.getNum()+1);
hotDao.save(byContent);
}
//将前端传来的页数和每页数据数放入PageRequest中,因为前端分页都是从1开始的所以,这里我们需要-1
Pageable pageable =new PageRequest(pageNum-1,size);
//通过视频描述模糊查询视频,返回分页结果
videosPage= findAllVideosByVideoDesc(searchValue,pageable);
}
//当searchValue为空的时候,说明用户是直接来到视频展示页,没有做搜索操作
if (StringUtils.isEmpty(searchValue)){
//创建一个排序条件,降序排列,按照创建日期排序
Sort sort =new Sort(Sort.Direction.DESC,"createTime");
//将页数,和每页大小以及排序条件传入分页对象
Pageable pageable =new PageRequest(pageNum-1,size,sort);
//返回一个page列表
videosPage= videosDao.findAll(pageable);
}
//将当前为第几页传入分页结果中
pageResult.setPage(pageNum);
//传入总页数
pageResult.setTotalPage(videosPage.getTotalPages());
//传入总记录数
pageResult.setTotalElements(videosPage.getTotalElements());
//通过对page中的对象进行遍历,做数据收集,最后返回videosVoList
for (Videos v:videosPage
) {
VideosVo videosVo =new VideosVo();
Users users = usersDao.findOne(v.getUserId());
BeanUtils.copyProperties(users,videosVo);
BeanUtils.copyProperties(v,videosVo);
videosVoList.add(videosVo);
}
//将videosVoList存入分页结果中
pageResult.setRows(videosVoList);
return pageResult;
}
2.查询热搜词功能
1.需求分析
在前端用户搜索界面时,页面上会有热搜词展示的功能,后端需要将搜索量排行前5的关键词查询到并返回给前端页面
2.代码实现
/**
* 查询热搜词列表,并按照搜索次数降序排列,并只显示前5条数据
* @return
*/
@Override
public List<String> findHot() {
List<String> list =new ArrayList<String>();
//定义一个排序的条件,该条件为按照num的大小对数据库表中数据进行降序排列
Sort sort =new Sort(Sort.Direction.DESC,"num");
//定义一个分页的类,表示取第1页,每页5条数据,也就是取出前5条数据
Pageable pageable =new PageRequest(0,5,sort);
Page<Hot> hotPage = hotDao.findAll(pageable);
//并将查询到的数据的关键字内容添加进list列表,并返回给前端
for (Hot h:hotPage
) {
list.add(h.getContent());
}
return list;
}
3.搜索功能的实现
1.需求分析
本项目中使用到的搜索工具为GitHub上的一个开源搜索框架,在后面介绍小程序端实现的时候会详细介绍,而我们后端的接口会在原有的查询视频列表功能上进行扩展,上面在编写热搜词相关操作时候也已经涉及到,因为是搜索操作所以我们需要对用户传进来的关键字进行模糊查询返回结果。
2.自定义模糊查询
/**
* 根据条件分页模糊查询,用来做搜索时候使用
* @param searchValue
* @param pageable
* @return
*/
public Page<Videos> findAllVideosByVideoDesc(final String searchValue,Pageable pageable){
Page<Videos> videoDesc = videosDao.findAll(new Specification<Videos>() {
@Override
public Predicate toPredicate(Root<Videos> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
Predicate predicate = cb.like(root.get("videoDesc").as(String.class), "%" + searchValue + "%");
return predicate;
}
}, pageable);
return videoDesc;
}
其余逻辑上面也已经介绍了,就不多说了