行为微服务leadnews-behavior
一、点赞/取消点赞、不喜欢/取消不喜欢、阅读次数
数据都存在redis中的hashmap中,以(key,field,value)的形式,如key是behavior_like + articleId,field是userId,value存dto。
点赞/取消点赞
package com.heima.behavior.service.impl; import com.alibaba.fastjson.JSON; import com.heima.behavior.service.ApLikesBehaviorService; import com.heima.common.constants.BehaviorConstants; import com.heima.common.redis.CacheService; import com.heima.model.behavior.dtos.LikesBehaviorDto; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.user.pojos.ApUser; import com.heima.utils.common.thread.AppThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @Slf4j public class ApLikesBehaviorServiceImpl implements ApLikesBehaviorService { @Autowired private CacheService cacheService; /** * 用户点赞或取消点赞 * * @param dto * @return */ @Override public ResponseResult like(LikesBehaviorDto dto) { //1、检查参数 if(dto == null || dto.getArticleId() == null || checkParam(dto)){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } //2、是否登录 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } //3、点赞或取消点赞 if(dto.getOperation() == 0){ //点赞 Object obj = cacheService.hGet(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString()); if(obj != null){ return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "已经点赞了"); } //保存当前key log.info("保存当前key:{}, {}, {}", dto.getArticleId(), user.getId(), dto); cacheService.hPut(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto)); }else{ //取消点赞,删除当前key log.info("删除当前key:{}, {}", dto.getArticleId(), user.getId()); cacheService.hDelete(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString()); } return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } /** * 检查参数 * @param dto * @return */ private boolean checkParam(LikesBehaviorDto dto) { //operation:0点赞,1取消点赞 //type:0文章,1动态,2评论 if(dto.getType() > 2 || dto.getType() < 0 || dto.getOperation() < 0 || dto.getOperation() > 1){ return true; } return false; } }
不喜欢/取消不喜欢
package com.heima.behavior.service.impl; import com.alibaba.fastjson.JSON; import com.heima.behavior.service.ApUnlikesBehaviorService; import com.heima.common.constants.BehaviorConstants; import com.heima.common.redis.CacheService; import com.heima.model.behavior.dtos.UnLikesBehaviorDto; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.user.pojos.ApUser; import com.heima.utils.common.thread.AppThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Slf4j @Transactional public class ApUnlikesBehaviorServiceImpl implements ApUnlikesBehaviorService { @Autowired private CacheService cacheService; /** * dto:0不喜欢,1取消不喜欢 * * @param dto * @return */ @Override public ResponseResult unLike(UnLikesBehaviorDto dto) { //参数验证 if(dto == null || dto.getArticleId() == null){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } //是否登录 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } if(dto.getType() == 0){ log.info("保存key:{},{},{}", BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId(), user.getId(), JSON.toJSONString(dto)); //不喜欢 cacheService.hPut(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto)); }else{ log.info("删除key:{},{}", BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId(), user.getId()); //取消不喜欢,删除key cacheService.hDelete(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString()); } return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } }
阅读记录
package com.heima.behavior.service.impl; import com.alibaba.fastjson.JSON; import com.heima.behavior.service.ApReadBehaviorService; import com.heima.common.constants.BehaviorConstants; import com.heima.common.redis.CacheService; import com.heima.model.behavior.dtos.ReadBehaviorDto; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.user.pojos.ApUser; import com.heima.utils.common.thread.AppThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @Slf4j public class ApReadBehaviorServiceImpl implements ApReadBehaviorService { @Autowired private CacheService cacheService; @Override public ResponseResult readBehavior(ReadBehaviorDto dto) { //1.检查参数 if (dto == null || dto.getArticleId() == null) { return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } //2.是否登录 ApUser user = AppThreadLocalUtil.getUser(); if (user == null) { return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } //更新阅读次数 String readBehaviorJson = (String) cacheService.hGet(BehaviorConstants.READ_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString()); if (StringUtils.isNotBlank(readBehaviorJson)) { ReadBehaviorDto readBehaviorDto = JSON.parseObject(readBehaviorJson, ReadBehaviorDto.class); dto.setCount((short) (readBehaviorDto.getCount() + dto.getCount())); } // 保存当前key log.info("保存当前key:{} {} {}", dto.getArticleId(), user.getId(), dto); cacheService.hPut(BehaviorConstants.READ_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString(), JSON.toJSONString(dto)); return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } }
二、关注/取消关注
ap_user_follow:关注的用户
ap_user_fan:你的粉丝
当你关注别人时,你成为别人的粉丝,follow别人。而被你关注的用户则多了一个粉丝fan。
取消关注同理:不follow该用户了,并且该用户会少一个fan。
在leadnews-user微服务中实现关注/取消关注。
package com.heima.user.service.impl; import com.heima.common.constants.BehaviorConstants; import com.heima.common.redis.CacheService; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.user.dtos.UserRelationDto; import com.heima.model.user.pojos.ApUser; import com.heima.user.service.UserRelationService; import com.heima.utils.common.thread.AppThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @Slf4j public class UserRelationServiceImpl implements UserRelationService { @Autowired private RedisTemplate redisTemplate; @Autowired private CacheService cacheService; /** * 关注/取消关注 * * @param dto * @return */ @Override public ResponseResult follow(UserRelationDto dto) { //参数验证, 0关注、1取关 if(dto.getOperation() == null || dto.getOperation() < 0 || dto.getOperation() > 1){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } //判断是否登录 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } Integer userId = user.getId(); Integer authorId = dto.getAuthorId(); //关注 if(dto.getOperation() == 0){ //我follow对方 cacheService.zAdd(BehaviorConstants.APUSER_FOLLOW_RELATION + userId, authorId.toString(), System.currentTimeMillis()); //该authorId多了一个fan cacheService.zAdd(BehaviorConstants.APUSER_FANS_RELATION + authorId, userId.toString(), System.currentTimeMillis()); }else{ //取消关注 cacheService.zRemove(BehaviorConstants.APUSER_FOLLOW_RELATION + userId, authorId.toString()); cacheService.zRemove(BehaviorConstants.APUSER_FANS_RELATION + authorId, userId.toString()); } return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } }
三、文章收藏
package com.heima.article.service.impl; import com.alibaba.fastjson.JSON; import com.heima.article.service.ApCollectionService; import com.heima.common.constants.BehaviorConstants; import com.heima.common.redis.CacheService; import com.heima.model.article.dtos.CollectionBehaviorDto; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.user.pojos.ApUser; import com.heima.utils.common.thread.AppThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @Slf4j public class ApCollectionServiceImpl implements ApCollectionService { @Autowired private CacheService cacheService; /** * 收藏/不收藏 * * @param dto * @return */ @Override public ResponseResult collection(CollectionBehaviorDto dto) { //参数验证 if(dto == null || dto.getEntryId() == null){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } //判断是否登录 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } //查询是否已经收藏 String collectionJson = (String)cacheService.hGet(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(), dto.getEntryId().toString()); if(StringUtils.isNotBlank(collectionJson) && dto.getOperation() == 0){ //收藏过,还要收藏 return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "已收藏"); } //收藏 if(dto.getOperation() == 0){ cacheService.hPut(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(), dto.getEntryId().toString(), JSON.toJSONString(dto)); }else{ //取消收藏 cacheService.hDelete(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(), dto.getEntryId().toString()); } return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } }
四、行为数据回显
是否点赞、是否收藏、是否不喜欢。页面显示时会展示用户的行为数据。
@Autowired
private CacheService cacheService;
/**
* 文章回显用户行为信息:是否like,是否关注等
*
* @param dto
* @return
*/
@Override
public ResponseResult loadArticleBehavior(ArticleInfoDto dto) {
//参数验证
if(dto == null || dto.getArticleId() == null || dto.getAuthorId() == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
boolean isfollow = false, islike = false, isunlike = false, iscollection = false;
ApUser user = AppThreadLocalUtil.getUser();
if(user != null){
//用户登录了才有行为数据回显
//是否点赞
String likeBehaviorJson = (String) cacheService.hGet(BehaviorConstants.LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
if(StringUtils.isNotBlank(likeBehaviorJson)){
islike = true;
}
//是否不喜欢
String unlikeBehaviorJson = (String) cacheService.hGet(BehaviorConstants.UN_LIKE_BEHAVIOR + dto.getArticleId().toString(), user.getId().toString());
if(StringUtils.isNotBlank(unlikeBehaviorJson)){
isunlike = true;
}
//是否收藏
String collectionBehavior = (String) cacheService.hGet(BehaviorConstants.COLLECTION_BEHAVIOR + user.getId(), dto.getArticleId().toString());
if(StringUtils.isNotBlank(collectionBehavior)){
iscollection = true;
}
//是否关注
Double score = cacheService.zScore(BehaviorConstants.APUSER_FOLLOW_RELATION + user.getId(), dto.getAuthorId().toString());
if(score != null){
isfollow = true;
}
}
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("isfollow", isfollow);
resultMap.put("islike", islike);
resultMap.put("isunlike", isunlike);
resultMap.put("iscollection", iscollection);
return ResponseResult.okResult(resultMap);
}