概要
需求:用户点击增加点赞数,再次点击取消点赞,并记录点赞数
1.使用redis记录点赞信息,防止重复点赞或取消点赞
2.使用数据库记录点赞记录、用户表记录点赞数
点赞记录表
/**
* 点赞记录表
*/
@Data
@Table(name = "body_wear_like_log")
public class BodyWearLikeLog implements Serializable {
/**
* id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT LAST_INSERT_ID()")
private Integer id;
/**
* A点赞B A
*/
@Column(name = "source_id")
private Integer sourceId;
/**
* A点赞B B
*/
@Column(name = "target_id")
private Integer targetId;
/**
* 点赞时间
*/
@Column(name = "like_time")
private Date likeTime;
/**
* 更新时间
*/
@Column(name = "update_time")
private Date updateTime;
/**
* 删除标记
*/
private Boolean del;
点赞逻辑代码
public AppLikeNumAvatarVo likeAvatar(Integer sourceId, String tlId, Integer likeStatus) {
AppLikeNumAvatarVo appLikeNumAvatarVo = new AppLikeNumAvatarVo();
Integer likeNum = 0;
//查询是否有点赞用户的点赞记录
Integer targetId = memberAvatar.getId();
String redisKey = "likeAvatar_" + sourceId + "_" + targetId;
Integer redisValue = (Integer) redisTemplate.opsForValue().get(redisKey);
if (Objects.isNull(redisValue) && likeStatus == 1) {
BodyWearLikeLog likeLog = bodyWearLikeLogMapper.getByLikeLog(sourceId, targetId);
if (likeLog == null) {
BodyWearLikeLog bodyWearLikeLog = new BodyWearLikeLog();
bodyWearLikeLog.setSourceId(sourceId);
bodyWearLikeLog.setTargetId(targetId);
bodyWearLikeLog.setLikeTime(new Date());
bodyWearLikeLog.setUpdateTime(new Date());
bodyWearLikeLog.setDel(false);
bodyWearLikeLogMapper.insertSelective(bodyWearLikeLog);
likeNum = memberAvatar.getLikeNum() + 1;
appLikeNumAvatarVo.setLikeNum(likeNum);
appLikeNumAvatarVo.setLikeStatus(true);
redisTemplate.opsForValue().set(redisKey, likeStatus);
//更新点赞数量
memberAvatarMapper.updateLikeNum(targetId, likeNum);
} else {
//点赞
if (likeLog.getDel()) {
bodyWearLikeLogMapper.updateDel(likeLog.getId(), false);
likeNum = memberAvatar.getLikeNum() + 1;
appLikeNumAvatarVo.setLikeNum(likeNum);
appLikeNumAvatarVo.setLikeStatus(true);
redisTemplate.opsForValue().set(redisKey, likeStatus);
//更新点赞数量
memberAvatarMapper.updateLikeNum(targetId, likeNum);
}
}
}
if (Objects.nonNull(redisValue) && likeStatus == 0) {
BodyWearLikeLog likeLog = bodyWearLikeLogMapper.getByLikeLog(sourceId, targetId);
if (likeLog != null && !likeLog.getDel()) {
//取消点赞 减数量
bodyWearLikeLogMapper.updateDel(likeLog.getId(), true);
likeNum = memberAvatar.getLikeNum() - 1;
appLikeNumAvatarVo.setLikeNum(likeNum);
appLikeNumAvatarVo.setLikeStatus(false);
redisTemplate.delete(redisKey);
//更新点赞数量
if (likeNum < 0) {
memberAvatarMapper.updateLikeNum(targetId, likeNum);
}
}
}
return appLikeNumAvatarVo;
}