ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

快速开发平台实战:5分钟搭建Spring Boot后端管理系统

快速开发平台实战:5分钟搭建Spring Boot后端管理系统 1. 为什么说它是快速开发神器1.1 它到底解决什么问题在Java后端圈子泡了这么多年我见过太多团队从零搭项目的样子建个Spring Boot骨架写用户、角色、菜单这三张表再配上登录鉴权往往就要花掉两个星期。等真正开始做业务时间已经烧掉一大半。更别提还要应付分页查询、代码生成、数据字典、操作日志这些重复劳动。所以当我第一次在GitHub上刷到那款斩获55.7k star的开源快速开发平台时第一反应是——这不就是我一直想要的“后端脚手架plus”吗我说的这类平台业内常见的有芋道yudao、若依RuoYi等。它们本质上是一套“开箱即用的后端管理体系”用户、角色、菜单、部门、岗位、字典这类后台标配功能全给你写好再加一个能根据数据库表结构自动生成Controller/Service/DAO/Vue页面的代码生成器。你拿到手之后不用从零考虑权限怎么设计、部门树怎么存、登录Token怎么刷新直接把精力放在业务表上就行。适合谁我觉得四类人最受益中小型项目的开发人员要快速交付MVP没时间天天写CRUD。接外包或做私活的全栈工程师一个晚上就能搭出管理后台。刚工作不久的后端新人想看看一款成熟项目怎么组织代码、怎么处理权限。团队Leader想统一团队技术规范减少重复劳动。一句话总结它把后端项目里“既绕不开、又不值得反复造轮子”的部分全部沉淀成了现成功能你只需要填业务代码。1.2 技术栈与优势拆解以我常用的芋道快速开发平台为例它采用的不是某一门惊艳的新技术而是把当下主流方案整合得非常顺后端Spring Boot 3.x / Spring CloudJava 17。如果你用过老版本Spring Boot会有很明显的感觉——配置更简洁启动更快。前端提供Vue 2 Element UI、Vue 3 Element Plus、uni-app 移动端三套后台管理、移动H5都能覆盖。基础设施MySQL 作为主库Redis 做缓存与登录会话MinIO/阿里云OSS 存文件。权限模型基于RBAC角色-权限-资源 数据权限按部门、按用户等维度过滤数据范围。周边功能工作流Flowable、定时任务Quartz、消息中心、支付模块、报表等虽然不全是必须但真需要的时候不用再找轮子。它的核心优势在我看来有三点一是模块化拆分很清楚有独立的yudao-module-system、yudao-module-infra、yudao-module-bpm等不想用工作流可以直接不引入二是代码生成器不是半吊子它能根据数据库表生成前后端完整代码甚至包含单元测试基础代码三是文档和社区比较活跃遇到问题搜一搜基本都有答案。不过选型前也要冷静这类平台普遍功能多早期会带来一定的学习成本。你不能指望什么都不看点几下就能驾驭。我的建议是先把“系统管理”这一条链路啃明白比如用户怎么建、角色怎么配、菜单怎么挂后面就顺了。2. 5分钟从零搭建完整后端实操篇2.1 环境清单与版本要求先说结论整个新建后端服务的流程从我踩完坑之后算是5分钟新手可能要20分钟。时间差主要在于依赖下载和Redis客户端设置。你需要准备这些东西组件版本建议说明JDK17 或 21芋道新版基于Spring Boot 3.xJDK8跑不了如果你用若依老版本JDK8也可以但本文以新版本为例Maven3.8用于拉取依赖建议配置阿里云镜像不然下载能卡死MySQL5.7 / 8.0需要新建一个空数据库字符集选utf8mb4Redis5.0登录Token、验证码缓存都要用本地没装Redis可以用Docker开一个IDEIntelliJ IDEA社区版够用但需要装Lombok插件新版IDEA自带Node.js16可选如果你还要启动前端看效果建议用18 LTS准备一个空目录比如D:\projects\yudao-demo。然后到GitHub上把源码clone下来。以我常看的芋道项目为例git clone https://github.com/YunaiV/ruoyi-vue-pro.git如果你用的是Gitee可以找镜像仓库速度更快。注意clone的时候不用把整个仓库历史拉下来加个--depth1可以省很多时间git clone --depth1 https://gitee.com/zhijiantianya/ruoyi-vue-pro.git克隆完你会看到几个目录yudao-server、yudao-ui-admin、yudao-ui-admin-vue3、sql、doc等。yudao-server就是后端主工程sql里有初始化脚本。2.2 数据库初始化与配置文件修改进入sql目录你会看到类似mysql-5.7.sql或mysql8.x.sql的文件。用Navicat或命令行执行这个SQL就能把系统管理、基础设施相关的几十张表建好mysql -uroot -p123456 sql/mysql8.x.sql执行前记得先创建一个数据库比如yudaoCREATE DATABASE IF NOT EXISTS yudao DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;接下来找配置文件。芋道后端的主配置文件在yudao-server/src/main/resources/application.yaml开发环境配置在application-local.yaml。打开它要改的无非三块spring: datasource: url: jdbc:mysql://127.0.0.1:3306/yudao?useSSLfalseuseUnicodetruecharacterEncodingutf8mb4 username: root password: 123456 redis: host: 127.0.0.1 port: 6379 password: # 本地Redis没密码就留空这里有个坑如果你连接的是MySQL 8.0驱动会自动适配但如果数据库字符集不是utf8mb4中文字段会出现乱码。所以建库时一定带上DEFAULT CHARACTER SET utf8mb4。改完配置就可以启动。建议用IDEA打开根目录等Maven把依赖解析完然后直接运行YudaoServerApplication这个main方法。第一次启动会比较漫长因为要下载几百MB的依赖包。为了提速务必在~/.m2/settings.xml里加上阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror启动成功后控制台会打印类似下面的日志Started YudaoServerApplication in 4.82 seconds这就说明后端已经在跑了默认端口是48080。访问http://127.0.0.1:48080/doc.html能打开API文档Knife4j相当于接口调试工具不用再单独部署Postman文档。如果你只想最快看到效果可以直接用文档里的“登录接口”调通整个流程输入默认管理员账号admin密码admin123拿到token后就可以请求其他接口了。2.3 前端启动可选但推荐后端只是接口服务你运行yudao-ui-admin-vue3就能看到完整的管理界面。先安装依赖cd yudao-ui-admin-vue3 npm install --registryhttps://registry.npmmirror.com然后用Vite起开发服务npm run dev默认访问http://localhost:3000输入账号密码就能进入后台。到这一步一个包含用户管理、角色管理、菜单管理、部门管理的完整系统已经在本地跑起来了确实用不了5分钟前提是依赖都下载好了。3. 核心模块的细节与原理3.1 代码生成器是怎么省时间的很多框架都宣称有代码生成器但实际效果差别很大。有的只能生成单表CRUD生成出来的代码还得手工大改。芋道这类平台的生成器我的评价是“能用且好用”。它的核心逻辑是读取数据库表结构 - 生成实体类、Mapper、Service、Controller、前端Vue页面 - 自动写入指定模块目录。你只需要在“基础设施 - 代码生成”里导入一张业务表比如student然后配置一下字段展示类型、表单类型、查询方式点击生成按钮。以一张简单的学生表为例CREATE TABLE student ( id bigint NOT NULL AUTO_INCREMENT, name varchar(30) NOT NULL, age int DEFAULT NULL, gender tinyint DEFAULT NULL, class_id bigint DEFAULT NULL, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB;在代码生成界面导入这张表你会看到每个字段默认映射id自动识别为主键create_time自动识别为创建时间name生成对应的输入框gender如果配置了字典类型会生成下拉选择框class_id可以配置为远程数据源变成动态下拉生成出来的Controller不只是分页列表和增删改查还自带权限注解比如PreAuthorize(ss.hasPermission(system:student:query)) GetMapping(/page) public CommonResultPageResultStudentRespVO page(Valid StudentPageReqVO pageVO) { return success(studentService.getStudentPage(pageVO)); }这个注解会自动与前端菜单里的权限标识对应。你没配置权限标识时菜单绑定后接口就受控了。这比你自己从零写“查询所有修改插入”要省事太多。想用好代码生成器有两点经验第一表设计一定要规范主键统一叫id创建时间叫create_time删除标记叫deleted生成器能自动识别这些约定省得手动配置。第二不要生成后就完事建议把生成的Service代码拿来做代码review因为生成器产出的代码是可读的你可以在此基础上调整事务边界和缓存策略。3.2 权限模型RBAC与数据权限权限是这类平台的重头戏。我见过不少人只是用“菜单显示/隐藏”来实现权限但真正到后端接口级别如果没有校验就是裸奔。芋道这类平台用的是RBAC模型用户关联角色角色关联菜单/权限菜单/权限再关联按钮和接口。实际使用时后端每个接口可以通过PreAuthorize(ss.hasPermission(system:student:export))来声明需要某个权限码。前端菜单管理里每个菜单可以配置“权限标识”、“按钮权限”后端的权限码与前端的按钮绑定。比如“删除学生”按钮前端Vue代码里会这样判断el-button v-hasPermi[system:student:delete]删除/el-button如果当前用户没有这个权限码按钮就不会渲染就算有人手工调用后端删除接口也会被Spring Security拦截。这种“前端控制显示、后端控制访问”的双重校验才是比较可靠的做法。比普通RBAC更进阶的是数据权限。什么意思呢举个例子一个集团有两个分公司总经理应该看到所有分公司的数据而分公司的部门经理只能看到自己部门的数据。这时候仅靠“谁能访问订单列表”不够还得控制“他能看到哪些订单”。芋道提供了基于部门的数据权限规则有几种范围选择全部数据、指定部门数据、本部门数据、本人数据。它是怎么实现的呢底层其实是在查询SQL上动态拼接了dept_id条件SELECT * FROM student WHERE deleted 0 AND (dept_id IN (SELECT id FROM system_dept WHERE parent_id 100))具体实现用的是MyBatis拦截器在SQL执行前后自动改写。你不需要在每个业务方法里手工判断用户是哪个部门的。这一点非常省心但也要注意如果你的业务有跨部门共享的数据需要配合“自定义数据权限”去扩展不能一味依赖默认规则。3.3 多租户与工作流用之前先想清楚很多平台还内置了多租户能力和工作流我这里多说一句。多租户意味着同一套系统可以给多个互不干扰的客户使用每个租户的数据物理隔离或逻辑隔离都有方案。芋道默认是基于tenant_id字段的逻辑隔离查询时会自动拼上tenant_id xxx这样不同租户的用户登录后都看到各自的数据。但多租户也有代价所有业务表都要加tenant_id字段并且所有SQL的改动都要经过平台过滤。如果你只是自己公司内部使用完全不建议开启反而会让数据查询变复杂。工作流则适合审批类业务内置了流程设计器和表单设计器但Flowable的学习曲线并不短真正要做复杂审批时依然需要理解流程变量、网关、会签这些概念。4. 部署到服务器的正确姿势4.1 打包与配置分离本地跑通之后很多人会问怎么把后端部署到服务器上让自己网页能用同时数据不占用自己电脑空间这个问题说白了就是“打包、传配置、启动”。我先说打包。后端项目不是用IDE直接点运行而是用Maven打成jar包cd yudao-server mvn clean package -DskipTests打包完成后target目录下会出现yudao-server.jar。这个jar包里面包含了Spring Boot的所有依赖但配置文件在外部。你可以复制一份application-prod.yaml到jar包同目录然后编辑里面的数据库地址、Redis地址为服务器上的实际地址。这样每次更新代码只需要替换jar包配置不用跟着变。如果服务器上没有MySQL和Redis我建议用Docker Compose一键安装。比如在服务器上建一个docker-compose.ymlservices: mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORDyour_password - MYSQL_DATABASEyudao ports: - 3306:3306 volumes: - ./mysql-data:/var/lib/mysql redis: image: redis:7-alpine ports: - 6379:6379 volumes: - ./redis-data:/data在服务器上执行docker compose up -d数据库和Redis就起来了。接下来把本地的SQL导入到服务器的MySQL再把jar包和配置文件传上去。启动命令用nohup java -jar yudao-server.jar --spring.profiles.activeprod app.log 21 用--spring.profiles.activeprod指定生产环境配置日志输出到app.log。这种方式最简单、最不容易出错但如果想更稳推荐用systemd或使用pm2Node驱动的进程管理工具也能管Java进程不过我在Java服务上更愿意用systemd。4.2 上线前必改的安全项我见过太多人把本地配置里的默认密码直接带上线这是妥妥的裸奔。有几项必须改数据库密码不要用123456至少16位混合大小写和特殊字符。Redis连接要设置密码或者绑定内网IP不要让公网访问。管理端默认账号admin密码admin123必须第一时间改掉。关闭数据库和Redis的调试端口云服务器安全组只放行必要的端口80/443/8080。如果使用了MinIO作为文件存储MinIO的默认密钥minioadmin/minioadmin也要改。改完这些再用curl http://你的服务器IP:48080/doc.html测一下。如果能访问到API文档建议在网关层把/doc.html这类接口文档路径屏蔽掉毕竟生产环境没必要对外暴露接口描述信息。5. 实战中踩过的坑与排查速查表5.1 典型问题Top 5我用这类平台做过三个项目从零到上线积累了几个高频问题整理成表格方便你排查问题现象可能原因解决办法项目启动时报Failed to configure a DataSource数据库连接配置错误或MySQL未启动检查application-local.yaml的url、username、password确认MySQL能连通前端登录一直提示“验证码错误”Redis未启动或验证码存储失败本地启动Redis或检查Redis密码配置后端启动后访问接口报401没有带Token或者Token过期先用admin账号调用登录接口获取token请求头加Authorization: Bearer 你的tokenMaven下载依赖一直失败镜像源没配置好在settings.xml里配置阿里云公共镜像并清空本地仓库重试前端页面数据能出来但点击“新增”报权限不足当前角色没有对应按钮权限到系统管理-角色管理里给角色分配菜单与按钮权限定时任务不触发没启动Quartz模块或任务状态为“暂停”在基础设施-定时任务里检查任务状态并确保相应模块已引入如果你遇到控制台日志里出现RedisConnectionFailureException第一步不是去看防火墙而是先在服务器上执行redis-cli ping能返回PONG说明Redis是活的问题大概率在密码或端口配置。5.2 我的避坑经验最后聊一些文档里不太会写的个人经验。第一不要一上来就把代码生成器生成的代码直接合入主分支。我之前吃过亏生成器自动生成的Mapper XML里包含了一遍又一遍的WHERE deleted 0如果和手写的多表关联混在一起很容易出现deleted字段加错表。建议生成后先跑一轮接口测试确认列表、详情、删除都正常再提交。第二这类平台的版本升级比较频繁尤其是芋道主分支一直在往前推。如果你用的是一个老版本不要轻易去升级框架版本因为数据库表结构可能有变更。更好的做法是锁定一个release版本网上很多“网盘分享最新版本更新内容”的资源每次更新前先看sql目录里的增量脚本不要在已有数据下直接跑全量SQL。第三遇到诡异问题比如某个接口偶发超时、数据权限漏了优先开SQL日志。在application-local.yaml中把日志级别调低logging: level: com.yudao: debug看到SQL之后很多问题一目了然。比如数据权限漏了你会在SQL里发现少了一个tenant_id条件。第四多利用平台内置的“操作日志”和“错误日志”模块。这类平台一般会记录用户操作、API异常堆栈。你在页面上打开“错误日志”列表往往比看服务器日志文件更直观尤其是对没有登录服务器权限的前端同学非常友好。我的个人体会是用这种平台开发最大的收益不是省了那几天的开发时间而是它逼着你把项目结构、权限模型、数据规范想清楚。你看到的每个模块都代表一套经过验证的解决方案多读它的源码比你自己闷头写十个增删改查都有用。如果你正准备接一个新的后端项目不妨花一个下午把它跑通然后再决定要不要深入使用——大概率你会和我一样把默认脚手架扔进垃圾桶。
返回列表