Spring Boot 项目 myblog 整理
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 层来处理业务逻辑,将控制器层的职责简化为参数验证与返回结果的封装,确保代码的可维护性和扩展性。
相关文章:
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.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程ÿ…...
Mesh路由组网
Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...
LeetCode131:分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码如下: class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...
详细解析 devmem 命令:在 Linux 系统中直接访问内存的利器
目录 什么是 devmem?为什么需要 devmem?devmem 命令的基本语法devmem 在硬件调试中的应用安全性与风险devmem 的常见应用示例结论 在嵌入式系统开发和硬件调试中,开发者经常需要直接与硬件打交道,访问和修改内存中某些特定区域的内…...
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时,突然发现它的一个接口,被另一个服务ip频繁的请求。 按理说,之前设置的是,每隔1分钟请求一次接口。但从日志来看,则是1秒钟请求一次ÿ…...
【前端知识】nodejs项目配置package.json深入解读
package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件,它位于项目的根目录下,并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...
XGBOOST算法Python实现(保姆级)
摘要 XGBoost算法(eXtreme Gradient Boosting)在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…...
JDK、MAVEN与IDEA的安装与配置
1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境,使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载: MAVEN下载传送…...
输出比较简介
输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…...
什么是反向 DNS 查找以及它的作用是什么?
反向DNS查询(rDNS)是一种技术,用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时,实际上是向域名系统(DNS)的特殊部分请求信息,这部分被称为PTR记录。PTR记录会返回与这个I…...
集群聊天服务器(13)redis环境安装和发布订阅命令
目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…...
[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 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一,结合Miniconda可以轻松管理安装和依赖项。在这篇文章中,我们将详细介绍如何使用Miniconda在Linux、mac…...
DimensionX 部署笔记
目录 生成视频用CogVideoX-5b-I2V 推理代码: DimensionX 生成视频用CogVideoX-5b-I2V 推理代码: 可以生成,从左向右旋转的,也可以生成从上往下旋转的: import torch from diffusers import CogVideoXImageToVideo…...
django从入门到精通(五)——表单与模型
好的,下面将详细介绍 Django 的表单与模型,包括它们的定义、使用、如何在 Django Admin 中结合使用,以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类,用于定义数据库中的数据结…...
C语言Day 03 学习总结
Day 03 学习总结 流程控制语句 顺序结构 程序从上到下依次执行。每一条语句顺序执行,直到结束。 选择结构 程序根据条件选择执行某一条分支。包括 if-else 和 switch-case。 循环结构 程序反复执行某段代码。包括 for、while、do-while。 跳转结构 控制程序直接跳…...
kafka中是如何快速定位到一个offset的
定位到具体的segment日志文件,采用二分法先定位到index索引文件计算查找的offset在日志文件的相对偏移量 1、分区和日志段: 每个主题的分区(Partition)被划分为多个日志段(Log Segment)。每个日志段是一个…...
视频对接rtsp协议学习
RTSP协议在视频平台中的应用 RTSP(Real Time Streaming Protocol)是一种基于TCP/IP的应用层协议,主要用于控制流媒体数据的传输和播放。它通过定义一系列命令和请求,实现对流媒体服务器的远程控制,但不传输媒体数据…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
