最热标签
- 根据文档可以知道接口的地址、请求方式,以及请求参数
- 创建一个专门用来管理标签的接口
controller
@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);
}
}
- 根据返回数据形式可以知道,返回只有tag表中的内容,没有avatar,但是之前有tag类以及TagVo类,所以没必要再新建一个类,直接使用TagVo类。
service
public interface TagsService {
List<TagVo> hot(int limit);
}
@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>