探花交友day3,4

1.好友推荐

用户登录进去的时候展示推荐的列表

探花交友day3,4_第1张图片

因为要求需要分页展示所以需要用到分页对象返回出去

探花交友day3,4_第2张图片

1.1Controller层

这一层没什么可说的

  /**
     *  推荐用户
     * @param recommendUserDto 页面端传递过来的参数 页面总数和当前页面等等参数
     * @return 返回用户列表
     */
   @GetMapping("/recommendation")
    public ResponseEntity recommendation(RecommendUserDto recommendUserDto){

       PageResult pageResult=tanhuaService.recommendation(recommendUserDto);

    return     ResponseEntity.ok(pageResult);
   }

1.2Service层

PageResult pr=recommendUserApi.recommendationUser(dto.getPage(),dto.getPagesize(),touserId); 先根据用户id查询出推荐人id信息

1.判断获取到的用户是否为空 如果是空就直接返回出去

2.如果不是就需要根据用户id获取到用户的资料进行重构一个返回值对象返回出去  CollUtil.getFieldValues(items,"userId",Long.class);根据list中的属性字段单独生成一个list集合

3.调用api层的方法进行查询用户的资料然后重构一个返回对象返回

  /**
     *  推荐用户
     * @param dto
     * @return 返回的是分页查询出来的用户列表等等
     */
    public PageResult recommendation(RecommendUserDto dto) {
          //1.根据用户id和页码查询出来多少条数
        Long touserId = UserHolder.getUserId();
        PageResult pr=recommendUserApi.recommendationUser(dto.getPage(),dto.getPagesize(),touserId);
        //2.获取·分页中的RecommendUser列表
        List items = (List) pr.getItems();
        //判断列表是否为空
        if(items==null){
        return pr;}
        //提取所有推荐用户的id
        List ids= CollUtil.getFieldValues(items,"userId",Long.class);
        UserInfo userInfo=new UserInfo();
        userInfo.setAge(dto.getAge());
        userInfo.setGender(dto.getGender());
        //构建查询条件,批量查询所有用户的详细
        Map map = userInfoApi.findByIds(ids, userInfo);
        //循环推荐的数据列表,批量构建VO对象
        List list=new ArrayList();
        for (RecommendUser item : items) {
            UserInfo userInfo1 = map.get(item.getUserId());
         if (userInfo1!=null) {
             TodayBest init = TodayBest.init(userInfo1, item);
             list.add(init);   }

        }

      pr.setItems(list);
     return pr;
    }

1.3DubboApi层

1.这里使用了一个Map集合来批量接收用户id

2.userInfo传入的就是需要筛选的条件信息比如:年龄,性别,学历等等

探花交友day3,4_第3张图片

 

探花交友day3,4_第4张图片

 

 /**
     * 批量查询用户详情
     * @param userIds
     * @param info
     * @return
     */
    @Override
    public Map findByIds(List userIds, UserInfo info) {
       QueryWrapper qw=new QueryWrapper();
       //用户id列表
      //  根据传入进来的用户id查询用户的详情,如果用户不挑选就默认不挑,直接给到所有的用户
        qw.in("id",userIds);
        if(info!=null){ //如果不为空就是用户添加了筛选那就根据筛选的结果返回
            qw.lt("age",info.getAge());
        }if(!StringUtils.isEmpty(info.getGender())){
            qw.eq("gender",info.getGender());
        }
    List list=userInfoMapper.selectList(qw);
        Map map= CollUtil.fieldValueMap(list,"id");
        return map;
    }
}

2.圈子功能

1.发布动态

1.1表的设计

这里使用三张表来保存用户的动态。

探花交友day3,4_第5张图片

1.2Controller层

这一层没什么可逼逼的  由于参数会是多张图片这里就使用数组;来接收 MultipartFile

探花交友day3,4_第6张图片

 

 /**
     *发布动态
     * @param movement
     * @param imageContent 传输文件参数
     * @return
     */
    @PostMapping
    public ResponseEntity movements(Movement movement, MultipartFile imageContent[]) throws IOException {

         movementService.publish(movement,imageContent);
     return   ResponseEntity.ok(null);
    }

 1.3service层

1.首先判断里面的文本信息是否为空,为空就是啥都没写抛出异常

2.获取当前登录的用户id封装到movement对象里面,还需要把上传图片后的字符串也封装到movement对象中

 /**
     * 发布动态
     * @param movement
     * @param imageContent
     */
    public void publish(Movement movement, MultipartFile[] imageContent) throws IOException {
        //判断发布动态的内容是否存在
        if (StringUtils.isEmpty(movement.getTextContent())){
            throw new BusinessException(ErrorResult.contentError()); //抛出一个异常告诉他你发布的动态啥都没有
        }
         //获取当前登录的用户id
        Long userId = UserHolder.getUserId();
        movement.setUserId(userId);
        //将当前文件上传带阿里云
        List list=new ArrayList();
        for (MultipartFile multipartFile : imageContent) {
            String upload = ossTemplate.upload(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
            list.add(upload); //把图片存入一个List集合里面
        } //把数据封装到Movement对象
       movement.setMedias(list);
        //调用Api完成发布动态
        movementApi.publish(movement);

    }

1.3DubboApi层

先保存动态信息,然后用@Async开启另外一个线程进行异步

探花交友day3,4_第7张图片

根据获取到的用户id查询好友列表,然后根据好友列表循环生成时间线数据存到数据库

 探花交友day3,4_第8张图片

 2.查看自己发布的动态

2.1Controller层 没啥好说的,这里又是分页查询,所以你懂的

  @GetMapping("/all")
    public  ResponseEntity myMovementAll(Long userId,
                                       @RequestParam(defaultValue = "1") Integer page,
                                       @RequestParam(defaultValue = "10") Integer pagesize){

         PageResult pageResult= movementService.myMovementAll(userId,page,pagesize);

        return ResponseEntity.ok(pageResult);
    }

2.2Service层

1.调用APi方法分页查询出动态数据

2.查询出来了自己发布的动态信息(地理位置,评论数,点赞数,图片等等

3.虽然查询出来了但是前端需要的信息不止这么一点(用户信息,用户年龄等等所以,我还得查询一下用户的详细信息

目录

1.好友推荐

1.1Controller层

1.2Service层

2.圈子功能

1.发布动态

1.1表的设计

1.2Controller层

 1.3service层

1.3DubboApi层

 ​

 2.查看自己发布的动态

2.1Controller层 没啥好说的,这里又是分页查询,所以你懂的

2.2Service层


 /**
     *  查询自己发布的动态详细
     * @param userId
     * @param page
     * @param pagesize
     * @return
     */
    public PageResult myMovementAll(Long userId, Integer page, Integer pagesize) {
         //1.根据用户id查询出自己发布的动态
              PageResult pageResult=movementApi.myMovementAll(userId,page,pagesize);
        //2.查询出来了自己发布的动态信息(地理位置,评论数,点赞数,图片等等)
        List items = (List) pageResult.getItems(); //现在这里面装的就是动态数据辣
        //3.虽然查询出来了但是前端需要的信息不止这么一点(用户信息,用户年龄等等所以,我还得查询一下用户的详细信息
        //4.查询出来了用户的详情信息之后就需要把他们合二为一返回一个Vo对象给前端
        List list=new ArrayList();
        for (Movement item : items) {
            UserInfo byId = userInfoApi.findById(item.getUserId()); //查询出来用户详情,封装
             if (byId!=null&&item!=null){
                 MovementsVo vo = MovementsVo.init(byId, item);
                 list.add(vo);
             }
        }

你可能感兴趣的:(java)