Jenkins 自动化部署前后端分离若依项目全攻略:涵盖环境配置、Maven/Node.js 工具安装、GitLab 项目协同,及前后端构建、服务器推送与代码更新验证全步骤
提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
Jenkins前后端分离若依
- 前言
- 一、若依介绍
- 1.1 若依是什么
- 1.2 运维为什么要学习部署若依项目
- 1.3 若依动静分离典型架构
- 二、环境介绍
- 三、安装服务
- 3.1 安装软件
- 3.2 jenkins安装maven,node.js
- 3.3 jenkins安装相关插件
- 3.4 前端服务器环境配置
- 3.5 后端服务器环境配置
- 四、项目准备
- 4.1 gitlab新建项目test-ruoyi-vue
- 4.2 配置若依数据库
- 4.2.1 拉取若依项目
- 4.2.2 配置mysql
- 4.2.3 配置redis
- 4.3 推送项目
- 五、Jenkins构建前端项目
- 5.1 jenkins发送公钥
- 5.2 配置私钥
- 5.3 配置jdk
- 5.4 新建项目test-ruoyi-vue
- 5.5 配置test-ruoyi-vue
- 5.6 拉取测试
- 5.7 身份认证一直错误
- 5.8 配置node.js工具
- 5.9 添加前端SSH Server
- 5.10 test-ruoyi-vue配置node.js
- 5.11 构建测试
- 六、Jenkins构建后端项目
- 6.1 配置maven工具
- 6.2 添加后端SSH-Server
- 6.3 添加后端脚本
- 6.4 新建项目test-ruoyi-vue-backend
- 6.5 配置test-ruoyi-vue-backend
- 6.6 构建测试
- 七、后续测试
- 7.1 访问页面
- 7.2 代码迭代
前言
如果不懂Jenkins
https://blog.csdn.net/m0_63756214/article/details/155387987?spm=1001.2014.3001.5501
一、若依介绍
1.1 若依是什么
若依是国内最主流的企业级前后端分离开源脚手架,核心定位是「快速搭建中小型业务系统 / 后台管理系统的一站式解决方案」,而非单纯的 “框架”—— 它基于 SpringBoot(后端)+ Vue/React(前端)构建,内置了企业开发中 90% 以上的通用功能,本质是 “开箱即用的项目骨架”
1.2 运维为什么要学习部署若依项目
若依是企业级前后端分离项目的最小通用模型;不用深入写若依的业务代码,重点掌握 “前端打包部署 + 后端 Jar 包运维 + Nginx 配置 + Jenkins 自动化 + 多环境隔离”,就能搞定 90% 的若依部署需求,且这些技能可直接迁移到其他前后端分离项目
1.3 若依动静分离典型架构
若依前端(RuoYi-Vue)
前端执行 npm run build:prod 打包生成的 dist 目录(包含 index.html、js、css、img 等);
部署位置:上传到 Nginx 的静态资源目录;
若依后端(Ruoyi-admin)
若依后端打包为 Jar 包,通过 systemd 或脚本托管运行;后端不再直接处理静态资源请求,专注于处理动态请求,如API调用和业务处理
反向代理层(Nginx 核心)
核心作用:屏蔽后端服务器地址,统一请求入口,同时解决前后端跨域问题;
关键逻辑:用户所有请求都先到 Nginx,由 Nginx 判断 “静态 / 动态” 后分流,后端服务器无需暴露公网 IP,提升安全性
数据层(中间件)
MySQL:若依的用户、角色、菜单、业务数据存储,建议开启主从(生产环境)
Redis:若依的会话存储、字典缓存、接口限流,需保证高可用(如哨兵模式)
二、环境介绍
部署前最好先同步时间,关闭防火墙或者开启相应端口
以下服务中,未标注版本的可直接下载;标注版本的也无需严格对应(仅 Jenkins、JDK、Tomcat、Node.js、Maven 存在版本关联)
| 主机名 | IP地址 | 最低配置 | 运行服务 | 作用 |
|---|---|---|---|---|
| gitlab | 192.168.136.10 | 2cpu,内存最少3G | gitlab | 为developer提供代码推送/拉取服务,为jenkins提供源码拉取地址 |
| developer | 192.168.136.20 | 1cpu,内存0.5G即可 | git | 模拟开发者修改代码,修改后的代码推送至gitlab远程仓库 |
| jenkins | 192.168.136.30 | 2cpu,内存最少3G | jenkins2.504.2,jdk 17,git,tomcat10.1.49,maven3.9.11,node.js16.20.2 | 核心调度节点,从gitlab拉取代码,打包后分别推送至frontend、backend主机,依赖mysql/redis提供服务支撑 |
| frontend | 192.168.136.134 | 1cpu,内存1G即可 | nginx | 部署前端静态资源,通过nginx对外提供访问,依赖backend提供接口服务 |
| backend | 192.168.136.135 | 1cpu,内存1G即可 | jdk17,mysql连接工具,redis连接工具 | 部署后端服务,依赖mysql存储业务数据,依赖redis实现缓存功能 |
| mysql | 192.168.136.138 | 1cpu,内存1G即可 | mysql | 仅为backend提供数据库服务 |
| redis | 192.168.136.139 | 1cpu,内存0.5G即可 | redis | 为backend提供缓存服务 |

三、安装服务
3.1 安装软件
本文不涉及软件安装操作演示,相关安装指引请查阅下方文章。后续的所有配置环节,我会为大家进行细致说明
如果对gitlab安装不了解的小伙伴可以看这篇文章
https://blog.csdn.net/m0_63756214/article/details/155531211?spm=1001.2014.3001.5501
要求:有gitlab的账号密码,并能正常登录
如果对jenkins安装不了解的小伙伴可以看这篇文章
https://blog.csdn.net/m0_63756214/article/details/155387987?spm=1001.2014.3001.5501
要求:有Jenkins的账号密码,并能正常登录
如果对nginx安装不了解的小伙伴可以看这篇文章
https://blog.csdn.net/m0_63756214/article/details/151998566?spm=1001.2014.3001.5502
要求:能正常启动nginx,并能访问初始页面即可
如果对mysql安装不了解的小伙伴可以看这篇文章
https://blog.csdn.net/m0_63756214/article/details/154007206?spm=1001.2014.3001.5502
要求:需要有mysql的账号密码,并能正常登录
如果对redis安装不了解的小伙伴可以看这篇文章
https://blog.csdn.net/m0_63756214/article/details/154868788?spm=1001.2014.3001.5502
要求:能正常登录redis,PING-PONG成功即可
3.2 jenkins安装maven,node.js
Maven官网:https://maven.apache.org/
Node.js官网:https://nodejs.org/zh-cn/download
#下载maven,node.js我是直接下载到了电脑上,上传到本机的
[root@jenkins ~]# wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz
[root@jenkins ~]# ls
apache-maven-3.9.11-bin.tar.gz apache-tomcat-10.1.49.tar.gz jenkins.war jdk-17.0.17_linux-x64_bin.tar.gz node-v16.20.2-linux-x64.tar.xz
[root@jenkins ~]# tar xf apache-maven-3.9.11-bin.tar.gz -C /usr/local/java/
[root@jenkins ~]# mv /usr/local/java/apache-maven-3.9.11/ /usr/local/java/maven
[root@jenkins ~]# tar xf node-v16.20.2-linux-x64.tar.xz -C /usr/local/
[root@jenkins ~]# mv /usr/local/node-v16.20.2-linux-x64/ /usr/local/node
[root@jenkins ~]# vim /etc/profile #添加环境变量
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/usr/local/java/maven
export NODE_HOME=/usr/local/node
export NODE_PATH=$NODE_HOME/lib/node_modules/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$NODE_HOME/bin:$PATH
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# mvn -v #一定要能显示版本,查看maven版本Java项目构建工具
Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)
Maven home: /usr/local/java/maven
Java version: 17.0.17, vendor: Oracle Corporation, runtime: /usr/local/java
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
[root@jenkins ~]# node -v #查看node.js版本;js运行环境
v16.20.2
[root@jenkins ~]# npm -v #查看npm版本;node.js包管理工具
8.19.4
[root@jenkins ~]#
3.3 jenkins安装相关插件
除了jenkins的自定义插件,这里还需要下载一些额外的插件,插件安装好后最好重启jenkins
Maven 相关插件:用于后端项目的编译与打包操作
NodeJS 相关插件:实现前端项目的编译与打包流程
Deploy 相关插件:支持将代码自动化部署至 Tomcat 服务器
Git 相关插件:保障与 GitLab 代码仓库的拉取、提交等版本控制操作
SSH 相关插件:通过 SSH 协议完成服务器间的文件传输与远程命令执行



3.4 前端服务器环境配置
#frontend机器
root@frontend:~# systemctl restart nginx
root@frontend:~# mkdir -p /opt/project/ruoyi/logs
# Jenkins打包前端代码的存放目录:需先创建/ruoyi/ruoyi-ui
root@frontend:~# mkdir -p /ruoyi/ruoyi-ui # 因Jenkins打包时会附带dist目录,无需手动创建dist
root@frontend:~# vim /etc/nginx/nginx.conf #修改配置文件
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
server {
listen 80;
server_name _;
charset utf-8;
root /ruoyi/ruoyi-ui/dist;
index index.html index.htm;
location /prod-api {
rewrite ^/prod-api/(.*)$ /$1 break;
proxy_pass http://192.168.136.135:8080/; #填写后端服务器ip:8080
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
location / {
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location ~ /. {
deny all;
}
}
}
3.5 后端服务器环境配置
#backend机器
root@backend:~# ls
jdk-17.0.17_linux-x64_bin.tar.gz
root@backend:~# tar xf jdk-17.0.17_linux-x64_bin.tar.gz -C /usr/local
root@backend:~# mv /usr/local/jdk-17.0.17/ /usr/local/java
root@backend:~# vim /etc/profile #添加Java环境变量
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
root@backend:~# source /etc/profile
root@backend:~# java --version #一定要看到版本
java 17.0.17 2025-10-21 LTS
Java(TM) SE Runtime Environment (build 17.0.17+8-LTS-360)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.17+8-LTS-360, mixed mode, sharing)
#因为后端服务器会连接mysql,redis来进行交互,所以一定要有它们的连接工具
root@backend:~# apt install mariadb-client-core-10.1 #下载连接工具;centos用yum -y install mysql
root@backend:~# apt -y install redis-tools #下载redis连接工具;centos yum -y install redis
root@backend:~# mkdir /opt/ruoyi-java 后端服务器jar包存放路径
四、项目准备
现在我们要做的就是:
先在 GitLab 建好test-ruoyi-vue项目,把 Gitee 上的若依项目拉取下来并配置好 MySQL、Redis,再推送至 GitLab,为 Jenkins 拉取代码做准备
4.1 gitlab新建项目test-ruoyi-vue
登录gitlab


此时有了新创建的项目test-ruoyi-vue

4.2 配置若依数据库
4.2.1 拉取若依项目
#developer机器
[root@developer ~]# git clone https://gitee.com/y_project/RuoYi-Vue.git #拉取若依开源项目
[root@developer ~]# ls
RuoYi-Vue
4.2.2 配置mysql
#developer机器
#若依的sql脚本在源码的sql目录下,包含两个核心文件
[root@developer ~]# ls RuoYi-Vue/sql/
quartz.sql ry_20250522.sql
[root@developer ~]# scp RuoYi-Vue/sql/* 192.168.136.138:/root #拷贝给mysql数据库机器
#mysql机器
root@mysql:~# mysql -uroot -p'Admin@123'
mysql> CREATE DATABASE ruoyi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; #创建ruoyi数据库,待会把数据导入到此
mysql> quit
root@mysql:~# ls
quartz.sql ry_20250522.sql
root@mysql:~# mysql -uroot -p'Admin@123' ruoyi < ry_20250522.sql #导入数据
root@mysql:~# mysql -uroot -p'Admin@123' ruoyi < quartz.sql #导入数据
root@mysql:~# mysql -uroot -p'Admin@123'
mysql> use ruoyi ; show tables; #去ruoyi库中看看有没有成功导入数据
mysql> GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi'@'%' IDENTIFIED BY 'Ruoyi@123'; #创建一个用户
#后端机器测试能否连接
root@backend:~# mysql -u'ruoyi' -p -h 192.168.136.138
Enter password: #输入密码
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ruoyi |
+--------------------+
2 rows in set (0.08 sec)
#developer机器
[root@developer ~]# vim RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml #修改若依项目的mysql配置

4.2.3 配置redis
#redis机器
root@redis:/data/application/redis# nohup src/redis-server redis.conf & #后台重启redis
root@redis:/data/application/redis# src/redis-cli 进入redis
127.0.0.1:6379> ping
PONG
#后端机器测试能否连接
root@backend:~# redis-cli -h 192.168.136.139 -p 6379
192.168.136.139:6379> ping
PONG
192.168.136.139:6379> exit
#developer机器
[root@developer ~]# vim RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml #修改redis配置,填写ip地址和密码

4.3 推送项目

#developer机器
[root@developer ~]# git clone http://192.168.136.10/root/test-ruoyi-vue.git #拉取test-ruoyi-vue空项目
[root@developer ~]# ls
RuoYi-Vue test-ruoyi-vue
[root@developer ~]# cp -r RuoYi-Vue/* test-ruoyi-vue/
[root@developer ~]# cd test-ruoyi-vue/
[root@developer test-ruoyi-vue]# git add * #提交到暂存区
[root@developer test-ruoyi-vue]# git commit -m "初始版本" #提交到本地仓库
[root@developer test-ruoyi-vue]# git push origin #提交到远程仓库
可以看到若依项目已经成功推送到我们自己的gitlab仓库中了

五、Jenkins构建前端项目
现在我们要做的就是:
1,让 Jenkins 生成密钥对,将生成的公钥分别发送至 GitLab 和后端服务器,同时把私钥配置到 Jenkins 上;
2,在 Jenkins 中新建项目test-ruoyi-vue,并完成该项目的相关配置,保证项目代码能成功拉取到 Jenkins 本地默认工作目录.jenkins/workspace/
3,对拉取到本地的项目前端代码进行打包操作,并将打包产物发送至专门的前端代码接收服务器frontend
5.1 jenkins发送公钥
[root@jenkins ~]# ssh-keygen #一直回车,生成密钥对
[root@jenkins ~]# ls .ssh/
id_rsa id_rsa.pub
#GitLab 需要验证 “是不是合法的 Jenkins 来拉代码”,所以 GitLab 存着 Jenkins 的公钥
[root@jenkins ~]# cat .ssh/id_rsa.pub #复制公钥到gitlab上
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDG/l6ockNK+ZUIXdAVb6jZetMQWD24KniFe+bPqXgWWOkzrq1qafvPhWfwNMf4Gaxdu9WftKvQARQUyDoGOZYT2RB+aCkXo5ZRFuGDHlN+pclAahiAoKvqhj7LxEd029t4iqTxBy33ySqVCWjrGlki+s05RlRR7UofNix4q/+emsezfuMAEBfzQYtw6OESRtPryRvpRGVtx5QxNp46Skfm9NWw0Yjip1dL5h804fbz5xpecS/JrS2qPICvWmB0kFFVz0xiUpuNF+UF0jsfsnN6SSh4vHDpMkdHFiMKV/MN/nNPkQn6Uc8Zot7KqlU2y6juAwCVFvlyuhYQYVsi1TRJ root@jenkins
#可以顺便把公钥拷贝给前后端服务器
#后端服务器需要验证 “是不是合法的 Jenkins 来推送打包文件”,所以后端服务器存着 Jenkins 的公钥
[root@jenkins ~]# ssh-copy-id root@192.168.136.134 #拷贝给前端服务器
[root@jenkins ~]# ssh-copy-id root@192.168.136.135 #拷贝给后端服务器
打开gitlab,按下图操作粘贴公钥


5.2 配置私钥
当 GitLab / 后端服务器需要验证 Jenkins 身份时,Jenkins 需要用私钥做加密响应,证明 “我是可信的 Jenkins”,所以要把私钥配置到Jenkins上
选择“Manage Jenkins”

下拉找到“System”

下拉找到“Publish over SSH”;点击“Save”是保存并退出,点击“应用”是保存

5.3 配置jdk
选择“Manage Jenkins”

下拉找到“Tools”

下拉找到"JDK安装"

5.4 新建项目test-ruoyi-vue


5.5 配置test-ruoyi-vue
下拉找到“Discard old builds”

去gitlab上复制SSH的拉取代码

找到“源码管理”



5.6 拉取测试



#Jenkins 已经完成了代码拉取和代码检出操作,出现在指定的工作空间/root/.jenkins/workspace/test-ruoyi-vue中
[root@jenkins ~]# ls .jenkins/workspace/test-ruoyi-vue #成功拉取代码
bin LICENSE README.md ruoyi-common ruoyi-generator ruoyi-system ry.bat sql
doc pom.xml ruoyi-admin ruoyi-framework ruoyi-quartz ruoyi-ui ry.sh
5.7 身份认证一直错误
如果按照我的步骤操作下来,此处还是报错,可以检查一下自己的公私钥是否粘贴正确;用户名称是否填写正确;排除以上错误还是报错,可以试一下下面的方法

选择“Manage Jenkins”

下拉找到“Security”

下拉找到“Host Key Verification Strategy”

保存后,试着构建一次看看还有没有错误
5.8 配置node.js工具

下拉找到“Tools”

下拉找到“NodeJS”,没找到就是没有安装node.js的相关插件,填写完毕后点击“Save”

5.9 添加前端SSH Server
然后下拉找到“System”点击,然后下拉找到“SSH Server”

5.10 test-ruoyi-vue配置node.js

下拉找到“Build Steps”,选择执行shell,这些语句是在Jenkins上执行的


5.11 构建测试
构建测试一下,看能不能成功

六、Jenkins构建后端项目
现在我们要做的就是:
1,基于前文已实现的 “Jenkins 将代码拉取至默认工作目录.jenkins/workspace/” 这一前提,在 Jenkins 中新建项目test-ruoyi-vue-backend
2,配置该 Jenkins 项目,使其具备将拉取到本地的项目后端代码打包并推送至后端服务器backend的能力
3,在backend服务器上部署脚本,用于检测若依服务的相关状态(如运行、端口、进程等)
6.1 配置maven工具

下拉找到“Tools”

下拉找到“Maven”,没找到就是没有安装maven的相关插件

6.2 添加后端SSH-Server

下拉找到“SSH Server”,再添加一个

6.3 添加后端脚本
root@backend:~# vim /opt/ruoyi-java/java.sh
#!/bin/bash
# 若依后端启动/重启脚本
# 配置项(根据实际情况修改)
APP_NAME="ruoyi-admin"
JAR_PATH="/opt/ruoyi-java/ruoyi-admin.jar"
LOG_PATH="/opt/ruoyi-java/logs/ruoyi-admin.log" # 日志路径,需确保目录存在
JAVA_PATH="/usr/local/java/bin/java"
PORT=8080 # 后端服务端口,用于检测是否被占用
# 创建日志目录(如果不存在)
mkdir -p $(dirname $LOG_PATH)
# 1. 查找并关闭旧进程
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 发现若依后端服务PID: $ruoyi_pid,正在关闭 ====="
kill -15 $ruoyi_pid
# 等待5秒,让旧进程完全退出
sleep 5
# 检查是否还存在进程,若存在则强制杀死
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 旧进程未正常退出,强制杀死 ====="
kill -9 $ruoyi_pid
sleep 2
fi
echo "===== 若依后端服务已关闭 ====="
fi
# 2. 检测端口是否被占用
port_pid=$(lsof -i:$PORT | grep -v "PID" | awk '{print $2}')
if [[ -n $port_pid ]]; then
echo "===== 端口$PORT被占用(PID: $port_pid),强制释放 ====="
kill -9 $port_pid
sleep 2
fi
# 3. 启动新服务(添加JVM内存参数,根据服务器配置调整),-Dspring.redis.host后面接redis ip
echo "===== 正在启动若依后端服务 ====="
nohup $JAVA_PATH -Xms512m -Xmx1024m -Djava.awt.headless=true -Dsun.font.path=/usr/share/fonts -Dspring.redis.host=192.168.136.139 -jar $JAR_PATH > $LOG_PATH 2>&1 &
# 等待3秒,让服务启动
sleep 3
# 4. 检查启动是否成功
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 若依后端服务启动成功,PID: $ruoyi_pid ====="
echo "日志路径: $LOG_PATH"
else
echo "===== 若依后端服务启动失败,请查看日志: $LOG_PATH ====="
exit 1
fi
root@backend:~# chmod +x /opt/ruoyi-java/java.sh #给脚本执行权限
6.4 新建项目test-ruoyi-vue-backend

6.5 配置test-ruoyi-vue-backend

同样去gitlab上复制ssh代码

在test-ruoyi-vue-bakcend中找到"源码管理"

下拉找到“Build Steps”,选择执行shell,这些语句是在Jenkins上执行的


6.6 构建测试


七、后续测试
7.1 访问页面
输入前端ip就可以看到下面的页面
注:不要扫页面右下角出现的付款码,此码不是本人的,谨防别骗!!!

7.2 代码迭代
目前的页面是现在这样

模拟开发人员修改代码,然后推送都远程仓库,然后直接在Jenkins上构建,看能不能成功
#开发人员
[root@developer ~]# git clone http://192.168.136.10/root/test-ruoyi-vue.git #拉取代码
[root@developer ~]# ls
test-ruoyi-vue
[root@developer ~]# cd test-ruoyi-vue/
[root@developer test-ruoyi-vue]# vim ruoyi-ui/src/views/index.vue #修改前端页面

[root@developer test-ruoyi-vue]# git add *
[root@developer test-ruoyi-vue]# git commit -m "修改了前端页面"
[root@developer test-ruoyi-vue]# git push origin
由于我们之前已经配置好了,现在只需要直接构建即可


访问页面,发现已经更新了

注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
后续会出若依项目没有验证码的相关问题,感兴趣的小伙伴可以蹲一下,大概一天后就发文章
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~










