SpringBoot项目学习-博客系统-part3

最热标签

  1. 根据文档可以知道接口的地址、请求方式,以及请求参数
  2. 创建一个专门用来管理标签的接口

controller

TagsController

@RestController
@RequestMapping("tags")
public class TagsController {

    @Autowired
    private TagsService tagsService;

    @GetMapping("/hot")
    public Result listHotTags() {
        int limit = 6;
        List<TagVo> tagVoList = tagsService.hot(limit);
        return Result.success(tagVoList);
    }

}
  1. 根据返回数据形式可以知道,返回只有tag表中的内容,没有avatar,但是之前有tag类以及TagVo类,所以没必要再新建一个类,直接使用TagVo类。

service

TagsService

public interface TagsService {

    List<TagVo> hot(int limit);

}

TagsServiceImpl

@Service
public class TagsServiceImpl implements TagsService {
    @Autowired
    private TagMapper tagMapper;

    public TagVo copy(Tag tag){
        TagVo tagVo = new TagVo();
        BeanUtils.copyProperties(tag,tagVo);
        return tagVo;
    }
    public List<TagVo> copyList(List<Tag> tagList){
        List<TagVo> tagVoList = new ArrayList<>();
        for (Tag tag : tagList) {
            tagVoList.add(copy(tag));
        }
        return tagVoList;
    }
    @Override
    public List<TagVo> hot(int limit) {

        List<Long> hotsTagIds = tagMapper.findHotsTagIds(limit);
        if (CollectionUtils.isEmpty(hotsTagIds)){
            return Collections.emptyList();
        }
        List<Tag> tagList = tagMapper.findTagsByTagIds(hotsTagIds);
        return copyList(tagList);
    }

}

Dao

public interface TagMapper extends BaseMapper<Tag> {

    List<Tag> findTagsByTagIds(List<Long> tagIds);

    List<Long> findHotsTagIds(int limit);
}
  • 最热标签一定是对应标签下文章数最多的;在数据库中同样文章标签表和标签表进行关联,根据标签id在文章标签表中进行一个group by 再根据各自的总和进行一个降序,只取前n个,下面是sql
    语句
select tag_id
from `ms_article_tag`
group by tag_id
order by count(*) desc
limit 6

sql

<select id="findHotsTagIds" parameterType="int" resultType="java.lang.Long">
select tag_id
from `ms_article_tag`
group by tag_id
order by count(*) desc
limit #{limit}
</select>
上一篇:Mysql 中 select 语句的处理顺序


下一篇:php后端实现分页查询