用户登录进去的时候展示推荐的列表
因为要求需要分页展示所以需要用到分页对象返回出去
这一层没什么可说的
/**
* 推荐用户
* @param recommendUserDto 页面端传递过来的参数 页面总数和当前页面等等参数
* @return 返回用户列表
*/
@GetMapping("/recommendation")
public ResponseEntity recommendation(RecommendUserDto recommendUserDto){
PageResult pageResult=tanhuaService.recommendation(recommendUserDto);
return ResponseEntity.ok(pageResult);
}
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传入的就是需要筛选的条件信息比如:年龄,性别,学历等等
/**
* 批量查询用户详情
* @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;
}
}
这里使用三张表来保存用户的动态。
这一层没什么可逼逼的 由于参数会是多张图片这里就使用数组;来接收 MultipartFile
/**
*发布动态
* @param movement
* @param imageContent 传输文件参数
* @return
*/
@PostMapping
public ResponseEntity movements(Movement movement, MultipartFile imageContent[]) throws IOException {
movementService.publish(movement,imageContent);
return ResponseEntity.ok(null);
}
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);
}
先保存动态信息,然后用@Async开启另外一个线程进行异步
根据获取到的用户id查询好友列表,然后根据好友列表循环生成时间线数据存到数据库
@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);
}
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);
}
}