当前位置: 首页 > news >正文

Mongodb | 基于Springboot开发综合社交网络应用的项目案例(中英)

目录

Project background 

Development time

Project questions

Create Project

create springboot project

project framework

create folder

Create Models

user

post

Comment

Like

Message

Serive tier

user login and register

Dynamic Publishing and Browsing

Comment likes

message notification

Page-based query implementation

关联查询实现

用户和动态关联

动态和评论关联

部署与扩展



Project background 

Function description: Achieve functions such as user social relationship management, dynamic posting and browsing, comment and like functions, and message notification.

功能描述 :实现用户的社交关系管理、动态发布与浏览、评论点赞、消息通知等功能。


Handling the association relationships of documents: The user's basic information, social relationships, published content, comments, etc. can be stored in different document collections. Then, through the references or nested structures within the documents, association relationships can be established, facilitating data querying and operations. For example, when querying a user's friend's dynamic, the content published by the friend can be obtained through an association query.
Efficient data pagination and querying: For scenarios such as users browsing dynamic posts and message lists, MongoDB provides efficient data pagination query functions, which can quickly return data within a specified range and improve user experience.
Flexible scalability: As the number of users and data volume increase, MongoDB's storage cluster can be easily expanded to meet the expansion requirements of the application.

文档的关联关系处理 :可以将用户的基本信息、社交关系、发布的内容、评论等存储在不同的文档集合中,然后通过文档中的引用或嵌套结构来建立关联关系,方便进行数据的查询和操作,例如查询一个用户的好友动态时,可以通过关联查询获取好友发布的内容。 高效的数据分页与查询 :对于用户浏览动态、消息列表等场景,MongoDB 提供了高效的数据分页查询功能,能够快速返回指定范围内的数据,提高用户体验。 灵活的扩展性 :随着用户数量和数据量的增长,可以方便地扩展 MongoDB 的存储集群,满足应用的扩展需求。

Development time

Start time : May 27,2025 23:00

End Time : now

Project questions

  • null

Create Project

create springboot project

project framework

social-network-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   ├── com.example.socialnetwork/
│   │   │   │   ├── SocialNetworkApplication.java
│   │   │   │   ├── config/
│   │   │   │   │   └── MongoConfig.java
│   │   │   │   ├── controller/
│   │   │   │   │   ├── UserController.java
│   │   │   │   │   ├── PostController.java
│   │   │   │   │   ├── CommentController.java
│   │   │   │   │   ├── LikeController.java
│   │   │   │   │   └── MessageController.java
│   │   │   │   ├── model/
│   │   │   │   │   ├── User.java
│   │   │   │   │   ├── Post.java
│   │   │   │   │   ├── Comment.java
│   │   │   │   │   ├── Like.java
│   │   │   │   │   └── Message.java
│   │   │   │   ├── repository/
│   │   │   │   │   ├── UserRepository.java
│   │   │   │   │   ├── PostRepository.java
│   │   │   │   │   ├── CommentRepository.java
│   │   │   │   │   ├── LikeRepository.java
│   │   │   │   │   └── MessageRepository.java
│   │   │   │   ├── service/
│   │   │   │   │   ├── UserService.java
│   │   │   │   │   ├── PostService.java
│   │   │   │   │   ├── CommentService.java
│   │   │   │   │   ├── LikeService.java
│   │   │   │   │   └── MessageService.java
│   │   │   │   └── dto/
│   │   │   │       ├── UserDto.java
│   │   │   │       ├── PostDto.java
│   │   │   │       ├── CommentDto.java
│   │   │   │       ├── LikeDto.java
│   │   │   │       └── MessageDto.java
│   │   └── resources/
│   │       ├── application.properties
│   │       └── static/
│   └── test/
└── pom.xml

create folder

Create Models

user

package com.socialnetwork.www.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.ArrayList;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(collection = "users")
public class User {@Idprivate String id;private String username;private String password;private String email;private String profilePicture;private String bio;private List<String> followers = new ArrayList<>();private List<String> following = new ArrayList<>();
}

post

package com.socialnetwork.www.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import javax.xml.stream.events.Comment;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(collection = "posts")
public class Post {@Idprivate String id;private String userId;private String content;private List<String> images;private Date createdAt;private int likeCount = 0;private List<Comment> comments = new ArrayList<>();
}

Comment

package com.socialnetwork.www.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(collection = "comments")
public class Comments {@Idprivate String id;private String userId;private String postId;private String content;private Date createdAt;private int likeCount = 0;
}

Like

package com.socialnetwork.www.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(collection = "likes")
public class Like {@Idprivate String id;private String userId;private String postId;private String commentId;private Date createdAt;// Getters and Setters
}

Message

package com.socialnetwork.www.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(collection = "messages")
public class Message {@Idprivate String id;private String senderId;private String receiverId;private String content;private Date sentAt;private boolean read = false;
}

Serive tier

user login and register

用户 登录和注册

@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<?> registerUser(@RequestBody UserDto userDto) {User user = userService.registerUser(userDto);return ResponseEntity.ok(user);}@PostMapping("/login")public ResponseEntity<?> loginUser(@RequestBody UserDto userDto) {User user = userService.loginUser(userDto);return ResponseEntity.ok(user);}
}
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User registerUser(UserDto userDto) {User user = new User();user.setUsername(userDto.getUsername());user.setPassword(bCryptPasswordEncoder.encode(userDto.getPassword()));user.setEmail(userDto.getEmail());return userRepository.save(user);}public User loginUser(UserDto userDto) {User user = userRepository.findByUsername(userDto.getUsername());if (user != null && bCryptPasswordEncoder.matches(userDto.getPassword(), user.getPassword())) {return user;}return null;}
}

Dynamic Publishing and Browsing

动态发布与浏览

@RestController
@RequestMapping("/api/posts")
public class PostController {@Autowiredprivate PostService postService;@PostMappingpublic ResponseEntity<?> createPost(@RequestBody PostDto postDto, @AuthenticationPrincipal String userId) {Post post = postService.createPost(postDto, userId);return ResponseEntity.ok(post);}@GetMappingpublic ResponseEntity<?> getPosts(@RequestParam int page, @RequestParam int size) {Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt"));Page<Post> posts = postService.getPosts(pageable);return ResponseEntity.ok(posts);}
}
@Service
public class PostService {@Autowiredprivate PostRepository postRepository;public Post createPost(PostDto postDto, String userId) {Post post = new Post();post.setUserId(userId);post.setContent(postDto.getContent());post.setImages(postDto.getImages());post.setCreatedAt(new Date());return postRepository.save(post);}public Page<Post> getPosts(Pageable pageable) {return postRepository.findAll(pageable);}
}

Comment likes

评论点赞

@RestController
@RequestMapping("/api/comments")
public class CommentController {@Autowiredprivate CommentService commentService;@PostMappingpublic ResponseEntity<?> addComment(@RequestBody CommentDto commentDto, @AuthenticationPrincipal String userId) {Comment comment = commentService.addComment(commentDto, userId);return ResponseEntity.ok(comment);}@PostMapping("/{commentId}/like")public ResponseEntity<?> likeComment(@PathVariable String commentId, @AuthenticationPrincipal String userId) {Like like = commentService.likeComment(commentId, userId);return ResponseEntity.ok(like);}
}
@Service
public class CommentService {@Autowiredprivate CommentRepository commentRepository;@Autowiredprivate LikeRepository likeRepository;public Comment addComment(CommentDto commentDto, String userId) {Comment comment = new Comment();comment.setUserId(userId);comment.setPostId(commentDto.getPostId());comment.setContent(commentDto.getContent());comment.setCreatedAt(new Date());return commentRepository.save(comment);}public Like likeComment(String commentId, String userId) {Like like = new Like();like.setUserId(userId);like.setCommentId(commentId);like.setCreatedAt(new Date());return likeRepository.save(like);}
}

message notification

消息通知

@RestController
@RequestMapping("/api/messages")
public class MessageController {@Autowiredprivate MessageService messageService;@PostMappingpublic ResponseEntity<?> sendMessage(@RequestBody MessageDto messageDto, @AuthenticationPrincipal String userId) {Message message = messageService.sendMessage(messageDto, userId);return ResponseEntity.ok(message);}@GetMappingpublic ResponseEntity<?> getMessages(@RequestParam String receiverId, @RequestParam int page, @RequestParam int size) {Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "sentAt"));Page<Message> messages = messageService.getMessages(receiverId, pageable);return ResponseEntity.ok(messages);}
}
@Service
public class MessageService {@Autowiredprivate MessageRepository messageRepository;public Message sendMessage(MessageDto messageDto, String userId) {Message message = new Message();message.setSenderId(userId);message.setReceiverId(messageDto.getReceiverId());message.setContent(messageDto.getContent());message.setSentAt(new Date());message.setRead(false);return messageRepository.save(message);}public Page<Message> getMessages(String receiverId, Pageable pageable) {return messageRepository.findByReceiverId(receiverId, pageable);}
}

Page-based query implementation

分页查询实现

在 Spring Data MongoDB 中,可以使用 Pageable 接口来实现分页查询。

public interface PostRepository extends MongoRepository<Post, String> {Page<Post> findAll(Pageable pageable);
}

在控制器中使用:

@GetMapping
public ResponseEntity<?> getPosts(@RequestParam int page, @RequestParam int size) {Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt"));Page<Post> posts = postService.getPosts(pageable);return ResponseEntity.ok(posts);
}

关联查询实现

使用 MongoDB 的 @DBRef 注解可以实现文档之间的关联查询。

用户和动态关联

Post 文档中,userId 字段关联到 User 文档。

@Document(collection = "posts")
public class Post {@Idprivate String id;private String userId;private String content;private List<String> images;private Date createdAt;private int likeCount = 0;private List<Comment> comments = new ArrayList<>();// Getters and Setters
}

在控制器中,可以通过 userId 查询用户信息:

@GetMapping("/{postId}")
public ResponseEntity<?> getPost(@PathVariable String postId) {Post post = postService.getPost(postId);User user = userService.getUser(post.getUserId());return ResponseEntity.ok(post);
}

动态和评论关联

Comment 文档中,postId 字段关联到 Post 文档。

@Document(collection = "comments")
public class Comment {@Idprivate String id;private String userId;private String postId;private String content;private Date createdAt;private int likeCount = 0;// Getters and Setters
}

在控制器中,可以通过 postId 查询评论列表:

@GetMapping("/{postId}/comments")
public ResponseEntity<?> getComments(@PathVariable String postId) {List<Comment> comments = commentService.getComments(postId);return ResponseEntity.ok(comments);
}

部署与扩展

在生产环境中,可以使用 MongoDB 的分片功能来支持大规模数据的存储和查询。

spring.data.mongodb.uri=mongodb://username:password@host1:port1,host2:port2,host3:port3/database?replicaSet=replicaSetName

 - Thanks you - 

http://www.xdnf.cn/news/670897.html

相关文章:

  • VS Code 安装后设置中文界面并添加常用插件的详细指南
  • 仿盒马》app开发技术分享-- 确认订单页(数据展示)(端云一体)
  • 过河卒--记忆化搜索
  • OpenHarmony平台驱动使用(五),HDMI
  • Python实现VTK-自学笔记(5):在三维世界里自由舞蹈——高级交互与动态可视化
  • @recogito/annotorious图像标注库
  • java 项目登录请求业务解耦模块全面
  • (自用)Java学习-5.16(取消收藏,批量操作,修改密码,用户更新,上传头像)
  • 基于 Operator 部署 Prometheus 实现 K8S 监控
  • Spark实时流数据处理实例(SparkStreaming通话记录消息处理)
  • 【md2html python 将 Markdown 文本转换为 HTML】
  • HTML Day02
  • pythonday30
  • Spark SQL进阶:解锁大数据处理的新姿势
  • AG32 DMAC实现内部MCU与FPGA通信【知识库】
  • 运维自动化工具 ansible 知识点总结
  • 域控账号密码抓取
  • C++数据结构 : 哈希表的实现
  • 2025上半年软考高级系统架构设计师经验分享
  • 第十一节:第一部分:正则表达式:应用案例、爬取信息、搜索替换
  • 牙科低对比度模体,衡量牙科影像设备的性能和诊断能力的工具
  • 8种使用克劳德4的方法,目前可用随时更新!
  • 人工智能与机器学习从理论、技术与实践的多维对比
  • 打造AI智能旅行规划器:基于LLM和Crew AI的Agent实践
  • Flash Attention:让Transformer飞起来的硬件优化技术
  • 宝塔安装easyswoole框架
  • Cherry Studio连接配置MCP服务器
  • wsl图形界面显示
  • 探讨Facebook的元宇宙愿景下的虚拟现实技术
  • 【2025最新】Cline自定义API配置完全指南:接入Claude 3.7/GPT-4o