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

Spring Boot 项目 myblog 整理

myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。

1. 项目结构与依赖设置

项目初始化与依赖
  • 使用 Spring Initializr 创建项目。
  • 引入必要的依赖包:
    • Spring Boot Web:用于开发 REST API。
    • MyBatis 和 MySQL 驱动:用于数据库交互。
    • Spring Validation:用于验证用户输入。
    • Lombok:减少样板代码。
    • Hibernate Validator:手动加入以支持输入验证。

2. 数据库设计与建表

数据库表设计
  • my_users:用于存储用户信息,包含字段:idnameemailpasswordrole_id 等。
  • my_roles:用于存储用户角色,包含字段:idnamedescription 等。
  • my_articles:用于存储文章信息,包含字段:idtitleauthorcontentcategory_idtagsis_deletedcreatedmodified 等。
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 注解简化代码。
    • 字段:包括 idtitleauthorcontentcategoryIdtagsisDeletedcreatedmodified
    • 字段验证:对必要的字段加上验证注解,如 @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 层来处理业务逻辑,将控制器层的职责简化为参数验证与返回结果的封装,确保代码的可维护性和扩展性。

相关文章:

Spring Boot 项目 myblog 整理

myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...

uniapp 城市选择插件

uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的&#xff1f; 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测&#xff1f; 4.你为什么能够做测试这一行&#xff1f;&#xff08;根据个人情况分析理解&#xff09; 5.你认为测试的目的是什么&#xff1f; 6.软件测试的流程&#xff…...

Mesh路由组网

Mesh无线网格网络&#xff0c;多跳&#xff08;multi-hop&#xff09;网络&#xff0c;为解决全屋覆盖信号&#xff0c;一般用于家庭网络和小型企业 原理 网关路由器&#xff08;主路由&#xff0c;连接光猫&#xff09;&#xff0c;Mesh路由器&#xff08;子路由&#xff0c;…...

LeetCode131:分割回文串

题目链接&#xff1a;131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 代码如下&#xff1a; class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...

详细解析 devmem 命令:在 Linux 系统中直接访问内存的利器

目录 什么是 devmem&#xff1f;为什么需要 devmem&#xff1f;devmem 命令的基本语法devmem 在硬件调试中的应用安全性与风险devmem 的常见应用示例结论 在嵌入式系统开发和硬件调试中&#xff0c;开发者经常需要直接与硬件打交道&#xff0c;访问和修改内存中某些特定区域的内…...

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法

本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时&#xff0c;突然发现它的一个接口&#xff0c;被另一个服务ip频繁的请求。 按理说&#xff0c;之前设置的是&#xff0c;每隔1分钟请求一次接口。但从日志来看&#xff0c;则是1秒钟请求一次&#xff…...

【前端知识】nodejs项目配置package.json深入解读

package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件&#xff0c;它位于项目的根目录下&#xff0c;并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...

XGBOOST算法Python实现(保姆级)

摘要 XGBoost算法&#xff08;eXtreme Gradient Boosting&#xff09;在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…...

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…...

输出比较简介

输出比较简介 主要是用来输出PWM波形&#xff0c;这个波形是驱动电机的&#xff08;智能车和机器人等&#xff09;必要条件 OC&#xff08;Output Compare&#xff09;输出比较&#xff0c;还有IC&#xff0c;全称是Input Capture&#xff0c;意为输入捕获&#xff0c;还有CC…...

什么是反向 DNS 查找以及它的作用是什么?

反向DNS查询&#xff08;rDNS&#xff09;是一种技术&#xff0c;用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时&#xff0c;实际上是向域名系统&#xff08;DNS&#xff09;的特殊部分请求信息&#xff0c;这部分被称为PTR记录。PTR记录会返回与这个I…...

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…...

[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案

问题log /tmp/ccByifPx.o: In function main: read.c:(.text0x1a): undefined reference to shm_open read.c:(.text0xd9): undefined reference to shm_unlink collect2: error: ld returned 1 exit status 程序代码 #include <stdio.h> #include <stdlib.h> #…...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…...

DimensionX 部署笔记

目录 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; DimensionX 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; 可以生成&#xff0c;从左向右旋转的&#xff0c;也可以生成从上往下旋转的&#xff1a; import torch from diffusers import CogVideoXImageToVideo…...

django从入门到精通(五)——表单与模型

好的&#xff0c;下面将详细介绍 Django 的表单与模型&#xff0c;包括它们的定义、使用、如何在 Django Admin 中结合使用&#xff0c;以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类&#xff0c;用于定义数据库中的数据结…...

C语言Day 03 学习总结

Day 03 学习总结 流程控制语句 顺序结构 程序从上到下依次执行。每一条语句顺序执行&#xff0c;直到结束。 选择结构 程序根据条件选择执行某一条分支。包括 if-else 和 switch-case。 循环结构 程序反复执行某段代码。包括 for、while、do-while。 跳转结构 控制程序直接跳…...

kafka中是如何快速定位到一个offset的

定位到具体的segment日志文件&#xff0c;采用二分法先定位到index索引文件计算查找的offset在日志文件的相对偏移量 1、分区和日志段&#xff1a; 每个主题的分区&#xff08;Partition&#xff09;被划分为多个日志段&#xff08;Log Segment&#xff09;。每个日志段是一个…...

视频对接rtsp协议学习

RTSP协议在视频平台中的应用‌ RTSP&#xff08;Real Time Streaming Protocol&#xff09;是一种基于TCP/IP的应用层协议&#xff0c;主要用于控制流媒体数据的传输和播放。它通过定义一系列命令和请求&#xff0c;实现对流媒体服务器的远程控制&#xff0c;但不传输媒体数据…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...