☰
SpringBoot+Vue+MySQL工作流审批系统源码实战与二次开发指南
2026/10/11 14:35:53 网站建设 项目流程

最近在整理一套工作流程管理系统信息管理系统源码,技术栈是SpringBoot后端 + Vue前端 + MySQL,作者明确标注了【可直接运行】。我把它下载下来在本地跑了一遍,又把核心代码翻了个底朝天,总体感受是:这套东西拿来当企业内部办公系统的起点,或者作为前后端分离项目的实战参考,都相当合适。这篇文章就围绕这套源码,把整体设计、核心模块、启动细节、常见坑和二次开发思路一次说清楚。

先说结论,这套系统本质上是一个“流程引擎 + 业务表单 + 权限管理”的铁三角组合,非常适合处理请假审批、报销审批、合同会签、用章申请这类需要多人协作流转的场景。它不依赖第三方重型工作流中间件,而是自己实现了流程定义和任务流转逻辑,对于中小规模团队来说反而轻量好懂。全文不扯虚的,直接进入正题。

1. 项目整体设计与技术选型思路

1.1 为什么是SpringBoot+Vue+MySQL这套组合

很多人在选型时会纠结要不要上更重的微服务架构、要不要引入独立的流程引擎,但如果你面对的是一个几十人上百人的团队、日均审批量在几百到几千条这个量级,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下典型的包结构是:

  • controller:REST接口层
  • service:业务逻辑层
  • mapper:MyBatis数据访问接口
  • 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 环境准备清单

实际跑起来之前,先确认环境版本。我这次的运行环境如下,供参考:

  • JDK:1.8(后端项目编译级别是1.8,不要用太高版本)
  • Maven:3.6+(之前用3.5也正常)
  • Node.js:14或16(Vue2项目对Node版本兼容性还行,18以上部分老依赖可能报错)
  • MySQL:5.7或8.0(注意驱动和连接串差异)
  • 开发工具:IDEA + VS Code或WebStorm

数据库安装后,先创建一个名为workflow_db(或者项目自带SQL里的实际库名)的数据库,字符集选utf8mb4。这里有个非常关键的细节:MySQL 8.0默认认证插件是caching_sha2_password,老版本驱动连不上,需要把连接串改成&allowPublicKeyRetrieval=true&useSSL=false,或者直接用mysql-connector-java 8.x驱动。这套源码的配置大概率已经处理了,如果启动报“Public Key Retrieval is not allowed”,就去看看配置文件里的连接串。

4.2 后端启动步骤

后端启动的完整流程如下:

  1. 导入项目到IDEA,等待Maven下载依赖。
  2. 修改application.yml(或application.properties)里的数据源配置,把url、username、password改成你自己的。
  3. 在MySQL中执行项目里sql目录下的初始化脚本。注意执行顺序:如果脚本拆成多个,先执行建表脚本,再执行初始化数据脚本。
  4. 配置好Redis相关配置(如果项目用了Redis,没有的话跳过,这套系统大概率没用)。
  5. 启动主类上的main方法,或者用命令行mvn spring-boot:run启动。
  6. 看到启动日志中出现“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" }

实际操作步骤:

  1. 解压前端源码到单独目录。
  2. 用npm install安装依赖。如果用的是Node 16以下版本,可以正常安装;如果Node版本过高,老版node-sass编译会报错,这时候可以安装nvm切换Node版本,或者把node-sass替换成sass。
  3. 修改vue.config.js或.env.development文件里的后端接口地址,确保前端的代理或baseURL指向正确的后端端口(比如http://localhost:8081)。
  4. 执行npm run serve启动开发服务器。
  5. 浏览器打开控制台输出的地址,一般是http://localhost:8080。

如果登录后页面一直转圈、列表数据加载不出来,优先打开浏览器F12看网络请求。如果请求地址是localhost:8080/api开头且后端是8081,多半是代理没配置;如果请求直接打到了后端但出现跨域,就是后端Cors配置的问题。这套源码里前端一般配置了开发代理,实际以源码为准。

4.4 常见启动报错排查实录

我整理了一份实测中的常见问题速查表,按出现的频率排序:

报错现象可能原因解决办法
后端启动报数据库连接失败数据库没启动、库不存在、密码错误检查连接串和账号密码,先测试数据库连通性
建索引时Specified key was too long字符集或索引长度问题使用utf8mb4并控制字段长度,或改用utf8
npm install报node-sass错误Node版本不兼容切换Node版本到14/16,或改为dart-sass
前端接口404代理没配对或后端context-path不一致检查vue.config.js代理路径和后端路由前缀
登录成功但菜单为空Redis缓存或权限数据未初始化检查菜单表和角色菜单关联表的数据
审批提示“流程未定义”初始化数据未导入或流程定义未启用检查流程定义表和状态字段

排查启动问题有个通用思路:先看后端日志,再看数据库数据,最后看前端网络请求。很多问题其实出在“数据没初始化”或“配置没改全”上,跟代码本身关系不大。

5. 二次开发与扩展思路

5.1 接入新业务表单的完整流程

这套系统最值得二次开发的地方就是新增一个新流程。假设现在要加一个“物品领用申请”,正确做法分五步:

  1. 在业务表单配置里添加表单标识goods_apply,配置好领用物品名称、数量、领用原因等字段。
  2. 创建对应的业务数据表goods_apply,字段与表单配置对齐。
  3. 写一个发起时的数据保存逻辑,把JSON里的对应字段写入业务表。
  4. 在流程定义表里新增流程,流程名称设为“物品领用申请”,流程节点按需配置,表单标识绑定goods_apply。
  5. 在前端views下新增业务发起页,挂在动态路由对应目录下,并在菜单表里配置菜单权限。

这里特别强调一点:不要为了省事直接复制“请假审批”的页面来改,最好先看表单动态渲染组件是怎么工作的。如果理解了动态渲染机制,你甚至只需要做很少的定制就能复用现有页面,改的只是表单配置。

5.2 流程节点扩展与条件分支

原版流程引擎只支持线性顺序流转,但实际业务中经常遇到条件分支需求,比如采购金额超过5000需要总经理审批,5000以下部门经理直接审批。要实现这个功能,可以在流程节点表增加一个conditionExpression字段,用来保存SpEL或简单脚本表达式。

然后在流转逻辑里,创建下一节点任务前先取出所有出边节点,逐一判断条件表达式的结果,命中哪个节点就创建哪个节点的任务。如果是单一分支,就按顺序找第一个条件为真的节点。用这种方法可以简单实现“金额>5000走A节点,否则走B节点”的效果,而且不需要引入外部规则引擎。

再进阶一点,节点上可以增加“允许撤销”“允许转办”等能力标记。这些都可以在节点表加字段实现,审批接口里根据当前节点配置判断是否允许对应操作。

5.3 系统上线前的检查清单

从源码变成生产可用系统,至少要做下面这些检查,这是我在实际项目中踩过坑总结出来的:

  • 数据库账号:不要直接用root跑生产,创建一个权限受限的专用账号。
  • 默认密码:强制首次登录修改密码,或者在生产环境初始化前先改掉SQL里的密文。
  • 文件上传:如果附件上传目录是相对路径,上线后需要改成稳定的绝对路径,并做好目录备份策略。
  • 跨域与安全:前后端通过Nginx同域部署后,后端Cors可以收紧或直接关闭,token建议用HTTP Only的Cookie或加安全头。
  • 日志框架:检查日志输出级别,避免生产环境输出过多debug日志。
  • 备份策略:数据库定时备份,附件目录同步备份。

做完这几项,整个系统才算从“本地跑通”进阶为“能干活”。

我个人在实际操作中的体会是,这类SpringBoot+Vue+MySQL的工作流程管理系统,本质上是把“人与人之间的协作规则”转化成了“系统自动流转的状态机”。你越早理解流程定义、任务实例、审批记录这三者的关系,二次开发时就越顺手。最后再分享一个小技巧:源码里流程定义表设计得相当克制,没有过度抽象,当你拿到手时,先把初始化数据跑通,打断点走一条完整审批链,比看十篇文档都管用。一次跑通之后,后面加节点、加表单、加分支,就都有底气了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询