# SpringBoot3-PN **Repository Path**: gitben123/SpringBoot3-PN ## Basic Information - **Project Name**: SpringBoot3-PN - **Description**: 基于老杜的SpringBoot3视频搭建的学习项目 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-10 - **Last Updated**: 2025-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ssm ### 介绍 项目技术栈:java8、springboot2.5、mybatis-plus3、hutool、baomidou动态数据库、swagger2 redis、ftp、RabbitMq、druid、Prometheus监控、easyexcel、poi、openpdf

数据库:mysql8(测试完善)、postgresql(支持但未测试)、oracle(支持但未测试)

一定要按照本文文档去操作,下文的“准备工作”、“怎么启动”、“导入apifox”,这三部分非常重要, 尽量安装好相关软件(非必须),配置好mysql数据库环境(必须!postgresql和oracle也有适配,但没有测试过,可能会报错), 导入相关的表结构和数据(必须)。 否则项目运行大概率会报错!!! 项目中加入大量日志方便调试,切换环境到 prod可以减少部分日志打印。 ### 准备工作 尽量安装以下软件,当然不安装也可以正常启动,只是相关组件功能会用不了: ftp、prometheus和Grafana、erlang和RabbitMq、redis和rdm, 下面提供windows版百度网盘链接: https://pan.baidu.com/s/1sz517TO_McBx9AuG18n8qw?pwd=2u5c 提取码: 2u5c 如果图片显示不了,需要去安装IDEA的一个插件markdown editor,然后点击底部,从 markdown split editor选项切换到markdown editor即可 ### 怎么启动 1. 确保mysql服务已经启动且可以访问数据库 2. 找到 SqlRunnerMain类,配置好url和账号密码,直接运行main方法 ![img.png](ssm/readImg/run1.png) 3. 找到application-dev.yml文件,配置好url和账号密码 ![img.png](ssm/readImg/run2.png) 4. 运行启动类SsmApplication ![img.png](ssm/readImg/run3.png) 5. (可选)安装windows版redis且启动redis服务,否则会采用降级登录方式 6. (可选)安装windows版RabbitMq且启动RabbitMq服务,否则mq会失效 ### 导入apifox 找到根目录下apifoxJson文件夹下面的test.apifox.json文件, 导入到apifox或postman中,用来模拟前端发送请求 ### 功能简介 #### 登录 登录时生成AES加密后的token,除了登录接口和其他一些特殊接口外,发请求时 请求头必须要携带token,以便后端进行校验 ![img.png](ssm/readImg/login1.png) #### 发起其他请求 ![img.png](ssm/readImg/login2.png) ![img.png](ssm/readImg/login3.png)
#### 模仿Mybatisplus的自动代码生成类 找到GenMySqlCode,配置好信息可自动生成代码,生成通用增删改查、导入和导出(基于easyexcel) 接口 ![img.png](ssm/readImg/genCode1.png)

#### 自实现表测试数据生成工具类 找到PureJdbcTestDataGenerator, 配套的词库配置在resources 目录下的lexicon_config.properties, main方法入口出配置好需要生成测试数据的表名和测试数据条数,可配置多个。 首次运行会在项目根目录下生成 表名_config.txt配置文件,根据详细说明理解清楚 各项配置后,根据需要调整配置信息,再次运行main方法即可 ![img.png](ssm/readImg/genData1.png) ![img.png](ssm/readImg/genData2.png) ![img.png](ssm/readImg/genData3.png) ![img.png](ssm/readImg/genData4.png)

#### 自实现表定时备份DDL及其数据类 在task目录下找到TableExportScheduledTask定时任务类,配置文件中 ```yaml export: backupSQL: D:/sql_exports backupSQLMaxRows: -1 # 每个表导出的数据条数,-1 表示导出全部,>0 表示导出指定条数,默认 100 rowsPerFile: 1000 paginationType: new # 或 old sql备份分页类型 ```

#### 注入pdf生成器来导出pdf 找到PdfGenerator,直接运行main方法可以生成pdf样板。具体用法参考TestPdfGenerator, 后续需要生成自定义pdf只需复制粘贴PdfGenerator,在其基础上修改即可
pdf可添加水印、盖章和页码 ![img.png](ssm/readImg/pdf.png) ![img.png](ssm/readImg/pdf3.png) 注意修改生成器中的必要参数 ![img.png](ssm/readImg/pdf2.png)

#### 自定义sql打印拦截器和日志定制切面类 找到 SqlPrintInterceptor,该类会打印大量sql调试日志; 找到 LoggingAspect,该类会打印请求头,请求体,响应体等详细信息。 在各个环境配置文件中找到 ```yaml #自定义sql详细日志打印和请求头、响应结果日志打印开关 myLog: sqlPrint: enable: false aroundLog: enable: false ``` 来控制是否生效

#### 引入swagger2 项目启动后浏览器输入 http://localhost:8080/swagger-ui.html#/ 即可查看接口api文档 ![img.png](ssm/readImg/swagger.png)

#### 引入springboot集成javaMail依赖 详情见application.yml的mail部分配置,username为qq邮箱发件人的邮箱账号,password为授权码 ##### 授权码获取步骤: 1. 登录 QQ 邮箱网页版 2. 点击页面右上角 【设置】 3. 进入 【账户】 选项卡 4. 找到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务” 一栏 5. 查看 SMTP 服务 是否已开启: 如果显示 “未开启”,点击 “开启”, 系统会要求你 验证手机号,按照提示发送短信, 验证成功后,会生成一个 16 位 SMTP 授权码 6. 把这个 16 位授权码保存好!以后你在程序中配置 SMTP 密码时,就填它,而不是 QQ 密码! ##### 登录用户设置邮箱: h5_userinfo表的备用字段param3为用户邮箱,填入该用户的qq邮箱即可在登录后收到邮件 ![img.png](ssm/readImg/email1.png) ![img.png](ssm/readImg/email2.png)

#### 引入druid数据源 项目启动后浏览器输入 http://localhost:8080/druid/ 可访问数据库监控后台,登录账号密码见配置文件(默认admin/123456) ![img.png](ssm/readImg/druid.png)

#### 引入Prometheus和grafana集成JVM监控后台 ###### Prometheus安装 1. 解压 2. 修改prometheus.yml文件中scrape_configs:为 ```yaml scrape_configs: - job_name: 'spring-boot-app' metrics_path: '/actuator/prometheus' # 必须是这个路径 static_configs: - targets: ['localhost:8080'] # 你的 Spring Boot 应用地址 ``` 3. 点击prometheus.exe运行prometheus服务。 4. 登录Grafana面板后,浏览器输入 http://localhost:3000 5. 连接->数据源->Connection:Prometheus server URL 处填入 http://localhost:9090 6. 点击保存并测试 7. 首页的同一行,右侧点击 + 号,导入仪表板,输入4701,加载模版,选择数据库后即可 ###### grafana安装 1. 点击msi安装 2. 浏览器输入 http://localhost:3000 3. 设置中文: 在 grafana默认配置 grafana安装目录/conf/defaults.ini 中,将default_language = en-US改为 zh-Hans即可 4. 重新登录 ###### 启动 安装并且设置完prometheus和Grafana后,先启动项目,再启动prometheus 然后浏览器输入 http://localhost:3000,登录Grafana后台,账号密码都是admin ![img.png](ssm/readImg/jvm1.png) ![img.png](ssm/readImg/jvm2.png) ![img.png](ssm/readImg/jvm3.png)

#### 引入RabbitMq ###### erlang安装和RabbitMq安装 1. 先安装erlang 2. 配置erlang环境变量,path路径配置到erlang的bin目录 3. rabbitMq安装后,到D:\RabbitMQ\rabbitmq_server-3.7.9\sbin目录下cmd 4. 输入rabbitmq-plugins enable rabbitmq_management 5. 最后出现started 3 plugins即成功

###### 启动 项目启动后浏览器输入 http://localhost:15672/ 可访问RabbitMq后台,登录账号密码见配置文件(默认guest/guest) ![img.png](ssm/readImg/rabbitMq.png)

###### 服务降级 如果没安装RabbitMQ或RabbitMQ服务中断,mq相关功能自动屏蔽,不需重启项目 ![img.png](ssm/readImg/rabbitMq1.png) 当RabbitMQ服务恢复时,mq相关功能隔一段时间(由配置参数决定)自动恢复,不需重启项目 ![img_1.png](ssm/readImg/rabbitMq2.png) ![img_2.png](ssm/readImg/rabbitMq3.png) #### 引入redis ###### redis安装 打开windows版redis的安装目录,找到 redis.windows.conf 和 redis.windows-service.conf 在最后一行添加 requirepass 123 那么密码就是123 然后win键+r,输入services.msc,找到redis服务重启 ![img.png](ssm/readImg/redis.png)

###### redis说明 自定义实现通用方法,基于RedisService类,另外新建一个RedisServiceWithFallback类,包装 了RedisService,实现降级容灾的功能。当redis连接不上时,会启用降级处理,去查数据库而不是 redis

###### redis停机后的降级处理 win键+r,输入services.msc,找到redis且关掉redis服务后,启动项目 ![img.png](ssm/readImg/redisStop1.png) ![img.png](ssm/readImg/redisStop2.png)

#### 引入自定义日志 LoggingAspect使用日志切面,主要打印请求头、请求体、响应内容、响应时间等参数。 同时日志会被持久化到本地

#### 引入多环境配置 分为dev、test和prod,prod不会打印自定义sql日志

#### 引入全局异常处理 GlobalExceptionHandler #### 后续更新计划 1. 上传一个图片到后端,自动识别其中的英文,并且翻译为中文文本 2. 测试数据生成器,增加 可设置主表和子表同时添加随机数据,主外键数据字段数据相同 3. pdf基于模板导出增加选用JasperReports 4. 尝试写一套流程,模拟双方证书文件和私钥文件,加密报文传送,接受报文解密后返回, 报文格式同时实现xml和json,涉及数字签名,验签,同时实现http传输和socket传输, (已实现,待实现子模块) 肯定需要多加一个类似处理报文的子模块。该报文系统基于诺依框架搭建,主要用作报文的 发送、 接收、展示 报文组成:message_id: 报文唯一标识符(UUID)、timestamp: 时间戳(发送时间)、encoding: 编码格式(如UTF-8) 、msg_type: 报文类型(不同类型表示报文内容组成不同,即字段不同)、payload: 实际业务数据(JSON/XML格式)、content: 报文内容、 attachment: 附件信息(base64编码)、status: 报文状态(新建/已发送/已接收/处理完成) retry_count: 发送重试次数、ack_required: 是否需要回执