Spring Boot 实战:构建一个社交平台 API

       在这篇博客中,我们将继续深入 Spring Boot 的开发实践,通过构建一个简单的社交平台 API,帮助大家理解如何使用 Spring Boot 高效地开发一个具有注册、登录、个人资料管理、帖子发布与评论、点赞等功能的社交平台。在开发过程中,我们将结合 Spring Security、Spring Data JPA、Spring Boot Actuator、Redis 缓存等技术,全面展示如何在实际项目中应用这些高级特性。


项目架构

       这个社交平台将包括以下核心模块:

  1. 用户认证与管理(注册、登录、个人资料管理)
  2. 帖子管理(发布、查看、删除、点赞)
  3. 评论功能(对帖子进行评论、查看评论)
  4. 缓存优化(使用 Redis 加速频繁查询)
  5. 消息通知(发布、删除帖子时发送通知)

技术栈

  • 后端框架:Spring Boot、Spring Security、Spring Data JPA、Spring Web
  • 数据库:MySQL(存储用户、帖子、评论等数据)
  • 缓存:Redis(加速用户和帖子数据查询)
  • 消息队列:RabbitMQ(处理异步任务)
  • 前端:Vue.js 或 React(本篇仅关注后端)

1. 搭建基础项目框架

1.1 创建 Spring Boot 项目

       首先,使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:

  • Spring Web:用于构建 RESTful API。
  • Spring Data JPA:用于数据库持久化操作。
  • Spring Security:用于用户认证和授权。
  • MySQL Driver:用于数据库连接。
  • Spring Boot DevTools:加速开发过程。
  • Spring Boot Starter Cache:支持缓存功能。
  • Spring Boot Starter AMQP:用于集成消息队列(RabbitMQ)。

1.2 项目结构

       我们将项目分为多个模块,每个模块负责不同的业务逻辑:

social-platform/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example.socialplatform/
│   │   │       ├── controller/
│   │   │       ├── model/
│   │   │       ├── repository/
│   │   │       ├── service/
│   │   │       ├── security/
│   │   │       └── SocialPlatformApplication.java
│   │   └── resources/
│   │       ├── application.properties
│   │       └── application.yml
├── pom.xml
└── README.md

2. 用户认证与管理

2.1 用户实体和注册功能

       首先,我们定义一个 User 实体类,用于存储用户信息。

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;private String password;private String role;// Getters and Setters
}
2.1.1 用户注册 API

       我们创建一个 UserController 来处理用户的注册请求。

@RestController
@RequestMapping("/auth")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<String> register(@RequestBody User user) {userService.register(user);return ResponseEntity.ok("Registration successful!");}
}
2.1.2 密码加密与保存

       使用 Spring Security 提供的 BCryptPasswordEncoder 来加密用户的密码。

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate BCryptPasswordEncoder passwordEncoder;public void register(User user) {user.setPassword(passwordEncoder.encode(user.getPassword()));  // 密码加密user.setRole("USER");  // 默认角色为用户userRepository.save(user);}
}

2.2 用户认证与权限管理

2.2.1 配置 Spring Security

       在 WebSecurityConfig 中配置用户认证和权限管理。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/auth/register", "/auth/login").permitAll().anyRequest().authenticated()  // 其他请求需要认证.and().formLogin().loginPage("/auth/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());}
}
2.2.2 自定义 UserDetailsService

       通过自定义 UserDetailsService 来加载用户的认证信息。

@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));return new UserPrincipal(user);}
}

3. 帖子管理功能

3.1 帖子实体与数据库操作

       我们定义一个 Post 实体,用于存储用户发布的帖子。

@Entity
public class Post {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long userId;private String content;private LocalDateTime createdAt;// Getters and Setters
}

3.2 帖子服务与控制器

3.2.1 创建与获取帖子

       在 PostService 中,我们实现帖子创建和获取的功能。

@Service
public class PostService {@Autowiredprivate PostRepository postRepository;public Post createPost(Post post) {post.setCreatedAt(LocalDateTime.now());return postRepository.save(post);}public List<Post> getAllPosts() {return postRepository.findAll();}
}
3.2.2 帖子控制器

       创建帖子控制器来处理用户的请求。

@RestController
@RequestMapping("/posts")
public class PostController {@Autowiredprivate PostService postService;@PostMappingpublic ResponseEntity<Post> createPost(@RequestBody Post post) {Post createdPost = postService.createPost(post);return ResponseEntity.ok(createdPost);}@GetMappingpublic ResponseEntity<List<Post>> getAllPosts() {return ResponseEntity.ok(postService.getAllPosts());}
}

4. 评论与点赞功能

4.1 评论实体与数据库操作

       我们定义一个 Comment 实体,用于存储用户对帖子的评论。

@Entity
public class Comment {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long postId;private Long userId;private String content;private LocalDateTime createdAt;// Getters and Setters
}

4.2 点赞功能

       我们通过创建一个 Like 实体来记录用户对帖子或评论的点赞信息。

@Entity
public class Like {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long postId;private Long userId;// Getters and Setters
}

5. 缓存优化

5.1 使用 Redis 缓存帖子

       在 PostService 中,我们使用 Redis 缓存来加速频繁访问的帖子数据。

5.1.1 配置 Redis

       在 application.yml 中配置 Redis:

spring:cache:type: redisredis:host: localhostport: 6379
5.1.2 缓存帖子

       使用 @Cacheable 注解将获取帖子的方法缓存到 Redis 中。

@Service
public class PostService {@Autowiredprivate PostRepository postRepository;@Cacheable(value = "posts", key = "#id")public Post getPostById(Long id) {return postRepository.findById(id).orElseThrow(() -> new RuntimeException("Post not found"));}
}

6. 消息通知功能

       当用户发布帖子或评论时,我们通过 RabbitMQ 发送通知消息。

6.1 配置 RabbitMQ

       在 application.yml 中配置 RabbitMQ:

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest

6.2 消息发送与接收

6.2.1 消息发送

       在 PostService 中,我们向 RabbitMQ 发送消息:

@Service
public class PostService {@Autowiredprivate RabbitTemplate rabbitTemplate;public Post createPost(Post post) {// 保存帖子postRepository.save(post);// 发送消息rabbitTemplate.convertAndSend("socialExchange", "post.created", post);return post;}
}
6.2.2 消息接收

       通过 @RabbitListener 注解接收并处理消息:

@Service
public class NotificationService {@RabbitListener(queues = "socialQueue")public void receiveMessage(Post post) {// 处理通知逻辑System.out.println("New Post Created: " + post.getContent());}
}

7. 总结

       通过本篇博客,我们构建了一个简单的社交平台 API,涵盖了用户注册、登录、帖子管理、评论与点赞、消息通知等功能,并结合 Redis 缓存、RabbitMQ 消息队列等技术进行优化。通过这个项目,我们深入了解了 Spring Boot 的多种高级特性,如 Spring Security、Spring Data JPA、缓存和消息队列的使用。

       随着项目的不断扩展,你可以进一步增强系统的安全性、性能和可扩展性,例如增加支付系统、推送通知、文件上传等功能。希望这篇文章能帮助你在实际开发中更好地运用 Spring Boot 构建高效、可靠的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62967.shtml

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

相关文章

配置mysqld(读取选项内容,基本配置),数据目录(配置的必要性,目录下的内容,具体文件介绍,修改配置)

目录 配置mysqld 读取选项内容 介绍 启动脚本 基本配置 内容 端口号 数据目录的路径 配置的必要性 配置路径 mysql数据目录 具体文件 修改配置时 权限问题 配置mysqld 读取选项内容 介绍 会从[mysqld] / [server] 节点中读取选项内容 优先读取[server] 虽然服务…

智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能

前言&#xff1a; 在当今社会的高速运转之下&#xff0c;夜幕低垂之时&#xff0c;许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言&#xff0c;确保孩童按时用餐与居家安全成为心头大事。此时&#xff0c;家居留言录音提示功能应运而生&#xff0c;恰似家中的一位无形…

Java 编程基础:开启编程世界的大门

一、Java 环境搭建 在开始编写 Java 代码之前&#xff0c;我们需要先搭建 Java 开发环境。 1. 安装 JDK&#xff08;Java Development Kit&#xff09; JDK 是 Java 开发的核心工具包&#xff0c;它包含了编译 Java 源文件所需的编译器&#xff08;javac&#xff09;以及运行…

pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要结构&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 这里不支持批处理 Python version…

【SickOs1.1靶场渗透】

文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.150 二、信息收集 端口扫描 nmap -sS -sV -p- -A 192.168.20.150 开放了22、3128端口&#xff0c;8080端口显示关闭 22端…

【HF设计模式】03-装饰者模式

声明&#xff1a;仅为个人学习总结&#xff0c;还请批判性查看&#xff0c;如有不同观点&#xff0c;欢迎交流。 摘要 《Head First设计模式》第3章笔记&#xff1a;结合示例应用和代码&#xff0c;介绍装饰者模式&#xff0c;包括遇到的问题、遵循的 OO 原则、达到的效果。 …

Mysql数据库中,什么情况下设置了索引但无法使用?

在MySQL数据库中&#xff0c;即使已经正确设置了索引&#xff0c;但在某些情况下索引可能无法被使用。 以下是一些常见的情况&#xff1a; 1. 数据分布不均匀 当某个列的数据分布非常不均匀时&#xff0c;索引可能无法有效地过滤掉大部分的数据&#xff0c;导致索引失效。 …

秒杀业务中的库存扣减为什么不加分布式锁?

前言 说到秒杀业务的库存扣减&#xff0c;就还是得先确认我们的扣减基本方案。 秒杀场景的库存扣减方案 一般的做法是&#xff0c;先在Redis中做扣减&#xff0c;然后发送一个MQ消息&#xff0c;消费者在接到消息之后做数据库中库存的真正扣减及业务逻辑操作。 如何解决数据…

ChatGPT生成测试用例的最佳实践(一)

前面介绍的案例主要展示了ChatGPT在功能、安全和性能测试用例生成方面的应用和成果。通过ChatGPT生成测试用例&#xff0c;测试团队不仅可以提升工作效率&#xff0c;还可以加快测试工作的速度&#xff0c;尽早发现被测系统中的问题。问题及早发现有助于提高软件的质量和用户满…

基于Redis实现令牌桶算法

基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制&#xff08;流量不均匀或变化的衡量标准&#xff09;。它还可以用作调度算…

操作系统(8)死锁

一、概念 死锁是指在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引起的事件&#xff0c;而无限期地僵持下去的局面。在多任务环境中&#xff0c;由于资源分配不当&#xff0c;导致两个或多个进程在等待对方释放资源时陷入无限等待的状态&#xff0c;这就是死…

Micropython 扩展C模块<HelloWorld>

开发环境 MCU&#xff1a;Pico1&#xff08;无wifi版&#xff09;使用固件&#xff1a;自编译版本开发环境&#xff1a;MacBook Pro Sonoma 14.5开发工具&#xff1a;Thonny 4.1.6开发语言&#xff1a;MicroPython 1.24 执行示例 在github上获取micropython&#xff0c;我使…

并查集基础

abstract 并查集&#xff08;Union-Find Set&#xff09;是一种数据结构&#xff0c;主要用于处理动态连通性问题&#xff08;Dynamic Connectivity Problem&#xff09;&#xff0c;例如在图论中判断两点是否属于同一个连通分量&#xff0c;以及动态地合并集合。 它广泛应用…

CloudberryDB(一)安装部署多节点分布式数据库集群

CloudberryDB&#xff1a; 一个 Greenplum Database 分布式数据库开源版本的衍生项目&#xff0c; 针对开源 Greenplum Database 优化的地方&#xff0c; CloudberryDB制定了路线图&#xff08;https://github.com/orgs/cloudberrydb/discussions/369&#xff09;并在逐步改…

解决Logitech G hub 无法进入一直转圈的方案(2024.12)

如果你不是最新版本无法加载尝试以下方案&#xff1a;删除AppData 文件夹下的logihub文件夹 具体路径&#xff1a;用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本&#xff0c;记得备份&#xff01;&#xff01; ↓如果你是最新…

数据库范式与反范式化:如何权衡性能与数据一致性

目录 1. 什么是数据库范式&#xff08;Normalization&#xff09;&#xff1f;第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 2. 什么是反范式化&#xff08;Denormalization&#xff09;&#xff1f;3. 反范式…

Nmap使用总结

0X00 背景 nmap是测试中常用的网络探测工具&#xff0c;但是这回简单的操作&#xff0c;一直了解不深入&#xff0c;现在深入的了解和学习一下。 在文章结构上&#xff0c;我把平时常用的内容提前了&#xff0c;以便再次查阅的时候&#xff0c;比较方便。 0X01 安装 nmap可…

【记录49】vue2 vue-office在线预览 docx、pdf、excel文档

vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…

MVC模式的理解和实践

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一种经典的设计模式&#xff0c;特别适用于构建用户界面复杂的Web应用程序。MVC通过将应用程序的业务逻辑、数据显示和用户交互分离&#xff0c;使代码结构更加清晰&#xff0c;易于维护和扩展…

[A-22]ARMv8/v9-SMMU多级页表架构

ver0.1 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 前文我们对SMMU的系统架构和基本功能做了简要的介绍,现在大家大致对SMMU在基于ARM体系的系统架构下的总线位置和产品形态有了基本的了解。这里我们还是简单做个前情回顾,从总线架构角度看…