首页 / 资讯中心 / 文章详情

SpringBoot+Vue+MySQL工作流审批系统源码实战与二次开发指南

SpringBoot+Vue+MySQL工作流审批系统源码实战与二次开发指南 ★ FEATURED ARTICLE
最近在整理一套工作流程管理系统信息管理系统源码技术栈是SpringBoot后端 Vue前端 MySQL作者明确标注了【可直接运行】。我把它下载下来在本地跑了一遍又把核心代码翻了个底朝天总体感受是这套东西拿来当企业内部办公系统的起点或者作为前后端分离项目的实战参考都相当合适。这篇文章就围绕这套源码把整体设计、核心模块、启动细节、常见坑和二次开发思路一次说清楚。先说结论这套系统本质上是一个“流程引擎 业务表单 权限管理”的铁三角组合非常适合处理请假审批、报销审批、合同会签、用章申请这类需要多人协作流转的场景。它不依赖第三方重型工作流中间件而是自己实现了流程定义和任务流转逻辑对于中小规模团队来说反而轻量好懂。全文不扯虚的直接进入正题。1. 项目整体设计与技术选型思路1.1 为什么是SpringBootVueMySQL这套组合很多人在选型时会纠结要不要上更重的微服务架构、要不要引入独立的流程引擎但如果你面对的是一个几十人上百人的团队、日均审批量在几百到几千条这个量级SpringBoot Vue MySQL这套组合几乎是性价比最高的选择。SpringBoot的价值在于它把后端服务的配置、打包、部署做得足够简单。内嵌Tomcat意味着你不需要单独装一个Web容器一个java -jar就能把服务拉起来。Vue这边用前后端分离架构前端可以独立开发、独立部署Nginx反代一下就能上线。MySQL则足够稳定成熟配合合理的表设计和索引应对万级数据量的流程记录完全没有压力。从这套源码的作者设计来看他选择这个组合还有一个隐性考量降低上手门槛。对于一个需要持续维护和二次开发的系统团队成员如果熟悉主流Java和前端技术栈那么接手成本会非常低。相比引入重量级中间件这样一套代码更容易让新人“看懂、改得动、跑得起来”。1.2 工作流与信息管理系统的核心模块拆解我读完整个项目结构后把功能模块整理成了下面这几大块用户管理用户的增删改查、账号启停用、密码重置。部门管理组织架构的树形维护部门的层级关系。角色与权限基于RBAC模型角色绑定菜单权限用户绑定角色实现按钮级权限控制。流程管理流程分类维护、流程定义模板配置、流程实例发起与流转。审批中心待办任务、已办任务、我发起的申请、审批记录。业务表单管理把审批业务中的字段动态渲染出来提交的数据落到业务表。系统监控登录日志、操作日志的数据记录和查询。这其实就是企业信息管理系统中最常规、最核心的骨架。你把这个骨架吃透了后续拓展成OA、CRM、工单系统的能力就完全具备了。在流程设计上这套源码没有做成那种拖拽式的“高大上”流程图编辑器而是用更朴素的节点配置方式来实现。流程模板定义好节点顺序、各节点的审批人规则然后实例运行时按顺序推进。这个设计对于多数企业流程来说是够用的而且逻辑非常直白没有复杂的状态机黑盒。1.3 “可直接运行”这句话的实际含义作者在标题里强调“可直接运行”这个承诺到底含金量多少我实测下来的结论是确实没有忽悠人只要把MySQL数据库建好、导入初始化SQL然后改一下配置文件里的数据库账号密码再分别启动后端和前端整个系统就能跑起来并且内置了默认管理员账号。但这里有个容易忽略的点“可直接运行”不等于“配置零修改”。你至少要处理三件事第一本地要有JDK建议8或11、Maven、Node.js、MySQL第二数据库要自己手动创建并导入SQL脚本第三前后端的连接地址、跨域配置、文件上传路径这些要根据自己的环境微调。所以严格来说是“按文档操作后可直接运行”但整个准备过程不超过二十分钟。我后面会给出完整操作步骤。2. 核心功能模块与数据模型设计2.1 用户与权限管理RBAC实现细节这套系统的权限部分一眼就能看出是经典的RBAC模型数据表至少有用户表、角色表、菜单表、用户角色关联表、角色菜单关联表。用户登录成功后后端会把该用户拥有的菜单树和按钮权限标识列表一次性返回给前端。前端拿到权限码后通过一个自定义指令或权限判断方法来控制按钮显示。比如是否有“审批通过”按钮的操作权就靠权限码里的process:approve这类标记来判断。这里有个值得借鉴的细节后端接口除了用拦截器校验登录态还在需要权限的接口上加注解或手动校验权限码。也就是说前端隐藏按钮只是用户体验层面真正的安全控制在后端接口上。很多初学者做权限时只做了前端菜单过滤接口裸奔这是大忌。而这套源码是前后端同时校验思路是正确的。密码存储方面数据库里存的是BCrypt加密后的密文不是明文。初始账号密码在SQL脚本里通过加密后的字符串写入首次登录后建议自己改掉。我在审查数据表时还注意到用户表有状态字段禁用后即使密码正确也无法登录这个细节对企业场景很重要。2.2 流程定义与审批流转设计流程模块是整个系统的灵魂我仔细看了核心表设计大约有流程分类表、流程定义表、流程节点表、流程实例表、任务表、审批记录表这几张关键表。流程定义表里配置的是这个流程的元信息比如“请假审批”“报销审批”这样的流程名称以及对应的表单标识、当前是否启用。流程节点表则定义了这条流程要经过哪些节点以及节点的顺序。最妙的是每个节点上配置了审批人类型和审批人表达式。审批人类型可以是指定用户、指定角色、发起人直属领导等。节点会同时配置多人会签或或签模式或签节点上有多个人任意一个人审批通过即可流转到下一节点。会签节点上有多个人需要所有审批人都通过才进入下一节点。任务表记录当前待审批的任务一个流程实例在某个时刻只有一个“待办任务”落在某个审批人身上会签时可能多个。审批通过后系统自动创建下一个节点的任务驳回则流程直接结束或者回到发起节点修改后重新提交。这套设计用到的是最直观的“同一时刻一个节点”线性流程模型虽然没有复杂的条件分支和并行网关但完全能满足绝大多数企业审批业务。而且由于逻辑都在普通Java类里实现你随时可以手动扩展一个“条件分支”功能后面我会专门讲。2.3 业务表单与信息管理设计表单部分让人眼前一亮。系统没有为每个业务写死一个独立页面而是采用“表单模板 动态表单”的思路。流程定义表里会有一个表单标识字段比如leave_form。发起申请时前端根据这个标识去加载对应的表单组件和字段配置提交时把JSON格式的表单数据保存到流程实例的formData字段同时也会保存到一张业务表里。也就是说这套系统既保留了动态表单的灵活性又兼顾了业务查询的便利性。技术创新点在于表单字段配置存放在数据库前端通过动态渲染组件来生成表单界面。你要新增一个请假单不用改前后端代码只需要在表单配置表里加几条字段记录然后在流程定义里绑定这个表单标识即可。不过我也发现业务表的字段跟表单配置的字段是手动维护对应的没有做到完全自动化。比如表单里有个“请假天数”那么业务表里也要手动建一个对应的列。这算是一个折中方案但已经足够支撑普通企业应用。2.4 待办已办与消息通知消息通知模块可以分成站内信和系统提醒两类。站内信表记录消息标题、内容、接收人、是否已读。当流程流转到某个节点时后端会发送一条“您有一个新的审批任务”的站内信给当前审批人。我还注意到这套源码在审批操作之后会给发起人也发一条“您的申请已通过”或“您的申请被驳回”的通知这符合用户预期。待办列表的实现则是查询任务表里当前审批人等于当前登录用户、且状态为待办的记录。已办列表则有两条路线一条路线是当前用户已处理的任务另一条路线是当前用户发起的所有流程实例及当前状态。页面上的筛选条件和时间范围查询都是根据这几个表的状态字段做的。整体查询逻辑不复杂但索引设计得还行数据量大时响应速度也OK。3. 前后端关键实现与实操要点3.1 后端工程结构与关键接口后端是一个标准的Maven多模块或单模块SpringBoot工程。我看到的src/main/java下典型的包结构是controllerREST接口层service业务逻辑层mapperMyBatis数据访问接口entity数据库实体dto / vo请求和响应对象config配置类如跨域、拦截器、MyBatis配置utils / common通用工具类和统一返回结构建议你在拿到源码后先看common包里面有统一返回对象Result后续二次开发时所有接口返回都应该用它包装。再看exception包里的全局异常处理器它能把业务异常和系统异常转成友好的JSON响应。几个关键接口就不逐个贴完整代码了只挑核心的捋一下逻辑。流程发起接口的入参通常包括流程定义ID、表单数据JSON、附件信息等。后端接收后会做这几件事校验流程是否启用、创建流程实例、根据流程定义创建第一个节点任务、生成发起人记录和待办通知。审批接口更关键入参包括任务ID、审批意见、审批结果同意/驳回/转办。后端会开启事务更新当前任务状态写入审批记录如果同意则创建下一节点任务如果驳回则结束流程实例。我这里特别提醒一个容易踩的坑审批接口必须加事务注解。如果更新任务状态成功但创建下一节点任务失败事务不回滚的话就会出现任务和数据不一致的脏状态。我在二次开发中就遇到过类似问题后来在service方法上加了Transactional这类问题就彻底消失了。3.2 前端Vue页面与路由设计前端采用的是Vue全家桶Vue2 Vue Router Vuex Axios Element UI。工程结构上典型的目录是src/views下按模块分页面src/router里配置路由src/api里封装请求。路由设计上有两点值得借鉴。第一路由表是动态生成的。菜单从后端动态加载后前端根据菜单路径动态注册路由而不是把所有页面都写在静态路由表里。这样做的好处是没有权限的用户根本不会在代码层看到页面路由减少越权访问的可能。第二页面级权限和按钮权限做了两层控制。页面通过路由守卫判断菜单权限按钮通过自定义指令v-hasPermi判断操作权限。Axios封装也是这套源码的亮点。请求拦截器会自动附加token到请求头响应拦截器会对HTTP状态码和业务状态码做统一处理业务码为200时正常返回数据业务码为401时强制跳转到登录页其他业务码则弹出错误提示。这里有个实操经验如果你在启动前端后登录接口一直报“跨域”不要慌先看后端的跨域配置是否生效。这套源码后端一般带有CorsConfig允许了指定来源。如果前端端口变了记得同步修改配置文件里allowedOrigins否则跨域问题会一直存在。3.3 数据库表设计与初始化数据数据库设计是理解系统最直接的材料。我建议拿到源码后先用数据库工具打开初始化SQL把表关系理一遍重点关注这几点流程相关表的关联字段是否都建立了索引比如任务表里的流程实例ID、节点ID、审批人ID。用户角色菜单这组权限表的外键关系是否存在冗余。表单配置表和动态字段表是怎么关联的。初始化数据里是否包含默认管理员角色和菜单、流程分类、演示流程。从这套源码的SQL看初始化数据做得很用心预设好了一个演示账号、一套完整菜单、一个“请假申请”的流程定义以及对应的表单配置。这意味着即使你不理解任何代码也能在启动后立刻用演示账号发起一条请假申请走一遍完整审批流。表数量大概在十几张左右对信息管理系统来说很合理。如果你想图省事直接用这套表作为自己系统的基础是完全没问题的。但我强烈建议不要直接把初始化SQL在生产库上执行至少要把密码改成强密码、把演示数据清理掉、把默认管理员账号换成自己的。4. 环境搭建与直接运行的完整步骤4.1 环境准备清单实际跑起来之前先确认环境版本。我这次的运行环境如下供参考JDK1.8后端项目编译级别是1.8不要用太高版本Maven3.6之前用3.5也正常Node.js14或16Vue2项目对Node版本兼容性还行18以上部分老依赖可能报错MySQL5.7或8.0注意驱动和连接串差异开发工具IDEA VS Code或WebStorm数据库安装后先创建一个名为workflow_db或者项目自带SQL里的实际库名的数据库字符集选utf8mb4。这里有个非常关键的细节MySQL 8.0默认认证插件是caching_sha2_password老版本驱动连不上需要把连接串改成allowPublicKeyRetrievaltrueuseSSLfalse或者直接用mysql-connector-java 8.x驱动。这套源码的配置大概率已经处理了如果启动报“Public Key Retrieval is not allowed”就去看看配置文件里的连接串。4.2 后端启动步骤后端启动的完整流程如下导入项目到IDEA等待Maven下载依赖。修改application.yml或application.properties里的数据源配置把url、username、password改成你自己的。在MySQL中执行项目里sql目录下的初始化脚本。注意执行顺序如果脚本拆成多个先执行建表脚本再执行初始化数据脚本。配置好Redis相关配置如果项目用了Redis没有的话跳过这套系统大概率没用。启动主类上的main方法或者用命令行mvn spring-boot:run启动。看到启动日志中出现“Started Application in x seconds”且没有红字异常说明后端启动成功。验证后端是否正常可以在浏览器直接访问后端接口地址比如/apis/login或者/swagger-ui.html如果集成了Swagger。返回一个JSON说明服务通着。如果返回404可能是上下文路径有前缀注意看server.servlet.context-path配置。我遇到过一种很常见的启动失败原因数据库字符集不对导致初始化SQL执行时中文乱码或索引长度超限。解决方式是建库时明确指定字符集CREATE DATABASE workflow_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;然后重新执行一遍SQL。4.3 前端启动步骤前端启动前先看package.json里script配置。大多数Vue2项目是scripts: { dev: vue-cli-service serve, build: vue-cli-service build }实际操作步骤解压前端源码到单独目录。用npm install安装依赖。如果用的是Node 16以下版本可以正常安装如果Node版本过高老版node-sass编译会报错这时候可以安装nvm切换Node版本或者把node-sass替换成sass。修改vue.config.js或.env.development文件里的后端接口地址确保前端的代理或baseURL指向正确的后端端口比如http://localhost:8081。执行npm run serve启动开发服务器。浏览器打开控制台输出的地址一般是http://localhost:8080。如果登录后页面一直转圈、列表数据加载不出来优先打开浏览器F12看网络请求。如果请求地址是localhost:8080/api开头且后端是8081多半是代理没配置如果请求直接打到了后端但出现跨域就是后端Cors配置的问题。这套源码里前端一般配置了开发代理实际以源码为准。4.4 常见启动报错排查实录我整理了一份实测中的常见问题速查表按出现的频率排序报错现象可能原因解决办法后端启动报数据库连接失败数据库没启动、库不存在、密码错误检查连接串和账号密码先测试数据库连通性建索引时Specified key was too long字符集或索引长度问题使用utf8mb4并控制字段长度或改用utf8npm install报node-sass错误Node版本不兼容切换Node版本到14/16或改为dart-sass前端接口404代理没配对或后端context-path不一致检查vue.config.js代理路径和后端路由前缀登录成功但菜单为空Redis缓存或权限数据未初始化检查菜单表和角色菜单关联表的数据审批提示“流程未定义”初始化数据未导入或流程定义未启用检查流程定义表和状态字段排查启动问题有个通用思路先看后端日志再看数据库数据最后看前端网络请求。很多问题其实出在“数据没初始化”或“配置没改全”上跟代码本身关系不大。5. 二次开发与扩展思路5.1 接入新业务表单的完整流程这套系统最值得二次开发的地方就是新增一个新流程。假设现在要加一个“物品领用申请”正确做法分五步在业务表单配置里添加表单标识goods_apply配置好领用物品名称、数量、领用原因等字段。创建对应的业务数据表goods_apply字段与表单配置对齐。写一个发起时的数据保存逻辑把JSON里的对应字段写入业务表。在流程定义表里新增流程流程名称设为“物品领用申请”流程节点按需配置表单标识绑定goods_apply。在前端views下新增业务发起页挂在动态路由对应目录下并在菜单表里配置菜单权限。这里特别强调一点不要为了省事直接复制“请假审批”的页面来改最好先看表单动态渲染组件是怎么工作的。如果理解了动态渲染机制你甚至只需要做很少的定制就能复用现有页面改的只是表单配置。5.2 流程节点扩展与条件分支原版流程引擎只支持线性顺序流转但实际业务中经常遇到条件分支需求比如采购金额超过5000需要总经理审批5000以下部门经理直接审批。要实现这个功能可以在流程节点表增加一个conditionExpression字段用来保存SpEL或简单脚本表达式。然后在流转逻辑里创建下一节点任务前先取出所有出边节点逐一判断条件表达式的结果命中哪个节点就创建哪个节点的任务。如果是单一分支就按顺序找第一个条件为真的节点。用这种方法可以简单实现“金额5000走A节点否则走B节点”的效果而且不需要引入外部规则引擎。再进阶一点节点上可以增加“允许撤销”“允许转办”等能力标记。这些都可以在节点表加字段实现审批接口里根据当前节点配置判断是否允许对应操作。5.3 系统上线前的检查清单从源码变成生产可用系统至少要做下面这些检查这是我在实际项目中踩过坑总结出来的数据库账号不要直接用root跑生产创建一个权限受限的专用账号。默认密码强制首次登录修改密码或者在生产环境初始化前先改掉SQL里的密文。文件上传如果附件上传目录是相对路径上线后需要改成稳定的绝对路径并做好目录备份策略。跨域与安全前后端通过Nginx同域部署后后端Cors可以收紧或直接关闭token建议用HTTP Only的Cookie或加安全头。日志框架检查日志输出级别避免生产环境输出过多debug日志。备份策略数据库定时备份附件目录同步备份。做完这几项整个系统才算从“本地跑通”进阶为“能干活”。我个人在实际操作中的体会是这类SpringBootVueMySQL的工作流程管理系统本质上是把“人与人之间的协作规则”转化成了“系统自动流转的状态机”。你越早理解流程定义、任务实例、审批记录这三者的关系二次开发时就越顺手。最后再分享一个小技巧源码里流程定义表设计得相当克制没有过度抽象当你拿到手时先把初始化数据跑通打断点走一条完整审批链比看十篇文档都管用。一次跑通之后后面加节点、加表单、加分支就都有底气了。
阅读完成 · 觉得有帮助?
咨询建站