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

news2025/6/3 10:50:44

目录

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 {
    @Id
    private 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 {
    @Id
    private 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 {
    @Id
    private 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 {
    @Id
    private 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 {
    @Id
    private 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 {
    @Autowired
    private 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 {
    @Autowired
    private 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 {
    @Autowired
    private PostService postService;

    @PostMapping
    public ResponseEntity<?> createPost(@RequestBody PostDto postDto, @AuthenticationPrincipal String userId) {
        Post post = postService.createPost(postDto, userId);
        return ResponseEntity.ok(post);
    }

    @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);
    }
}
@Service
public class PostService {
    @Autowired
    private 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 {
    @Autowired
    private CommentService commentService;

    @PostMapping
    public 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 {
    @Autowired
    private CommentRepository commentRepository;

    @Autowired
    private 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 {
    @Autowired
    private MessageService messageService;

    @PostMapping
    public ResponseEntity<?> sendMessage(@RequestBody MessageDto messageDto, @AuthenticationPrincipal String userId) {
        Message message = messageService.sendMessage(messageDto, userId);
        return ResponseEntity.ok(message);
    }

    @GetMapping
    public 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 {
    @Autowired
    private 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 {
    @Id
    private 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 {
    @Id
    private 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.coloradmin.cn/o/2394799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞腾D2000与FPGA结合的主板

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块&#xff0c;采用6U VPX架构&#xff0c;模块装上外壳即为独立整机&#xff0c;方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

百度量子蜘蛛3.0横空出世,搜索引擎迎来“量子跃迁“级革命

一、量子蜘蛛3.0的三大颠覆性升级 1. 动态抓取&#xff1a;让内容实时"量子纠缠" - 智能频率调节&#xff1a;根据网站更新频率自动调整抓取节奏&#xff0c;新闻类站点日抓取量达3-5次&#xff0c;静态页面抓取间隔延长至72小时。某财经媒体通过"热点事件15分钟…

GitHub开源|AI顶会论文中文翻译PDF合集(gpt-translated-pdf-zh)

项目核心特点 该项目专注于提供计算机科学与人工智能领域的高质量中文翻译资源&#xff0c;以下为关键特性&#xff1a; 主题覆盖广泛&#xff1a;包含算法、数据结构、概率统计等基础内容&#xff0c;以及深度学习、强化学习等前沿研究方向。格式统一便捷&#xff1a;所有文…

Drawio编辑器二次开发

‌ Drawio &#xff08;现更名为 Diagrams.net &#xff09;‌是一款完全免费的在线图表绘制工具&#xff0c;由 JGraph公司 开发。它支持创建多种类型的图表&#xff0c;包括流程图、组织结构图、UML图、网络拓扑图、思维导图等&#xff0c;适用于商务演示、软件设计等多种场景…

1.测试过程之需求分析和测试计划

测试基础 流程 1.分析测试需求 2.编写测试计划 3.设计与编写测试用例 4.执行测试 5.评估与总结 测试目标 根据测试阶段不同可分为四个主要目标&#xff1a;预防错误&#xff08;早期&#xff09;、发现错误&#xff08;开发阶段&#xff09;、建立信心&#xff08;验收阶段&a…

[春秋云镜] CVE-2023-23752 writeup

首先奉上大佬的wp表示尊敬&#xff1a;&#xff08;很详细&#xff09;[ 漏洞复现篇 ] Joomla未授权访问Rest API漏洞(CVE-2023-23752)_joomla未授权访问漏洞(cve-2023-23752)-CSDN博客 知识点 Joomla版本为4.0.0 到 4.2.7 存在未授权访问漏洞 Joomla是一套全球知名的内容管理…

CSS专题之水平垂直居中

前言 石匠敲击石头的第 16 次 在日常开发中&#xff0c;经常会遇到水平垂直居中的布局&#xff0c;虽然现在基本上都用 Flex 可以轻松实现&#xff0c;但是在某些无法使用 Flex 的情况下&#xff0c;又应该如何让元素水平垂直居中呢&#xff1f;这也是一道面试的必考题&#xf…

(新)MQ高级-MQ的可靠性

消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能&#xff0c;默认情况下MQ的数据都是在内存存储的临时数据&#xff0c;重启后就会消失。为了保证数据的可靠性&#xff0c;必须…

Leetcode 3231. 要删除的递增子序列的最小数量

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums&#xff0c;你可以执行任意次下面的操作&#xff1a; 从数组删除一个 严格递增 的 子序列。 您的任务是找到使数组为 空 所需的 最小 操作数。 1.2.题目地址 https://leetcode.cn/problems/minimum-number-of-increas…

4.2.5 Spark SQL 分区自动推断

在本节实战中&#xff0c;我们学习了Spark SQL的分区自动推断功能&#xff0c;这是一种提升查询性能的有效手段。通过创建具有不同分区的目录结构&#xff0c;并在这些目录中放置JSON文件&#xff0c;我们模拟了一个分区表的环境。使用Spark SQL读取这些数据时&#xff0c;Spar…

【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南

一、环境准备 import cv2 import numpy as np import matplotlib.pyplot as plt# 配置中文字体显示&#xff08;可选&#xff09; plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False二、图像的基本操作 1. 图像读取、显示与保存 使用OpenCV…

Spring Boot微服务架构(九):设计哲学是什么?

一、Spring Boot设计哲学是什么&#xff1f; Spring Boot 的设计哲学可以概括为 ​​“约定优于配置”​​ 和 ​​“开箱即用”​​&#xff0c;其核心目标是​​极大地简化基于 Spring 框架的生产级应用的初始搭建和开发过程​​&#xff0c;让开发者能够快速启动并运行项目…

TC/BC/OC P2P/E2E有啥区别?-PTP协议基础概念介绍

前言 时间同步网络中的每个节点&#xff0c;都被称为时钟&#xff0c;PTP协议定义了三种基本时钟节点。本文将介绍这三种类型的时钟&#xff0c;以及gPTP在同步机制上与其他机制的区别 本系列文章将由浅入深的带你了解gPTP&#xff0c;欢迎关注 时钟类型 在PTP中我们将各节…

Kafka数据怎么保障不丢失

在分布式消息系统中&#xff0c;数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略&#xff0c;并附示意图辅助理解。 一、生产者端&#xff1a…

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录&#xff08;八&#xff09;&#xff1a;AI智能创建书签功能深度解析前言 &#x1f4dd;1. AI功能设计思路 &#x1f9e0;1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用 应用简介&#xff1a; X-plore 是一款强大的安卓端文件管理器&#xff0c;它可以在电视或者手机上管理大量媒体文件、应用程序。…

使用多Agent进行海报生成的技术方案及评估套件-P2P、paper2poster

最近字节、滑铁卢大学相关团队同时放出了他们使用Agent进行海报生成的技术方案&#xff0c;P2P和Paper2Poster&#xff0c;传统方案如类似ppt生成等思路&#xff0c;基本上采用固定的模版&#xff0c;提取相关的关键元素进行模版填充&#xff0c;因此&#xff0c;海报生成的质量…

Redis--缓存工具封装

经过前面的学习&#xff0c;发现缓存中的问题&#xff0c;无论是缓存穿透&#xff0c;缓存雪崩&#xff0c;还是缓存击穿&#xff0c;这些问题的解决方案业务代码逻辑都很复杂&#xff0c;我们也不应该每次都来重写这些逻辑&#xff0c;我们可以将其封装成工具。而在封装的时候…

python:在 PyMOL 中如何查看和使用内置示例文件?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 可视化示例‌&#xff1a;打开 PyM…

SpringCloud——Docker

1.命令解读 docker run -d 解释&#xff1a;创建并运行一个容器&#xff0c;-d则是让容器以后台进程运行 --name mysql 解释&#xff1a; 给容器起个名字叫mysql -p 3306:3306 解释&#xff1a;-p 宿主机端口:容器内端口&#xff0c;设置端口映射 注意&#xff1a; 1、…