
需求:
- 关注和取关接口
- 判断是否关注接口
关注是与User之间的关系,是博主与粉丝之间的关系,数据库表tb_follow表示

java
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {
/**
* 关注或取关用户。
*
* 作用:
* 1.获取登录用户;
* 2.关注,新增数据;
* 3.取关,删除deletefromtb_followwhereuser_id=?andf;
*
* @param followUserId被关注用户id
* @param isFollow是否关注
* @return处理结果
*/
@Override
public Result follow(Long followUserId, Boolean isFollow) {
//1.获取登录用户
Long userId = UserHolder.getUser().getId();
if(isFollow){
//2.关注,新增数据
Follow follow = new Follow();
follow.setUserId(userId);
follow.setFollowUserId(followUserId);
}
//3.取关,删除delete from tb_follow where user_id=? and follow_user_id=?
remove(new QueryWrapper<Follow>().eq("user_id",userId).eq("follow_user_id",followUserId));
return Result.ok();
}
/**
* 判断当前用户是否关注目标用户。
*
* 作用:
* 1.获取登录用户;
* 2.查询是否关注selectcount(*)fromtb_followwhereuser_id=?andfollow_user_id=?;
* 3.判断;
*
* @param followUserId被关注用户id
* @return处理结果
*/
@Override
public Result isFollow(Long followUserId) {
//1.获取登录用户
Long userid=UserHolder.getUser().getId();
//2.查询是否关注select count(*) from tb_follow where user_id =? and follow_user_id=?
Integer count = query().eq("user_id", userid).eq("follow_user_id", followUserId).count();
//3.判断
return Result.ok(count>0);
}
}- FollowController
java
@RestController
@RequestMapping("/follow")
public class FollowController {
@Resource
private IFollowService followService;
/**
* 关注或取关用户。
*
* @param followUserId被关注用户id
* @param isFollow是否关注
* @return处理结果
*/
@PutMapping("{id}/{isFollow}")
public Result follow(@PathVariable("id")Long followUserId,@PathVariable("isFollow")Boolean isFollow){
return followService.follow(followUserId,isFollow);
}
/**
* 判断当前用户是否关注目标用户。
*
* @param followUserId被关注用户id
* @return处理结果
*/
@GetMapping("/or/not/{id}")
public Result isFollow(@PathVariable("id")Long followUserId){
return followService.isFollow(followUserId);
}
}- FollowServicelmpl
java
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {
private final StringRedisTemplate stringRedisTemplate;
@Resource
private IUserService userService;
/**
* 执行FollowServiceImpl相关业务逻辑。
*
* @param stringRedisTemplate stringRedisTemplate参数
* @return处理结果
*/
public FollowServiceImpl(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
/**
* 关注或取关用户。
*
* 作用:
* 1.获取登录用户;
* 2.关注,新增数据;
* 3.把关注用户的id,放入Redis的Set集合sadduserIdfollowerUs;
* 4.取关,删除deletefromtb_followwhereuser_id=?andf;
* 5.把关注用户的id从Redis集合中移除;
*
* @param followUserId被关注用户id
* @param isFollow是否关注
* @return处理结果
*/
@Override
public Result follow(Long followUserId, Boolean isFollow) {
//1.获取登录用户
Long userId = UserHolder.getUser().getId();
String key="follows:"+userId;
if(isFollow){
//2.关注,新增数据
Follow follow = new Follow();
follow.setUserId(userId);
follow.setFollowUserId(followUserId);
boolean isSuccess=save(follow);
if(isSuccess){
//把关注用户id放入Redis的Set集合
stringRedisTemplate.opsForSet().add(key,followUserId.toString());
}
} else {
//3.取关,删除delete from tb_follow where user_id=? and follow_user_id=?
boolean isSuccess = remove(new QueryWrapper<Follow>().eq("user_id", userId).eq("follow_user_id", followUserId));
if(isSuccess){
//把关注用户的id从Redis集合中移除
stringRedisTemplate.opsForSet().remove(key,followUserId.toString());
}
}
return Result.ok();
}
/**
* 判断当前用户是否关注目标用户。
*
* 作用:
* 1.获取登录用户;
* 2.查询是否关注selectcount(*)fromtb_followwhereuser_id=?andfollow_user_id=?;
* 3.判断;
*
* @param followUserId被关注用户id
* @return处理结果
*/
@Override
public Result isFollow(Long followUserId) {
//1.获取登录用户
Long userid=UserHolder.getUser().getId();
//2.查询是否关注select count(*) from tb_follow where user_id =? and follow_user_id=?
Integer count = query().eq("user_id", userid).eq("follow_user_id", followUserId).count();
//3.判断
return Result.ok(count>0);
}
}- 测试功能 首先自己不能关注自己,没有关注按钮,这里关注其他用户,关注成功后又查询了一次是否关注接口,按钮变为取消关注

点击取消关注,取消成功
