SpringBoot+Vue实现EHS安全环保管理系统:毕业设计实战解析
发布时间:2026/9/30 3:04:06 作者:尧图编辑部 阅读量:1,286

做毕业设计选题目的时候我盯着EHS安全环保管理系统看了很久。EHS是Environment、Health、Safety的缩写翻译过来就是环境、健康、安全。国内但凡有点规模的制造企业、化工企业都有专门的EHS部门负责隐患排查、环境监测、职业健康档案这些事。选题的价值不用多讲企业里是真的有这套需求不是凭空造出来的业务。这个项目我用了SpringBoot做后端主体框架、Vue做前端页面、MySQL存业务数据做成了一套面向企业的一体化综合管控平台。它把安全巡检、隐患整改、环境数据监测、员工健康档案、培训记录这些散落的业务全部收到一个系统里形成从发现问题到整改验收的闭环。不管是打算拿来当毕业设计还是未来想往企业数字化方向走这套项目的参考价值都很高。这篇内容我会把整个项目的设计思路、核心模块、落地过程和踩过的坑全部理一遍适合正在做SpringBoot毕设的同学也适合想要快速理解企业EHS业务逻辑的开发新人。1. 项目定位为什么企业需要一套EHS综合管控平台1.1 传统EHS管理的痛点先说业务端。很多没进过工厂的人可能想象不到过去几年不少企业的安全管理还是靠Excel和微信群里的一张张表格。安全隐患排查完了整改单要么打印出来找人签要么拍照发群回头一统计全是散的数据。环境监测的数据来自不同设备监控人员每天抄一次表抄完再人工录入系统。员工体检档案归人事管特种作业证归安全部管培训记录又是另一套Excel。这种信息割裂导致的最直接结果就是出事之后追溯难、统计难、责任划分也难。我做这个系统之前专门问过在企业做EHS的朋友他给我列了几个高频痛点。一是隐患台账无法闭环发现了问题但整改结果没人跟二是数据口径不统一环境监测数据覆盖不全领导要看报表就得临时整理三是档案管理混乱员工健康档案和特种作业证到期提醒基本靠人脑四是整改责任不明确同一个隐患今天推明天最终变成事故隐患。这些痛点其实就是系统功能模块的源头项目做得好不好核心就看你有没有真正解决其中几个问题。1.2 系统核心价值从记录工具到管理闭环EHS系统建设的核心不是做一个电子台账而是把一个管理闭环跑起来。闭环是什么概念拿安全隐患来说完整链条是巡检发现-登记上报-任务指派-限期整改-复查验收-归档统计。系统要做的不只是把每个节点记录下来更重要的是在每个节点设置状态约束发现隐患必须指派责任人指派后必须有整改期限超期未整改要自动提醒整改完成后必须复查确认。只要这个链条能在系统里转起来管理效率就会明显提升。环境监测模块同理。系统按时采集废水、废气、噪声、固废等监测数据超过排放限值时自动预警并且定期生成趋势报表。这样环境管理就从被动应付检查变成主动掌握数据。健康档案模块把员工基本信息、体检记录、职业病危害接触史、特种作业证书放在一起证书到期系统自动提醒。这三个业务域统一在一个平台里就是EHS一体化管控平台的核心价值。1.3 这套项目适合谁这个题目的定位很清晰就是面向企业内部管理的业务系统天然适合作为计算机相关专业的毕业设计。它有三层价值。第一层是技术价值项目把SpringBoot、MyBatis-Plus、Spring Security、Vue、MySQL这些主流技术在真实业务场景里全部用上了做完能撑起项目经验。第二层是业务价值EHS是真实的企业管理需求不是虚构场景无论是答辩还是作品集展示都能讲出实际业务逻辑。第三层是差异化价值和满大街的商城、图书管理系统相比EHS系统在选题上明显更有辨识度也更容易体现设计者对业务的理解深度。2. 技术选型与架构设计为什么核心框架选SpringBoot2.1 SpringBoot解决了什么问题选技术框架的时候我考虑过SSHStruts2SpringHibernate和SSMSpringSpringMVCMyBatis最后还是定了SpringBoot。原因很简单SpringBoot解决了传统Spring项目里最烦人的配置问题。以前搭一个SSM项目需要写web.xml、spring-mvc.xml、spring-mybatis.xml配置数据源、事务管理器、拦截器哪一步写错都要排查半天。SpringBoot用自动配置和约定优于配置的思路把大部分样板配置都替你做好了项目里只需要在application.yml里写上数据源参数和少量自定义配置就能跑起来。SpringBoot还有一个很实际的优点内嵌Tomcat。以前部署SSM项目要先装Tomcat、配置server.xml、把war包丢进webapps目录SpringBoot项目打成jar包直接java -jar就能启动部署成本低了一大截。对于毕设项目来说这意味着在Windows上开发完传到云服务器上也能很快跑起来演示的时候阻力小很多。2.2 整体架构前后端分离EHS系统我采用了前后端分离的架构。后端是SpringBoot项目提供RESTful API接口前端是Vue 2 Element UI构建的单页应用数据库用MySQL 8.0缓存用Redis。接口交互统一走JSON格式前端通过axios调用后端接口。为什么选前后端分离一是开发过程可以并行推进我先把后端的接口文档定义好前端的同学或自己写的时候可以按接口联调二是后期维护方便改了前端界面不影响后端逻辑三是在答辩演示时可以直接用浏览器访问界面效果比重后端模板渲染的JSP页面要好看很多。前后端分离也会带来一些额外工作比如跨域处理、接口鉴权、统一返回格式。跨域问题在开发环境通过后端配置CORS解决线上部署时把前端打包后的静态文件交给Nginx托管再把/api路径反向代理到后端服务这样浏览器视角只有同源的请求跨域问题基本不存在。2.3 数据库设计一张关系图谱EHS系统的数据模型是整个项目的底盘。我把它分成五个域用户权限域、安全业务域、环境业务域、健康业务域、系统支撑域。用户权限域包含用户表、角色表、菜单表和用户角色关联表。安全业务域包含巡检计划表、隐患登记表、隐患整改表、复查验收表。环境业务域包含监测点表、监测数据表、排放限值表、预警记录表。健康业务域包含员工档案表、体检记录表、证书表、培训记录表。系统支撑域包含公告表、操作日志表和文件存储表。这里有个值得注意的设计原则EHS系统的核心表普遍适合主表子表的结构。比如隐患登记表是主表记录隐患的基本信息隐患整改表是子表记录责任人、整改措施、整改期限复查验收表是另一个子表记录复查结果和验收人。三张表通过隐患ID关联起来这样从发现到验收全程都有迹可循。3. 核心业务模块拆解安全、环境、健康三大业务域3.1 安全隐患排查闭环安全隐患排查是整个EHS系统最核心的模块也是我在答辩时花了最多时间讲的部分。这个模块的业务流程是巡检人员按巡检计划到现场检查发现问题后在系统里登记隐患登记内容包括隐患位置、隐患描述、隐患等级一般/较大/重大、现场照片系统根据隐患等级自动生成整改任务指派给对应责任人并设定整改截止日期责任人在期限内上传整改说明和整改后照片最后由安全管理人员进行复查验收验收通过则隐患关闭验收不通过则退回重新整改。技术实现上有几个关键点需要重点处理。第一是隐患等级的自动判断一般企业会按风险矩阵来定级我在系统里做了一个简单的规则引擎根据隐患类型和影响范围自动给出建议等级人工可以修改。第二是整改超期提醒我用SpringBoot自带的Scheduled定时任务每天扫描一次隐患表把超过整改期限且状态未关闭的记录筛选出来生成待办提醒。第三是图片上传现场照片使用MultipartFile接收存到服务器本地磁盘数据库只保存文件路径避免把图片直接塞进数据库。// 隐患整改超期扫描每天凌晨执行一次 Scheduled(cron 0 0 1 * * ?) public void scanOverdueRectification() { ListHazard overdueList hazardMapper.selectOverdueList(); for (Hazard hazard : overdueList) { // 更新隐患状态为逾期 hazard.setStatus(2); // 生成一条待办提醒 todoService.createTodo(隐患逾期, hazard.getRectifier(), hazard.getId()); } }3.2 环境监测与预警联动环境监测模块相比安全模块稍微简单一些但是数据量大、实时性要求高。系统的思路是在厂区设置若干监测点每个监测点监测废水COD、氨氮、pH值、废气颗粒物、噪声分贝、VOCs等指标数据来源可以是人工录入也可以通过接口对接在线监测设备。系统每天按监测点汇总数据存入监测明细表超过排放限值时标记超标并生成预警记录同时给环境管理员发送提醒。这个模块有两个技术难点。第一是数据展示需要按时间范围查询监测数据并用折线图展示趋势。我在前端用了ECharts后端提供一个带时间范围参数和历史数据的查询接口返回按日期分组的数据列表前端直接渲染折线图。第二是预警规则配置企业不同监测点的限值不一样比如有的点COD限值是60mg/L有的点是100mg/L所以我把排放限值做成独立的数据表支持按监测点配置预警逻辑统一读取限值表中的数据进行比对。-- 监测点指标限值表按监测点和指标维度配置 CREATE TABLE monitor_limit ( id BIGINT PRIMARY KEY AUTO_INCREMENT, point_id BIGINT NOT NULL COMMENT 监测点ID, indicator VARCHAR(50) NOT NULL COMMENT 监测指标, limit_value DECIMAL(10,2) NOT NULL COMMENT 排放限值, unit VARCHAR(20) COMMENT 单位, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );3.3 职业健康档案与证书管理健康域在EHS系统里经常被弱化但做企业版本一定不能漏。这个模块管理员工的基础健康档案、年度体检记录、职业病危害接触史、特种作业证书等。特种作业证书的管理有一个很实用的功能证书到期提前提醒。我在证书表里存了发证日期和有效期系统每天扫描一次有效期不足30天的证书自动生成提醒发给员工本人和相关管理人员。员工体检记录则按年度归档支持按部门、岗位筛选查询也能设置职业病复查提醒。3.4 培训记录与应急管理培训记录模块主要管理安全培训计划、培训签到记录和考核结果。企业每年都有三级安全教育、应急演练等培训任务系统里面按计划-执行-归档三步走安全部门制定年度培训计划执行时记录参训人员名单和培训照片结束后归档培训资料并统计覆盖率。应急管理模块做一个简化版就够维护应急物资台账、应急组织架构以及应急预案的版本管理。这两个模块在功能上是锦上添花但能显著提升业务完整性。4. 实操落地从项目初始化到核心功能实现4.1 工程结构怎么搭SpringBoot项目的工程结构我建议按业务分包而不是按技术分包。按技术分包是controller、service、mapper这种分法适合小型项目EHS系统业务模块多用按业务分包的方式每个业务域下面的代码放一起维护性更好。我的做法是com.example.ehs ├── common # 通用类统一返回值、异常处理、工具类 ├── config # 配置类CORS、拦截器、定时任务 ├── security # 安全认证JWT工具、登录校验、权限注解 ├── module │ ├── safety # 安全业务隐患、巡检、整改 │ ├── environment # 环境业务监测点、数据、预警 │ ├── health # 健康业务档案、体检、证书 │ ├── system # 系统管理用户、角色、菜单、日志之所以这么分是因为毕业设计项目规模不大按技术分包到后面会越写越乱一个controller目录下面塞几十个文件自己都找不到。按业务分包之后改安全模块就进safety目录改环境模块就进environment目录逻辑清晰很多。4.2 用户权限设计RBAC模型落地权限管理是所有管理系统绕不开的部分。EHS系统我用的是经典RBAC模型用户归属于角色角色绑定菜单和操作权限。后端实现上登录接口用Spring Security JWT完成认证用户登录成功后签发一个有效期为24小时的JWT令牌前端拿到令牌存在本地之后每次请求都在Authorization请求头带上令牌。后端写一个拦截器统一验证令牌有效性并把当前用户信息放入请求上下文。权限控制要做到不同角色看到不同菜单。系统里我预设了四种角色系统管理员、安全管理员、环境管理员、普通员工。管理员能看到全部菜单普通员工只能看到隐患登记、我的待办、我的培训等有限菜单。权限的粒度控制在按钮级别比如隐患登记页面普通员工只能新增登记不能执行整改验收。这些通过自定义注解PreAuthorize结合Spring Security的权限表达式实现。PreAuthorize(hasAuthority(safety:rectify:update)) PostMapping(/rectify/update) public Result updateRectification(RequestBody Rectification rectification) { return rectificationService.update(rectification); }4.3 数据库表设计的关键细节表设计是决定项目后期好不好改的关键。我总结了几个实操中非常重要的小细节。第一每张表都要有id、create_time、update_time、deleted这四件套id用自增主键create_time和update_time用DATETIME类型deleted做逻辑删除避免物理删除数据导致历史记录丢失。第二隐患、巡检、监测数据这类业务表建议带上company_id或者department_id字段虽然毕设场景下不一定有多租户需求但加上这个字段以后做数据隔离和按部门统计都很方便。第三外键能不用就不用表之间的关联通过业务字段维护。比如隐患表和整改表通过hazard_id关联不建物理外键这样删除和批量更新数据时不会被数据库约束卡住。第四大字段要单独处理隐患描述、整改措施这些用TEXT类型搜索的时候不要用LIKE全表扫描毕设阶段数据量不大可以接受但如果想做得讲究一些可以给状态字段、时间字段建上索引。4.4 文件上传与报表展示实现细节隐患照片上传模块我设置了单张不超过5MB的限制文件按日期目录存储文件名用UUID重新生成避免中文文件名乱码和重名覆盖。存储路径配置在application.yml里上传成功后返回给前端的值是文件相对路径前端显示图片时拼接一个固定的访问前缀。要注意的是SpringBoot默认单次请求最大文件大小是1MB如果直接上传超过1MB的图片会报错需要在配置里调大spring: servlet: multipart: max-file-size: 5MB max-request-size: 20MB报表展示这块首页做了数据看板包括隐患整改率、本月巡检次数、环境监测超标次数、培训完成率等核心指标。前端用ECharts的折线图和饼图展示后端提供统计接口SQL使用GROUP BY按时间维度汇总。这里有一个性能优化的点统计查询如果每次都实时计算数据量大了以后会很慢我给首页看板加了一层Redis缓存统计结果缓存5分钟用户刷新页面时直接读缓存体验明显更流畅。5. 常见问题排查与避坑实录5.1 SpringBoot版本和依赖冲突问题做毕设过程中最容易踩的坑就是版本。我刚开始用SpringBoot 3.0以上版本结果发现MyBatis-Plus和Spring Security的兼容性还没有完全跟上网上搜到的很多教程和依赖配置都是针对SpringBoot 2.x的照抄下来不是包冲突就是bean注入报错。后来我果断降回SpringBoot 2.7.x并且锁定MyBatis-Plus 3.5.x和Spring Security 5.7.x整个项目才稳定下来。注意如果选SpringBoot 3.x要注意javax.servlet和jakarta.servlet的区别。3.x版把javax迁移到了jakarta命名空间很多老依赖会直接找不到类。毕设项目如果没有特殊要求建议直接用2.7.x资料多、坑少、稳定。还有一个很常见的问题是Lombok版本和JDK版本不匹配。如果本机JDK是17而Lombok版本太低编译时会报java.lang.ExceptionInInitializerError解法是升级Lombok到1.18.30以上或者在maven里显式指定版本。5.2 数据库连接串容易出错的地方MySQL数据库连接串里有几个参数经常坑人。一个是serverTimezoneMySQL 8.0默认时区是UTC如果不指定serverTimezoneAsia/Shanghai存时间数据时会差8个小时。另一个是SSL参数不加useSSLfalse的话MySQL会提示SSL连接警告。还有allowPublicKeyRetrievaltrueMySQL 8.0以上在本地连接时如果不加这个参数有时候会报Public Key Retrieval is not allowed。完整的连接串建议这样写spring: datasource: url: jdbc:mysql://localhost:3306/ehs_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver5.3 前后端联调时的跨域与鉴权问题前后端分离开发时跨域问题是躲不过的。我踩过一次比较隐蔽的坑后端CORS配置无误前端请求也能发出去但自定义的Authorization请求头总是被浏览器拦截响应里看不到数据。这是因为浏览器在跨域请求前会先发一个OPTIONS预检请求如果后端没有对OPTIONS请求放开拦截器校验JWT拦截器会把预检请求拦下来导致跨域请求失败。解决办法是在JWT拦截器里放行OPTIONS请求if (OPTIONS.equalsIgnoreCase(request.getMethod())) { return true; }另外一个联调问题绕不开404。前端页面能打开但调接口全是404通常是后端Controller的路径映射写错了或者请求方法的类型不对。排查时先把后端日志打开看有没有Request method POST not supported之类的关键提示再逐个检查路径。5.4 毕设答辩时的技术要点最后聊聊答辩。EHS系统在答辩时老师的高频问题就那几个第一为什么选择SpringBoot框架最容易的回答是高效、内嵌容器、自动配置、生态成熟第二系统权限是怎么设计的把RBAC模型和JWT流程讲清楚就够第三隐患闭环的具体流程是什么样的最好能画出流程图把发现、整改、验收这三级状态说清楚第四系统有哪些创新点或改进空间可以结合定时提醒、数据看板、证书到期预警这些细节展开。建议准备一两张系统功能的截图放在PPT里演示时从隐患登记开始走一遍整改和验收流程直接展示业务闭环比干讲架构更有说服力。整套系统从设计到开发我用了大概两个多月的时间真正写代码的时间大概占一半剩下时间都在理业务逻辑和处理各种环境的坑。现在回头看EHS系统这个题目选得值它有真实的企业管理背景技术栈又是当前Java生态的主流组合做完之后无论是对SpringBoot自动装配的理解还是对前后端分离项目从开发到部署的全流程掌握都有明显提升。如果让我重新做一次我会在环境监测模块直接预留设备对接的接口把数据采集做成可以插拔的数据源这样系统的扩展性会更强。希望这篇复盘对你做SpringBoot方向的毕业设计或者企业信息化项目有一点点帮助至少少走几个我走过的弯路。