朋友圈的點贊實現。
阿新 • • 發佈:2018-12-30
緊接著上一篇文章,這裡講如何實現朋友圈點讚的功能,並且記錄了是誰點的贊,區分出我是否點過贊。
其實本來點贊功能最先是被我用在文章上面的,文章有評論點贊收藏功能,琢磨了一段時間。後來的朋友圈點贊實現也就直接使用之前寫過的程式碼了。
點贊其實很好做,記錄點贊數++ 就可以實現,但是我們需要判斷出當前使用者是否點贊過,點過讚的標識出已點讚的狀態,所以我們需要記錄一條訊息的點贊人id,當用戶每次點讚的時候去查詢一下點贊列表裡是否存在當前使用者的id。
訊息id作為key,點贊人的uid作為value,放到redis中。
儲存的時候沒有使用陣列或字串,而是直接把list[long] 儲存的uid集合序列化了。在讀取遍歷的時候比較方便,但是取消點讚的時候需要遍歷移除掉其中一位,不確定list合適不合適做為儲存結構。
查詢朋友圈的時候需要遍歷redis中的值,然後把uid替換成暱稱。
@Override
public Page<TimelineDetail> page(long uid, int page, int pageSize) {
int startNumber = (page - 1) * 10;
Collection<TimelineDetail> list = timelineDetailMapper.page(uid, startNumber, pageSize);
list.forEach(i -> getLikedAndCount(i, uid));
return new Page<TimelineDetail>(list, 0, pageSize, page);
}
/**
* 拿到是否點過贊 和點贊總數
* 再獲取點讚的人名。。
*/
private void getLikedAndCount(TimelineDetail timelineDetail, long uid) {
Collection<Long> list = getLikeList(timelineDetail.getMessageId());
if (CollectionUtils.isNotEmpty(list)) {
List<String> nicknames = timelineDetailMapper.listNickname(list);
if (CollectionUtils.isNotEmpty(nicknames)) {
StringBuilder sb = new StringBuilder();
nicknames.stream().filter(StringUtils::isNotEmpty).forEach(i -> sb.append(i).append(","));
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
timelineDetail.setLikeNickname(sb.toString());
}
list.stream()
.filter(i -> i == uid)
.forEach(i -> timelineDetail.setLiked(true));
timelineDetail.setLikeCount(list.size());
}
}
ps 如果我不記錄一下自己做過的內容的話,估計過了一段時間真的就會忘記了。。。
當時寫的匆忙,其實應該優化一下的,比如說用HashSet會比ArrayList更好。