【探花交友】day04—圈子功能实现

素颜马尾好姑娘i 2024-03-24 16:02 198阅读 0赞

目录

1、首页推荐

1.1、接口分析

1.2、功能实现

2、MongoDB集群

3、圈子功能

2.1、功能说明

1.2、实现方案分析

1.3、技术方案(重点)

1.4、表结构设计

4、圈子实现

3.1、环境搭建

3.2、发布动态

3.3、查询个人动态

1、首页推荐

d29aa58a74944a16b7ca25757b311103.png

1.1、接口分析

地址:http://192.168.136.160:3000/project/19/interface/api/118

2b21e4e442774a09b2ddee81b5bb15cc.png 4e536ee4f9da414492b9017f1c9f5439.png

响应:

  1. {
  2. "counts": 4698,
  3. "pagesize": 20,
  4. "pages": 58,
  5. "page": 16,
  6. "items": [
  7. {
  8. "id": 1011,
  9. "avatar": "assets/images/avatar_2.png",
  10. "nickname": "黑马小妹",
  11. "gender": "woman",
  12. "age": 23,
  13. "tags": [
  14. "本科",
  15. "年龄相仿",
  16. "单身"
  17. ],
  18. "fateValue": 96
  19. },
  20. {
  21. "id": 2495,
  22. "avatar": "assets/images/avatar_1.png",
  23. "nickname": "米朵妹妹",
  24. "gender": "man",
  25. "age": 28,
  26. "tags": [
  27. "年龄相仿",
  28. "本科",
  29. "单身"
  30. ],
  31. "fateValue": 87
  32. },
  33. {
  34. "id": 5708,
  35. "avatar": "assets/images/avatar_4.png",
  36. "nickname": "黑马小妹",
  37. "gender": "man",
  38. "age": 24,
  39. "tags": [
  40. "单身",
  41. "本科",
  42. "年龄相仿"
  43. ],
  44. "fateValue": 94
  45. },
  46. {
  47. "id": 4768,
  48. "avatar": "assets/images/avatar_3.png",
  49. "nickname": "黑马小妹",
  50. "gender": "man",
  51. "age": 24,
  52. "tags": [
  53. "年龄相仿",
  54. "单身",
  55. "本科"
  56. ],
  57. "fateValue": 80
  58. }
  59. ]
  60. }

1.2、功能实现

1.2.1 controller

TanhuaController编写推荐列表方法

  1. /**
  2. * 查询分页推荐好友列表
  3. */
  4. @GetMapping("/recommendation")
  5. public ResponseEntity recommendation(RecommendUserDto dto) {
  6. PageResult pr = tanhuaService.recommendation(dto);
  7. return ResponseEntity.ok(pr);
  8. }

1.2.2 service

TanhuaService编写推荐列表方法

  1. //查询分页推荐好友列表
  2. public PageResult recommendation(RecommendUserDto dto) {
  3. //1、获取用户id
  4. Long userId = UserHolder.getUserId();
  5. //2、调用recommendUserApi分页查询数据列表(PageResult -- RecommendUser)
  6. PageResult pr = recommendUserApi.queryRecommendUserList(dto.getPage(),dto.getPagesize(),userId);
  7. //3、获取分页中的RecommendUser数据列表
  8. List<RecommendUser> items = (List<RecommendUser>) pr.getItems();
  9. //4、判断列表是否为空
  10. if(items == null || items.size() <=0) {
  11. return pr;
  12. }
  13. //5、提取所有推荐的用户id列表
  14. List<Long> ids = CollUtil.getFieldValues(items, "userId", Long.class);
  15. UserInfo userInfo = new UserInfo();
  16. userInfo.setAge(dto.getAge());
  17. userInfo.setGender(dto.getGender());
  18. //6、构建查询条件,批量查询所有的用户详情
  19. Map<Long, UserInfo> map = userInfoApi.findByIds(ids, userInfo);
  20. //7、循环推荐的数据列表,构建vo对象
  21. List<TodayBest> list = new ArrayList<>();
  22. for (RecommendUser item : items) {
  23. UserInfo info = map.get(item.getUserId());
  24. if(info!=null) {
  25. TodayBest vo = TodayBest.init(info, item);
  26. list.add(vo);
  27. }
  28. }
  29. //8、构造返回值
  30. pr.setItems(list);
  31. return pr;
  32. }

1.2.3 API接口

RecommendUserApi 接口和RecommendUserApiImpl实现类中添加方法查询

  1. //分页查询
  2. public PageResult queryRecommendUserList(Integer page, Integer pagesize, Long toUserId) {
  3. //1、构建Criteria对象
  4. Criteria criteria = Criteria.where("toUserId").is(toUserId);
  5. //2、创建Query对象
  6. Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score"))).limit(pagesize)
  7. .skip((page - 1) * pagesize);
  8. //3、调用mongoTemplate查询
  9. List<RecommendUser> list = mongoTemplate.find(query, RecommendUser.class);
  10. long count = mongoTemplate.count(query, RecommendUser.class);
  11. //4、构建返回值PageResult
  12. return new PageResult(page,pagesize,count,list);
  13. }

1.2.4 请求dto对象

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. @Data
  5. @NoArgsConstructor
  6. @AllArgsConstructor
  7. public class RecommendUserDto {
  8. private Integer page = 1; //当前页数
  9. private Integer pagesize = 10; //页尺寸
  10. private String gender; //性别 man woman
  11. private String lastLogin; //近期登陆时间
  12. private Integer age; //年龄
  13. private String city; //居住地
  14. private String education; //学历
  15. }

2、MongoDB集群

3、圈子功能

2.1、功能说明

探花交友项目中的圈子功能,类似微信的朋友圈,基本的功能为:发布动态、浏览好友动态、浏览推荐动态、点赞、评论、喜欢等功能。

3b4b23b058a34c4299b73e8ffc092d37.png

发布:

c918b0c6d49944ddaebe1c03b1d874da.png

1.2、实现方案分析

对于圈子功能的实现,我们需要对它的功能特点做分析:

  • 数据量会随着用户数增大而增大
  • 读多写少
  • 非好友看不到其动态内容
  • ……

针对以上特点,我们来分析一下:

  • 对于数据量大而言,显然不能够使用关系型数据库进行存储,我们需要通过MongoDB进行存储
  • 对于读多写少的应用,需要减少读取的成本

    • 比如说,一条SQL语句,单张表查询一定比多张表查询要快
  • 对于每个人数据在存储层面最好做到相互隔离,这样的话就不会有影响

所以对于存储而言,主要是核心的4张表:

  • 发布表:记录了所有用户的发布的东西信息,如图片、视频等。
  • 自己时间线:相册是每个用户独立的,记录了该用户所发布的所有内容。
  • 好友时间线:所谓“刷朋友圈”,就是刷时间线,就是一个用户所有的朋友的发布内容。
  • 好友表:记录好友关系

1.3、技术方案(重点)

根据之前我们的分析,对于技术方案而言,将采用MongoDB+Redis来实现,其中MongoDB负责存储,Redis负责缓存数据。

1.4、表结构设计

发布表:动态总记录表(记录每个人发送的动态详情)

  1. #表名:movement
  2. {
  3. "_id": ObjectId("5e82dc416401952928c211d8"),
  4. "pid": NumberLong("10064"),
  5. "userId": NumberLong("6"),
  6. "textContent": "最悲伤却又是最痛苦的谎言,就是我还好,没有关系。",
  7. "medias": [
  8. "https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/photo/7/1.jpg",
  9. "https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/photo/7/1564567349498.jpg",
  10. "https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/photo/7/1564567352977.jpg",
  11. "https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/photo/7/1564567360406.jpg"
  12. ],
  13. "longitude": "121.588627",
  14. "latitude": "30.935781",
  15. "state": NumberInt("0"),
  16. "locationName": "中国上海市奉贤区人民路445弄",
  17. "created": NumberLong("1585634369493"),
  18. "_class": "com.tanhua.dubbo.server.pojo.Publish"
  19. }

好友时间线表:记录当前好友发布的动态数据

  1. #表名:movement_timeline
  2. {
  3. "_id": ObjectId("609cf6538743d448c02c61f0"),
  4. "movementId": ObjectId("609cf6538743d448c02c61ef"),
  5. "userId": NumberLong("106"),
  6. "friendId": NumberLong("1"),
  7. "created": NumberLong("1620899411043"),
  8. "_class": "com.tanhua.model.mongo.MovementTimeLine"
  9. }

好友关系表:记录好友的双向关系(双向)

  1. #表名:friend
  2. {
  3. "_id": ObjectId("6018bc055098b2230031e2da"),
  4. "created": NumberLong("1612233733056"),
  5. "userId": NumberLong("1"),
  6. "friendId": NumberLong("106"),
  7. "_class": "com.itheima.domain.mongo.Friend"
  8. }

4、圈子实现

3.1、环境搭建

Mongodb中实现字段的自增:两种解决方法(1、使用redis保证自动增长,2、使用mongodb自定义表)

3.1.1、mongo主键自增

第一步:创建实体类

  1. package com.tanhua.domain.mongo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.bson.types.ObjectId;
  6. import org.springframework.data.annotation.Id;
  7. import org.springframework.data.mongodb.core.mapping.Document;
  8. import org.springframework.data.mongodb.core.mapping.Field;
  9. @Document(collection = "sequence")
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. public class Sequence {
  14. private ObjectId id;
  15. private long seqId; //自增序列
  16. private String collName; //集合名称
  17. }

第二步:编写service

  1. package com.tanhua.dubbo.utils;
  2. import com.tanhua.domain.mongo.Sequence;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.mongodb.core.FindAndModifyOptions;
  5. import org.springframework.data.mongodb.core.MongoTemplate;
  6. import org.springframework.data.mongodb.core.query.Criteria;
  7. import org.springframework.data.mongodb.core.query.Query;
  8. import org.springframework.data.mongodb.core.query.Update;
  9. import org.springframework.stereotype.Component;
  10. @Component
  11. public class IdWorker {
  12. @Autowired
  13. private MongoTemplate mongoTemplate;
  14. public Long getNextId(String collName) {
  15. Query query = new Query(Criteria.where("collName").is(collName));
  16. Update update = new Update();
  17. update.inc("seqId", 1);
  18. FindAndModifyOptions options = new FindAndModifyOptions();
  19. options.upsert(true);
  20. options.returnNew(true);
  21. Sequence sequence = mongoTemplate.findAndModify(query, update, options, Sequence.class);
  22. return sequence.getSeqId();
  23. }
  24. }

3.1.2、实体类

写到tanhua-domain工程中:

Movement

Movement:发布信息表(总记录表数据)

  1. package com.tanhua.domain.mongo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.bson.types.ObjectId;
  6. import org.springframework.data.mongodb.core.mapping.Document;
  7. import java.util.List;
  8. //动态详情表
  9. @Data
  10. @NoArgsConstructor
  11. @AllArgsConstructor
  12. @Document(collection = "movement")
  13. public class Movement implements java.io.Serializable {
  14. private ObjectId id; //主键id
  15. private Long pid; //Long类型,用于推荐系统的模型(自动增长)
  16. private Long created; //发布时间
  17. private Long userId;
  18. private String textContent; //文字
  19. private List<String> medias; //媒体数据,图片或小视频 url
  20. private String longitude; //经度
  21. private String latitude; //纬度
  22. private String locationName; //位置名称
  23. private Integer state = 0;//状态 0:未审(默认),1:通过,2:驳回
  24. }

MovementTimeLine

MovementTimeLine:好友时间线表,用于存储好友发布(或推荐)的数据,每一个用户一张表进行存储

  1. package com.tanhua.domain.mongo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.bson.types.ObjectId;
  6. import org.springframework.data.mongodb.core.mapping.Document;
  7. /**
  8. * 好友时间线表,用于存储好友发布的数据
  9. */
  10. @Data
  11. @NoArgsConstructor
  12. @AllArgsConstructor
  13. @Document(collection = "movement_timeLine")
  14. public class MovementTimeLine implements java.io.Serializable {
  15. private static final long serialVersionUID = 9096178416317502524L;
  16. private ObjectId id;
  17. private ObjectId movementId;//动态id
  18. private Long userId; //发布动态用户id
  19. private Long friendId; // 可见好友id
  20. private Long created; //发布的时间
  21. }

Friend

Friend 好友关系表

  1. package com.tanhua.domain.mongo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.bson.types.ObjectId;
  6. import org.springframework.data.mongodb.core.mapping.Document;
  7. /**
  8. * 好友表:好友关系表
  9. */
  10. @Data
  11. @NoArgsConstructor
  12. @AllArgsConstructor
  13. @Document(collection = "friend")
  14. public class Friend implements java.io.Serializable{
  15. private static final long serialVersionUID = 6003135946820874230L;
  16. private ObjectId id;
  17. private Long userId; //用户id
  18. private Long friendId; //好友id
  19. private Long created; //时间
  20. }

3.1.3、API接口

  1. package com.tanhua.dubbo.api.mongo;
  2. import com.tanhua.domain.mongo.Publish;
  3. import com.tanhua.domain.vo.PageResult;
  4. public interface MovementApi {
  5. }

3.1.4、API实现类

  1. package com.tanhua.dubbo.api.mongo;
  2. import com.tanhua.domain.mongo.*;
  3. import com.tanhua.domain.vo.PageResult;
  4. import com.tanhua.dubbo.utils.IdService;
  5. import org.apache.dubbo.config.annotation.Service;
  6. import org.bson.types.ObjectId;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.domain.PageRequest;
  9. import org.springframework.data.domain.Pageable;
  10. import org.springframework.data.domain.Sort;
  11. import org.springframework.data.mongodb.core.MongoTemplate;
  12. import org.springframework.data.mongodb.core.query.Criteria;
  13. import org.springframework.data.mongodb.core.query.Query;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. @Service
  17. public class MovementApiImpl implements PublishApi {
  18. }

3.1.5、MovementsController

  1. package com.tanhua.server.controller;
  2. import com.tanhua.domain.mongo.Publish;
  3. import com.tanhua.server.service.MovementsService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.*;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import java.io.IOException;
  9. @RestController
  10. @RequestMapping("/movements")
  11. public class MovementsController {
  12. @Autowired
  13. private MovementsService movementsService;
  14. }

3.1.6、MovementsService

  1. package com.tanhua.server.service;
  2. import com.tanhua.autoconfig.templates.OssTemplate;
  3. import com.tanhua.domain.db.UserInfo;
  4. import com.tanhua.domain.mongo.Publish;
  5. import com.tanhua.domain.vo.Movements;
  6. import com.tanhua.domain.vo.PageResult;
  7. import com.tanhua.dubbo.api.UserInfoApi;
  8. import com.tanhua.dubbo.api.mongo.PublishApi;
  9. import com.tanhua.server.interceptor.UserHolder;
  10. import io.jsonwebtoken.lang.Collections;
  11. import org.apache.dubbo.config.annotation.Reference;
  12. import org.springframework.beans.BeanUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.http.ResponseEntity;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.util.StringUtils;
  17. import org.springframework.web.multipart.MultipartFile;
  18. import java.io.IOException;
  19. import java.text.SimpleDateFormat;
  20. import java.util.*;
  21. @Service
  22. public class MovementsService {
  23. @Autowired
  24. private OssTemplate ossTemplate;
  25. @DubboReference
  26. private MovementApi movementApi;
  27. @DubboReference
  28. private UserInfoApi userInfoApi;
  29. @Autowired
  30. private RedisTemplate<String,String> redisTemplate;
  31. }

3.2、发布动态

后续的测试:使用106(13800138000)和1号用户(13500000000)

3.2.0、思路步骤

2575be518cfa4fd7893f0b2f3bc2a5ee.png

3.2.1、MovementsController

tanhua-server工程编写MovementsController,完成发布动态功能

  1. @RestController
  2. @RequestMapping("/movements")
  3. public class MovementController {
  4. @Autowired
  5. private MovementService movementService;
  6. @Autowired
  7. private CommentsService commentsService;
  8. /**
  9. * 发布动态
  10. */
  11. @PostMapping
  12. public ResponseEntity movements(Movement movement,
  13. MultipartFile imageContent[]) throws IOException {
  14. movementService.publishMovement(movement,imageContent);
  15. return ResponseEntity.ok(null);
  16. }
  17. }

3.2.2、编写service

tanhua-server工程编写MovementsService,完成发布动态功能

  1. /**
  2. * 发布动态
  3. */
  4. public void publishMovement(Movement movement, MultipartFile[] imageContent) throws IOException {
  5. //1、判断发布动态的内容是否存在
  6. if(StringUtils.isEmpty(movement.getTextContent())) {
  7. throw new BusinessException(ErrorResult.contentError());
  8. }
  9. //2、获取当前登录的用户id
  10. Long userId = UserHolder.getUserId();
  11. //3、将文件内容上传到阿里云OSS,获取请求地址
  12. List<String> medias = new ArrayList<>();
  13. for (MultipartFile multipartFile : imageContent) {
  14. String upload = ossTemplate.upload(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
  15. medias.add(upload);
  16. }
  17. //4、将数据封装到Movement对象
  18. movement.setUserId(userId);
  19. movement.setMedias(medias);
  20. //5、调用API完成发布动态
  21. movementApi.publish(movement);
  22. }

3.2.3、API层

  1. package com.tanhua.dubbo.api;
  2. import com.tanhua.dubbo.utils.IdWorker;
  3. import com.tanhua.dubbo.utils.TimeLineService;
  4. import com.tanhua.model.mongo.Movement;
  5. import com.tanhua.model.vo.PageResult;
  6. import org.apache.dubbo.config.annotation.DubboService;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.domain.Sort;
  9. import org.springframework.data.mongodb.core.MongoTemplate;
  10. import org.springframework.data.mongodb.core.query.Criteria;
  11. import org.springframework.data.mongodb.core.query.Query;
  12. import java.util.List;
  13. @DubboService
  14. public class MovementApiImpl implements MovementApi{
  15. @Autowired
  16. private MongoTemplate mongoTemplate;
  17. @Autowired
  18. private IdWorker idWorker;
  19. @Autowired
  20. private TimeLineService timeLineService;
  21. //发布动态
  22. public void publish(Movement movement) {
  23. //1、保存动态详情
  24. try {
  25. //设置PID
  26. movement.setPid(idWorker.getNextId("movement"));
  27. //设置时间
  28. movement.setCreated(System.currentTimeMillis());
  29. //movement.setId(ObjectId.get());
  30. mongoTemplate.save(movement);
  31. // //2、查询当前用户的好友数据
  32. // Criteria criteria = Criteria.where("userId").is(movement.getUserId());
  33. // Query query = Query.query(criteria);
  34. // List<Friend> friends = mongoTemplate.find(query, Friend.class);
  35. // Thread.sleep(10000);
  36. // //3、循环好友数据,构建时间线数据存入数据库
  37. // for (Friend friend : friends) {
  38. // MovementTimeLine timeLine = new MovementTimeLine();
  39. // timeLine.setMovementId(movement.getId());
  40. // timeLine.setUserId(friend.getUserId());
  41. // timeLine.setFriendId(friend.getFriendId());
  42. // timeLine.setCreated(System.currentTimeMillis());
  43. // mongoTemplate.save(timeLine);
  44. // }
  45. timeLineService.saveTimeLine(movement.getUserId(),movement.getId());
  46. } catch (Exception e) {
  47. //忽略事务处理
  48. e.printStackTrace();
  49. }
  50. }
  51. }

3.2.4、异步处理工具类

  1. @Component
  2. public class TimeLineService {
  3. @Autowired
  4. private MongoTemplate mongoTemplate;
  5. @Async
  6. public void saveTimeLine(Long userId, ObjectId movementId) {
  7. //2、查询当前用户的好友数据
  8. Criteria criteria = Criteria.where("userId").is(userId);
  9. Query query = Query.query(criteria);
  10. List<Friend> friends = mongoTemplate.find(query, Friend.class);
  11. try {
  12. Thread.sleep(10000);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. //3、循环好友数据,构建时间线数据存入数据库
  17. for (Friend friend : friends) {
  18. MovementTimeLine timeLine = new MovementTimeLine();
  19. timeLine.setMovementId(movementId);
  20. timeLine.setUserId(friend.getUserId());
  21. timeLine.setFriendId(friend.getFriendId());
  22. timeLine.setCreated(System.currentTimeMillis());
  23. mongoTemplate.save(timeLine);
  24. }
  25. }
  26. }

3.2.5、整合测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = AppServerApplication.class)
  3. public class MovementApiTest {
  4. @DubboReference
  5. private MovementApi movementApi;
  6. @Test
  7. public void testPublish() {
  8. Movement movement = new Movement();
  9. movement.setUserId(106l);
  10. movement.setTextContent("你的酒窝没有酒,我却醉的像条狗");
  11. List<String> list = new ArrayList<>();
  12. list.add("https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/images/tanhua/avatar_1.png");
  13. list.add("https://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/images/tanhua/avatar_2.png");
  14. movement.setMedias(list);
  15. movement.setLatitude("40.066355");
  16. movement.setLongitude("116.350426");
  17. movement.setLocationName("中国北京市昌平区建材城西路16号");
  18. movementApi.publish(movement);
  19. }
  20. }

3.3、查询个人动态

查询好友动态其实就是查询自己的时间线表,好友在发动态时已经将动态信息写入到了自己的时间线表中。

3.3.0、思路分析

8b47e1af7cf444508869fc088710bde3.png

3.3.1、vo对象

  1. package com.tanhua.model.vo;
  2. import com.tanhua.model.domain.UserInfo;
  3. import com.tanhua.model.mongo.Movement;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import org.springframework.beans.BeanUtils;
  8. import org.springframework.util.StringUtils;
  9. import java.io.Serializable;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Date;
  12. @Data
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. public class MovementsVo implements Serializable {
  16. private String id; //动态id
  17. private Long userId; //用户id
  18. private String avatar; //头像
  19. private String nickname; //昵称
  20. private String gender; //性别 man woman
  21. private Integer age; //年龄
  22. private String[] tags; //标签
  23. private String textContent; //文字动态
  24. private String[] imageContent; //图片动态
  25. private String distance; //距离
  26. private String createDate; //发布时间 如: 10分钟前
  27. private Integer likeCount; //点赞数
  28. private Integer commentCount; //评论数
  29. private Integer loveCount; //喜欢数
  30. private Integer hasLiked; //是否点赞(1是,0否)
  31. private Integer hasLoved; //是否喜欢(1是,0否)
  32. public static MovementsVo init(UserInfo userInfo, Movement item) {
  33. MovementsVo vo = new MovementsVo();
  34. //设置动态数据
  35. BeanUtils.copyProperties(item, vo);
  36. vo.setId(item.getId().toHexString());
  37. //设置用户数据
  38. BeanUtils.copyProperties(userInfo, vo);
  39. if(!StringUtils.isEmpty(userInfo.getTags())) {
  40. vo.setTags(userInfo.getTags().split(","));
  41. }
  42. //图片列表
  43. vo.setImageContent(item.getMedias().toArray(new String[]{}));
  44. //距离
  45. vo.setDistance("500米");
  46. Date date = new Date(item.getCreated());
  47. vo.setCreateDate(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date));
  48. //设置是否点赞(后续处理)
  49. vo.setHasLoved(0);
  50. vo.setHasLiked(0);
  51. return vo;
  52. }
  53. }

3.3.2、controller

修改MovementsController完成查询好友动态功能

  1. /**
  2. * 查询我的动态
  3. */
  4. @GetMapping("/all")
  5. public ResponseEntity findByUserId(Long userId,
  6. @RequestParam(defaultValue = "1") Integer page,
  7. @RequestParam(defaultValue = "10") Integer pagesize) {
  8. PageResult pr = movementService.findByUserId(userId,page,pagesize);
  9. return ResponseEntity.ok(pr);
  10. }

3.3.3、service

修改MovementsService完成查询好友动态功能

  1. //查询个人动态
  2. public PageResult findByUserId(Long userId, Integer page, Integer pagesize) {
  3. //1、根据用户id,调用API查询个人动态内容(PageResult -- Movement)
  4. PageResult pr = movementApi.findByUserId(userId,page,pagesize);
  5. //2、获取PageResult中的item列表对象
  6. List<Movement> items = (List<Movement>) pr.getItems();
  7. //3、非空判断
  8. if(items == null) {
  9. return pr;
  10. }
  11. //4、循环数据列表
  12. UserInfo userInfo = userInfoApi.findById(userId);
  13. List<MovementsVo> vos = new ArrayList<>();
  14. for (Movement item : items) {
  15. //5、一个Movement构建一个Vo对象
  16. MovementsVo vo = MovementsVo.init(userInfo, item);
  17. vos.add(vo);
  18. }
  19. //6、构建返回值
  20. pr.setItems(vos);
  21. return pr;
  22. }

3.3.4、API层

修改PublishApiPublishApiImpl完成查询好友动态功能

  1. @Override
  2. public PageResult findByUserId(Long userId, Integer page, Integer pagesize) {
  3. Criteria criteria = Criteria.where("userId").is(userId);
  4. Query query = Query.query(criteria).skip((page -1 ) * pagesize).limit(pagesize)
  5. .with(Sort.by(Sort.Order.desc("created")));
  6. List<Movement> movements = mongoTemplate.find(query, Movement.class);
  7. return new PageResult(page,pagesize,0l,movements);
  8. }

3.3.5、测试

68d3dccefacd4a75b3ed9cb8a337bff0.png

发表评论

表情:
评论列表 (有 0 条评论,198人围观)

还没有评论,来说两句吧...

相关阅读