Skip to content
DAILY QUOTE

“ ”

需求:

  • 关注和取关接口
  • 判断是否关注接口

关注是与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);
    }
}
  • 测试功能 首先自己不能关注自己,没有关注按钮,这里关注其他用户,关注成功后又查询了一次是否关注接口,按钮变为取消关注

点击取消关注,取消成功