myblog
项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。
1. 项目结构与依赖设置
项目初始化与依赖
- 使用 Spring Initializr 创建项目。
- 引入必要的依赖包:
- Spring Boot Web:用于开发 REST API。
- MyBatis 和 MySQL 驱动:用于数据库交互。
- Spring Validation:用于验证用户输入。
- Lombok:减少样板代码。
- Hibernate Validator:手动加入以支持输入验证。
2. 数据库设计与建表
数据库表设计
- my_users :用于存储用户信息,包含字段:
id
、name
、email
、password
、role_id
等。 - my_roles :用于存储用户角色,包含字段:
id
、name
、description
等。 - my_articles :用于存储文章信息,包含字段:
id
、title
、author
、content
、category_id
、tags
、is_deleted
、created
、modified
等。
SQL 表的相关操作
- 插入用户和角色:使用插入语句添加初始用户和角色数据。
- 外键约束与错误:注意在添加用户时,由于外键关系,必须确保角色 ID 存在。
3. 用户模块
用户实体类 (MyUser
)
- 使用 Lombok 注解
@Data
、@NoArgsConstructor
、@AllArgsConstructor
简化代码。 - 添加必要的字段验证注解,例如
@NotBlank
和@NotNull
。
用户注册与登录
- 注册功能 :实现用户注册功能,使用
UserService
服务层来处理业务逻辑。 - 登录功能 :实现登录,验证用户名和密码,并通过
TokenService
生成 JWT Token。
用户控制器 (UserController
)
- 注册接口 :使用
@PostMapping("/register")
,调用UserService
来进行用户注册。 - 登录接口 :使用
@PostMapping("/login")
,调用UserService
登录并生成 Token,最后将 Token 作为 JSON 响应返回。
4. 文章管理模块
文章实体类 (MyArticle
)
MyArticle
:使用Lombok
注解简化代码。- 字段 :包括
id
、title
、author
、content
、categoryId
、tags
、isDeleted
、created
、modified
。 - 字段验证 :对必要的字段加上验证注解,如
@NotBlank
和@NotNull
。
- 字段 :包括
文章控制器 (ArticleController
)
- 添加文章 :
- 使用
@PostMapping("/article")
添加新文章。 - 使用
@Validated
注解对请求参数进行验证,若验证失败,通过BindingResult
获取错误信息。
- 使用
- 查询文章 :
- 获取所有文章 :使用
@GetMapping("/articles")
,不分页。 - 分页查询文章 :使用
@GetMapping("/articles/{pageNum}")
,通过传入的页码查询文章列表。
- 获取所有文章 :使用
- 更新文章 :
- 更新接口 :使用
@PutMapping("/article")
。 - 检查传入的文章对象是否包含 ID,并验证其字段。
- 调用
ArticleService
更新文章。
- 更新接口 :使用
- 删除文章 :
- 软删除接口 :使用
@DeleteMapping("/article/{id}")
。 - 实现软删除,通过修改
isDeleted
字段为2
来实现逻辑删除。
- 软删除接口 :使用
文章服务层 (ArticleService
)
- 添加文章 (
add
):为文章设置 ID 并存储。 - 查询所有文章 (
findAll
):查询所有文章,未分页。 - 分页查询文章 (
getListByPageNum
):根据传入的页码计算偏移量来查询分页文章。 - 文章详情 (
detail
):根据文章 ID 查询文章详情。 - 更新文章 (
update
):更新文章信息。 - 删除文章 (
delete
) :软删除文章,修改isDeleted
字段。
文章 Mapper (MyArticleMapper
)
- 使用 MyBatis 注解
@Mapper
定义数据库操作。 - 新建文章 :使用
@Insert
注解插入文章。 - 查询文章 :
- 不分页:使用
@Select("SELECT * FROM my_articles WHERE is_deleted = 1")
查询所有未删除的文章。 - 分页:使用
@Select("SELECT * FROM my_articles WHERE is_deleted = 1 LIMIT #{offset}, 30")
分页查询。 - 查询详情:通过文章
id
查询文章详情。
- 不分页:使用
- 更新文章 :使用
@Update
更新文章内容。 - 软删除文章 :使用
@Update("UPDATE my_articles SET is_deleted = 2 WHERE id = #{id}")
实现软删除。
5. 错误处理与验证
输入验证
- 添加和更新文章 :使用
@Validated
注解验证输入数据,并使用BindingResult
来捕获验证错误。 - Controller 层:对错误返回相应的错误码和消息,方便前端处理。
全局异常处理
- 异常处理机制 :在每个控制器方法中使用
try-catch
来捕获异常,返回JsonResultObject
,将错误信息统一封装在响应中,确保系统健壮性。
6. Token 处理
- 登录时生成 Token :
- 在
UserController
的/login
方法中调用TokenService
生成 Token,返回给客户端用于后续请求的认证。
- 在
- 权限验证 :
- 使用自定义注解和拦截器来验证每个请求是否携带有效的 Token,用于保护需要认证的接口(例如,添加、更新、删除文章)。
7. 项目运行与测试
本地测试
- 数据库初始化:确保所有的数据库表已经正确创建,并且初始数据(如用户角色)已插入。
- Postman 测试接口 :
- 用户注册与登录 :通过
/v1/register
和/v1/login
测试用户注册和登录功能,登录成功后获取 Token。 - 文章接口 :
- 添加文章 :使用
/v1/article
通过 POST 请求添加新文章。 - 查询文章 :通过
/v1/articles
或/v1/articles/{pageNum}
测试文章列表的查询。 - 更新与删除文章:分别通过 PUT 和 DELETE 请求测试更新和删除文章。
- 添加文章 :使用
- 用户注册与登录 :通过
8. 关键问题与解决方案
- SQL 外键约束错误:在插入用户数据时确保角色数据已存在,避免外键约束失败。
- Token 未返回问题:确保登录逻辑中成功生成 Token,并将其正确返回给前端。
- 验证失败的处理 :在控制器中使用
BindingResult
检查参数错误,并及时返回有意义的错误信息。 - 重复方法定义错误 :在
MyArticleMapper
中避免重复的方法定义,保证每个方法的名称唯一且功能明确。
总结
- 项目基于 Spring Boot,结合了 MyBatis 和 Hibernate Validator 等技术栈,适用于构建一个基本的博客系统。
- 包含了用户管理和文章管理模块,并实现了增删改查功能。
- 使用 JWT Token 进行用户身份认证,保证了部分接口的安全性。
- 在开发过程中,通过单独的 Service 层来处理业务逻辑,将控制器层的职责简化为参数验证与返回结果的封装,确保代码的可维护性和扩展性。