Skip to content

3S-Academy-NJTech/3S-Hub-Backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

3S-Hub-Backend 项目介绍

1. 项目概述

3S-Hub-Backend 是一个功能完善的社区内容分享平台后端服务。项目基于 Spring BootJava 构建,采用经典的分层架构RESTful API 设计风格,为前端应用提供稳定、高效的数据支持和业务逻辑处理。整个项目旨在实现一个现代化的社区功能,包括用户管理、文章发布、互动评论和点赞等核心模块。

该项目不仅是业务功能的实现,更是一次对后端开发最佳实践的探索,尤其在数据建模、并发控制、性能优化和API设计方面进行了深入思考与实现,可作为展示个人扎实后端技术功底的代表性作品。

2. 技术栈

  • 核心框架: Spring Boot 3.5.0
  • 开发语言: Java 17
  • 数据访问: Spring Data JPA (Hibernate)
  • 数据库: MySQL
  • API风格: RESTful API
  • 构建工具: Apache Maven
  • Web服务器: Embedded Tomcat

3. 核心功能模块

  • 用户模块: 提供用户注册、登录、信息查询等基础功能。
  • 文章模块: 支持文章的创建(CreateArticleRequest)、发布、删除、修改和分页查询。
  • 评论模块: 用户可以对文章进行评论,支持层级结构(通过 CommentConverterSimpleCommentDTO 实现)。
  • 点赞模块: 用户可以对文章进行点赞和取消点赞,是典型的多对多关系处理。

4. 技术实现与难点详解

作为简历中的项目亮点,本项目的技术挑战与解决方案主要体现在以下几个方面:

4.1. RESTful API 设计与 DTO 转换

  • 挑战: 如何设计清晰、易用且安全的API,同时避免直接暴露数据库实体(Domain),防止领域模型与外部接口强耦合。
  • 解决方案:
    • 严格遵循 RESTful 设计原则,使用名词定义资源路径,用HTTP动词(GET, POST, DELETE)描述操作。
    • 创建专用的请求对象(Request Objects),如 CreateArticleRequest,用于接收和验证客户端数据,实现请求参数与领域模型的解耦。
    • 使用数据传输对象(DTO),如 SimpleCommentDTO,将领域对象(Domain)转换为对前端友好的数据结构。通过自定义的 CommentConverter 完成 Comment 实体到 SimpleCommentDTO 的映射,既隐藏了内部实现,又可以定制API输出,减少不必要的数据传输。

4.2. 复杂数据关系建模与JPA实践

  • 挑战: 如何高效地处理用户、文章、评论、点赞之间复杂的多对多和一对多关系。
  • 解决方案:
    • 用户-文章 (一对多): 在 UserArticle 实体中使用 @OneToMany@ManyToOne 注解进行双向关联。
    • 文章-评论 (一对多): 类似地,在 ArticleComment 之间建立一对多关联。
    • 用户-文章点赞 (多对多): 创建了独立的 ArticleLike 实体来处理这个多对多关系,而不是直接使用 @ManyToMany。这种中间表实体化的方式,使得点赞关系可以携带更多信息(如点赞时间 created_at),并且逻辑更清晰,扩展性更强。

4.3. 并发控制与数据一致性

  • 挑战: 在点赞这类高并发场景下,如何防止出现数据不一致的问题(如重复点赞/取消,点赞总数计算错误)。
  • 解决方案:
    • ArticleLikeService 的核心操作方法上使用 Spring 的 @Transactional 注解,确保点赞和更新文章点赞数这两个操作的原子性
    • 利用数据库的唯一约束(例如,在 ArticleLike 表上建立 user_idarticle_id 的联合唯一索引),从数据库层面彻底杜绝同一用户对同一文章重复点赞的可能,这是一种简单高效的并发控制手段。

4.4. 性能优化:N+1查询问题的规避

  • 挑战: 在查询文章列表并同时显示作者信息,或者查询评论列表时,JPA 默认的懒加载(LAZY loading)策略极易引发 N+1 查询问题,导致性能急剧下降。
  • 解决方案:
    • ArticleRepositoryCommentRepository 中,对于需要同时加载关联数据的查询,使用 JPQL (Java Persistence Query Language) 并配合 JOIN FETCH 关键字。例如,在查询文章列表时,编写 SELECT a FROM Article a JOIN FETCH a.user,这样可以在一条SQL中同时取回文章及其关联的用户数据,从根源上避免了N+1问题。
    • 对于复杂的视图,创建了 ViewArtAndUser 这样的视图对象(ResultMap),通过 JPQL 的构造函数表达式直接查询出需要的数据并组装成视图对象,避免了不必要的字段加载和多余的SQL查询。

4.5. 全局配置与代码健壮性

  • 挑战: 如何统一处理项目中的通用配置,如跨域和错误页面。
  • 解决方案:
    • 跨域处理: 通过 GlobalCorsConfig.java 实现全局CORS配置,允许指定来源的前端应用进行跨域访问,这是现代前后端分离架构的必备配置。
    • 自定义错误页: ErrorPageConfig.java 展示了对Spring Boot内置错误处理机制的定制能力,可以为不同的HTTP错误状态码(如404, 500)配置友好的返回页面或JSON响应。

5. 项目结构详解

.
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com/example/_S_Hub_Backend
│   │   │       ├── Application.java          # Spring Boot 启动类
│   │   │       ├── config                    # 全局配置包
│   │   │       │   ├── ErrorPageConfig.java  # 错误页面配置
│   │   │       │   └── GlobalCorsConfig.java # 全局跨域配置
│   │   │       ├── controller                # 控制器层 (API接口)
│   │   │       │   ├── request               # 请求体封装对象 (Request DTOs)
│   │   │       │   └── ... (UserController, etc.)
│   │   │       ├── converter                 # DTO与实体转换器
│   │   │       │   └── CommentConverter.java
│   │   │       ├── domain                    # 领域模型 (JPA实体)
│   │   │       │   ├── Article.java
│   │   │       │   ├── User.java
│   │   │       │   └── ...
│   │   │       ├── dto                       # 数据传输对象 (Response DTOs)
│   │   │       │   └── SimpleCommentDTO.java
│   │   │       ├── repository                # 数据访问层 (JPA Repositories)
│   │   │       │   ├── ArticleRepository.java
│   │   │       │   └── ...
│   │   │       ├── resultmap                 # 自定义查询结果映射
│   │   │       │   └── ViewArtAndUser.java
│   │   │       └── service                   # 业务逻辑层
│   │   │           ├── impl                  # 业务逻辑实现类
│   │   │           └── ... (UserService, etc.)
│   │   └── resources
│   │       ├── application.properties      # Spring Boot 核心配置文件
│   │       ├── static                      # 静态资源 (CSS, JS, Images)
│   │       └── templates                   # 模板文件 (e.g., Thymeleaf)
│   └── test                              # 测试代码
├── .gitignore                          # Git忽略文件配置
├── mvnw & mvnw.cmd                     # Maven Wrapper, 用于统一Maven版本
├── pom.xml                             # Maven项目核心配置文件
└── README.md                           # 项目说明文档

目录核心功能解释

  • config: 存放全局性的配置类。例如 GlobalCorsConfig 用于统一处理跨域请求,ErrorPageConfig 用于自定义错误响应。
  • controller: MVC 模式中的 C 层,负责接收外部 HTTP 请求,调用 Service 层处理业务,并返回响应。
    • controller.request: 存放用于接收前端 POST/PUT 请求体的 DTO,通常用于创建或更新资源。
  • domain: 存放 JPA 实体类(Entity),与数据库表结构一一对应,是核心的领域模型。
  • dto: 存放数据传输对象(Data Transfer Object),用于在 Service 层和 Controller 层之间传递数据,避免直接暴露数据库实体,实现内外隔离。
  • converter:存放实体(Entity)与 DTO 之间的转换逻辑,使得转换过程标准化、可复用。
  • repository: 数据访问层,继承 Spring Data JPA 的 JpaRepository,提供强大的数据 CRUD(增删改查)和自定义查询能力。
  • service: 业务逻辑核心层,负责编排和实现具体的业务功能。它会调用 Repository 层来持久化数据。
    • service.impl: Service 接口的具体实现类。
  • resultmap: 当 JPA 查询需要返回非实体类的自定义复合结构时,用于定义这些结果的映射类,如 ViewArtAndUser
  • resources: 存放所有非代码的资源文件。
    • application.properties: Spring Boot 的主配置文件,用于配置数据库连接、服务器端口等。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages