基于java的微信小程序的实现(十一)用户关注功能与查询视频发布者功能后端实现

本文介绍了一个社交应用中关注与取消关注功能的实现细节,包括需求分析与代码实现,同时涵盖了查询视频发布者信息接口的设计,用于前端展示视频发布者的详细信息及视频点赞状态。

1.关注/取消关注功能实现

1.需求分析

对于用户关注和取消关注的相逻辑和点赞和取消点赞的逻辑都是一致,就不做详细说明了

2.代码实现

dao层

public interface UsersFansDao extends JpaRepository<UsersFans,String>,JpaSpecificationExecutor<UsersFans> {
}

service层

  /**
     * 用户关注他人
     * @param id
     * @param fansId
     */
    @Override
    @Transactional
    public void follow(String id, String fansId) {
        //保存用户和粉丝关系表
        UsersFans usersFans =new UsersFans();
        usersFans.setId(IdUtils.getId());
        usersFans.setUserId(id);
        usersFans.setFanId(fansId);
        usersFansDao.save(usersFans);
        //添加该用户的粉丝数
        Users one = usersDao.findOne(id);
        one.setFansCounts(one.getFansCounts()+1);
        usersDao.save(one);
        //添加登陆者的关注数
        Users daoOne = usersDao.findOne(fansId);
        daoOne.setFollowCounts(daoOne.getFansCounts()+1);
        usersDao.save(daoOne);

    }
    
      /**
     * 取消关注
     * @param id
     * @param fansId
     */
    @Override
    public void unfollow(String id, String fansId) {
        List<UsersFans> usersFansList = findByUserIdAndFansId(id, fansId);
        UsersFans usersFans = usersFansList.get(0);
        usersFansDao.delete(usersFans.getId());

        Users one = usersDao.findOne(id);
        one.setFansCounts(one.getFansCounts()-1);
        usersDao.save(one);

        Users daoOne = usersDao.findOne(fansId);
        daoOne.setFollowCounts(daoOne.getFansCounts()-1);
        usersDao.save(daoOne);
    }
    
    /**
     * 查询用户是否被关注
     * @param id
     * @param fansId
     * @return
     */
    @Override
    public Boolean findIsFollowed(String id, String fansId) {
        List<UsersFans> usersFansList = findByUserIdAndFansId(id, fansId);
        if (usersFansList.size()==0){
            return false;
        }else {
            return true;
        }
    }
    
       /**
     * 根基用户id个粉丝id精确查询用户和粉丝关系
     * @param id
     * @param fansId
     * @return
     */
    @Transactional
    List<UsersFans> findByUserIdAndFansId(final String id, final String fansId){
        return usersFansDao.findAll(new Specification<UsersFans>() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) {
                Predicate p1 = cb.equal(root.get("userId").as(String.class), id);
                Predicate p2 = cb.equal(root.get("fanId").as(String.class), fansId);
                Predicate[] predicate = new Predicate[]{p1, p2};
                return cb.and(predicate);
            }
        });
    }

controller 查看用户是否被登录者关注的逻辑应该放到个人信息查找的逻辑中执行,所以在原来的个人信息查询接口中进行扩展,前端多传入一个参数也就是我们登录者的id命名为fansId,查询个人信息接口中定义一个你默认为false的值,如果fansId不不为空就调用findIsFollowed查看登陆者与该用户是否存在关注的关系,如果有就将定义的值赋值为true,我们需要在返回的userVO中在新添加一个布尔值得followed字段。

  @ApiOperation(value = "用户信息查询", notes = "用户信息查询的接口")
    @PostMapping("/findUserInfo")
    public LexJSONResult findUserInfo(String id,String fansId){
        Boolean followed=false;
        if (!StringUtils.isEmpty(fansId)){
             followed = userService.findIsFollowed(id, fansId);
        }
        Users users= userService.findUserInfo(id);
        UsersVo usersVo=new UsersVo();
        BeanUtils.copyProperties(users,usersVo);
        usersVo.setFollowed(followed);
        return LexJSONResult.ok(usersVo);
    }

2.查询视频发布者信息接口

1.需求分析

用户在视频列表首页点击某个视频的时候会调用到该接口,我们需要前端传3个参数,分别为当前登陆者的id,该视频的id,视频发布者的id,根据传入的登陆者id和视频的id去调用之前编写好的查询是否点赞的方法,返回一个布尔值,通过视频发布者的id去查询users表中查询该用户得相关信息,创建一个新的vo类将user实体类和一个布尔值代表该视频是否被点赞封装起来,返回给前端。

2.代码实现

封装的vo包装类

@Data
public class PublishVo {

    private Users users;

    private Boolean isLike;

}

controller代码

 @ApiOperation(value = "查询视频发布者信息", notes = "查询视频发布者信息")
    @PostMapping("/findPublish")
    public LexJSONResult findPublish(String id,String videoId,String publishId){
     //查询视频发布者的信息
        Users userInfo = userService.findUserInfo(publishId);
        userInfo.setPassword("");
        //查询该用户是否给该视频点赞
        Boolean b = userService.findUserIsLike(id, videoId);
        PublishVo publishVo =new PublishVo();
        publishVo.setUsers(userInfo);
        publishVo.setIsLike(b);
        return LexJSONResult.ok(publishVo);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值