ARTICLE DETAIL

资讯详情

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

基于Ruoyi前后端分离MES源码实战:从部署到二次开发

基于Ruoyi前后端分离MES源码实战:从部署到二次开发 简介这份资源是基于Ruoyi框架的前后端分离MES制造执行系统源码面向制造业信息化开发者、Java后端与前端工程师以及希望快速搭建生产管理平台的技术团队。系统覆盖系统管理、主数据、物料产品管理、工作站设置、生产排产、节假日与工作日设置、排班日历、仓储管理、库存现有量、条码管理、设备管理、统计报表与大屏展示等模块可支撑从订单排产到库存追踪的完整业务链路。压缩包共113个文件约63.84MB以html页面、py脚本、jpg与png界面截图、mp4演示视频及少量css、js、txt说明为主目录结构清晰便于按模块查阅与二次开发。资源附带详细部署教程能帮助读者快速完成环境配置与项目上线。目前已有69人学习下载适合需要参考成熟MES实现、研究前后端分离架构或进行生产管理系统二次开发的中高级开发者。1. 基于 Ruoyi 的前后端分离 MES 源码一套能落地的制造执行系统长什么样很多做企业信息化的朋友拿到「基于 Ruoyi 框架的前后端分离 MES 源码」这类资源时第一反应是兴奋第二反应是懵——解压出来一堆目录前端 Vue、后端 SpringBoot数据库脚本几百张表README 里写着「导入即可运行」结果一跑就报错。MES 系统开源方案在制造企业里需求很实在车间要报工、要追溯、要看板但真正能跑通「生产工单下发 → 工序报工 → 质量检验 → 库存联动」这条主线的并不多。这套基于 Ruoyi 前后端分离架构的 MES 源码价值在于它把若依框架自带的权限、菜单、代码生成器直接复用省掉了从零搭后台管理的时间把精力集中在制造业务本身。它适合中小制造企业的 IT 负责人、想接 MES 私活的 Java 开发者以及拿它做课程设计或项目实训的学生。下面我按「先看懂架构、再动手部署、最后避坑」的顺序把整套东西拆开讲清楚。2. Ruoyi 前后端分离架构拆解MES 业务代码到底写在哪一层2.1 若依前后端分离的目录结构与 MES 模块落点拿到源码先别急着启动花十分钟把目录结构看清楚后面改代码能省一半时间。若依前后端分离版本典型结构是前后端两个独立工程后端基于 SpringBoot MyBatis前端基于 Vue Element UI或 Element Plus通过 RESTful 接口通信。MES 的业务代码通常以独立模块的形式挂在后端工程下前端则新增对应的 views 目录和 api 目录。# 后端典型结构MES 相关模块已标注 ruoyi-mes/ ├── ruoyi-admin/ # 启动模块含 application.yml ├── ruoyi-common/ # 通用工具、注解、常量 ├── ruoyi-framework/ # 安全、拦截器、数据源配置 ├── ruoyi-system/ # 若依自带系统模块用户/角色/菜单 ├── ruoyi-mes/ # MES 业务模块工单、报工、质检、库存 │ ├── controller/ # 接口层对应前端 api 调用 │ ├── service/ # 业务逻辑报工扣料等核心在这里 │ ├── mapper/ # MyBatis 接口 │ └── domain/ # 实体类对应数据库表 └── sql/ # 建表脚本含 MES 业务表 # 前端典型结构 ruoyi-ui/ ├── src/ │ ├── api/mes/ # MES 接口封装 │ ├── views/mes/ # 工单、报工、看板页面 │ └── router/ # 路由菜单由后端动态下发看结构要抓一个关键点MES 的核心业务逻辑几乎都在ruoyi-mes/service里controller 只做参数校验和权限注解真正的「报工后扣减库存、更新工单进度」这类操作在 service 层。很多人改需求时直接改 controller结果事务不生效、并发出问题就是没搞清分层。2.2 前后端分离下 MES 的数据流与权限模型若依前后端分离的权限模型是「后端下发菜单 前端动态路由 按钮级权限指令」。MES 里不同角色看到的界面差别很大车间主任要看工单排产操作工只看到自己工位的报工按钮质检员只看到待检列表。这套权限如果自己从零写很费劲若依已经给了现成的。数据流大致是这样前端登录拿到 token → 请求getRouters接口 → 后端根据用户角色返回菜单树 → 前端动态生成路由 → 页面里用v-hasPermi指令控制按钮显隐。MES 新增一个「报工」功能需要做四件事数据库加菜单记录、后端 controller 加PreAuthorize注解、前端 api 目录加请求方法、views 目录加页面。缺任何一环都会出现「菜单看不到」或「按钮点了 403」。提示若依的菜单权限标识perms要和后端注解里的字符串完全一致大小写都不能错这是新手最常见的 403 来源。理解这套模型后你会发现 MES 源码里那些看起来复杂的角色配置本质就是往sys_menu和sys_role_menu两张表里插数据。想加一个「返工返修」模块照着现有报工模块复制一套菜单和权限标识即可不用改框架代码。3. 本地跑通 MES 源码环境配置、数据库导入与前后端启动3.1 环境清单与版本对齐部署这类项目版本不对齐是翻车的头号原因。若依前后端分离对 JDK、MySQL、Redis、Node 的版本有隐性要求源码 README 里写的版本往往和实际依赖有出入。下面是我实测能跑通的组合供参考。组件推荐版本说明JDK1.8 或 17看 pom 里 spring-boot 版本2.x 用 83.x 用 17Maven3.6用于后端依赖下载和打包MySQL5.7 或 8.08.0 注意连接串加时区和 allowPublicKeyRetrievalRedis5.0若依用 Redis 存 token 和验证码不启动必报错Node.js14 或 16前端 Vue2 项目用高版本 Node 容易编译失败Nginx可选生产部署用本地开发不需要版本这块有个血泪经验如果 pom 里是 SpringBoot 2.5.xJDK 就老老实实用 8别图新用 17否则启动时各种反射相关的报错能让你查半天。前端同理Vue2 项目配 Node 16 最稳Node 18 以上经常卡在 node-sass 编译。3.2 数据库导入与后端配置修改数据库是第一步也是最容易出问题的一步。MES 源码的 sql 目录通常有两个脚本一个若依基础表ry_xxx一个 MES 业务表mes_xxx。导入顺序不能反因为业务表可能有外键依赖基础表。# 1. 创建数据库字符集必须是 utf8mb4 mysql -uroot -p -e CREATE DATABASE ruoyi_mes DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 2. 先导入若依基础脚本再导入 MES 业务脚本 mysql -uroot -p ruoyi_mes sql/ry_20230101.sql mysql -uroot -p ruoyi_mes sql/mes_business.sql # 3. 检查关键表是否导入成功 mysql -uroot -p ruoyi_mes -e SHOW TABLES LIKE mes%;导入完成后改后端配置。核心是ruoyi-admin/src/main/resources/application-druid.yml里的数据库连接以及application.yml里的 Redis 地址。# application-druid.yml 数据源配置 spring: datasource: druid: master: url: jdbc:mysql://localhost:3306/ruoyi_mes?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8 username: root password: 你的密码 # application.yml Redis 配置 spring: redis: host: localhost port: 6379 database: 0 password: # 没设密码就留空参数说明serverTimezoneGMT%2B8是东八区不加会报时区错误useSSLfalse本地开发关掉省事Redis 的database建议单独用一个库别和别的项目混。改完配置后端用mvn clean package打包或者直接在 IDE 里跑RuoYiApplication主类。3.3 前端启动与接口联调前端启动相对简单但接口地址配错会导致所有请求 404。若依前端默认在vue.config.js里配了代理开发环境请求走代理转发到后端。// vue.config.js 代理配置 devServer: { port: 80, proxy: { /dev-api: { target: http://localhost:8080, // 后端地址 changeOrigin: true, pathRewrite: { ^/dev-api: } } } }# 安装依赖并启动 cd ruoyi-ui npm install --registryhttps://registry.npmmirror.com npm run dev启动后浏览器访问http://localhost默认账号 admin / admin123。能登录进去、能看到菜单说明前后端联调通了。如果登录报「验证码错误」检查 Redis 是否启动如果菜单空白检查sys_menu表数据是否导入完整。这一步跑通MES 的工单、报工页面基本就能点开了。4. MES 核心业务模块怎么改工单、报工与库存联动的实现要点4.1 生产工单模块的字段设计与状态机MES 的工单不是简单一张表它承载了「计划 → 下发 → 生产 → 完工」的状态流转。看源码时重点看工单表的状态字段和 service 里的状态变更逻辑。常见做法是用一个status字段配合枚举状态流转必须校验前置状态不能随便跳。// 工单状态枚举常见做法 public enum WorkOrderStatus { CREATED(0, 已创建), RELEASED(1, 已下发), IN_PROGRESS(2, 生产中), COMPLETED(3, 已完工), CLOSED(4, 已关闭); // 状态流转校验只能按顺序推进 public static boolean canTransfer(int from, int to) { return to from 1; } }逻辑说明工单从「已创建」到「已下发」需要校验物料是否齐套从「生产中」到「已完工」需要校验报工数量是否达到计划数量。参数上工单表通常有plan_qty计划数量、done_qty已完成数量、product_id产品、line_id产线这几个关键字段。改需求时如果要加「返工返修」状态注意别破坏原有状态机的顺序校验否则历史数据会乱。4.2 报工逻辑与库存扣减的事务处理报工是 MES 里并发最高的操作多个工位同时报工如果事务和锁没处理好库存会扣成负数。源码里报工的 service 方法通常带Transactional核心步骤是校验工单状态 → 插入报工记录 → 更新工单已完成数量 → 扣减物料库存。Transactional(rollbackFor Exception.class) public int reportWork(WorkReportDTO dto) { // 1. 校验工单状态必须是生产中 WorkOrder order workOrderMapper.selectById(dto.getOrderId()); if (order.getStatus() ! WorkOrderStatus.IN_PROGRESS.getCode()) { throw new ServiceException(工单状态不允许报工); } // 2. 插入报工记录 WorkReport report new WorkReport(); report.setOrderId(dto.getOrderId()); report.setQty(dto.getQty()); report.setReportTime(new Date()); workReportMapper.insert(report); // 3. 更新工单已完成数量用 SQL 原子更新避免并发覆盖 workOrderMapper.increaseDoneQty(dto.getOrderId(), dto.getQty()); // 4. 扣减库存库存不足会抛异常触发回滚 inventoryService.deduct(dto.getMaterialId(), dto.getQty()); return 1; }参数说明Transactional的rollbackFor Exception.class必须加否则默认只回滚运行时异常业务异常不回滚会导致数据不一致。第 3 步的increaseDoneQty建议写成UPDATE ... SET done_qty done_qty #{qty}的原子 SQL而不是先查再改后者在并发下会丢更新。库存扣减同理用UPDATE ... SET stock stock - #{qty} WHERE stock #{qty}影响行数为 0 就说明库存不足。4.3 前后端分离下的看板数据接口车间看板要求实时刷新数据量大时不能每次全量查。常见做法是后端提供一个聚合接口前端定时轮询或走 WebSocket 推送。若依自带 WebSocket 支持但 MES 看板用轮询更简单可控。GetMapping(/dashboard/overview) public AjaxResult overview() { MapString, Object data new HashMap(); data.put(todayOutput, reportMapper.sumTodayOutput()); // 今日产量 data.put(runningOrders, orderMapper.countByStatus(2)); // 生产中工单数 data.put(passRate, qualityMapper.calcPassRate()); // 合格率 return AjaxResult.success(data); }前端用setInterval每 30 秒请求一次注意组件销毁时要clearInterval否则页面切走后请求还在跑时间长了内存泄漏。看板接口的 SQL 尽量走索引report_time和status字段建索引否则数据量上万后查询会明显变慢。5. 部署 MES 源码最容易踩的坑从登录 403 到库存扣负5.1 登录后菜单空白或接口 403现象能登录进首页但左侧菜单是空的或者点某个功能提示「没有权限请联系管理员」。原因通常是菜单数据没导入完整或者角色没分配菜单权限。若依的菜单是存在sys_menu表里的角色和菜单的关联在sys_role_menu。解决用 admin 登录进「系统管理 → 菜单管理」看菜单树是否完整再进「角色管理」确认当前角色勾选了对应菜单。如果是新加的 MES 模块检查sys_menu里有没有对应的记录perms字段是否和 controller 注解一致。5.2 报工并发导致库存扣成负数现象压力测试或多工位同时报工时物料库存出现负数。原因库存扣减没有做原子校验或者事务隔离级别不够。解决把扣减 SQL 改成带条件的原子更新UPDATE inventory SET stock stock - #{qty} WHERE material_id #{id} AND stock #{qty}在 service 里判断影响行数为 0 就抛异常回滚。同时确认Transactional注解生效别在同类内部方法调用那样事务不生效。5.3 前端打包后刷新页面 404现象npm run build打包部署到 Nginx 后首页能打开但刷新子页面报 404。原因Vue 是单页应用路由是前端控制的Nginx 找不到对应的物理文件。解决Nginx 配置里加try_files $uri $uri/ /index.html;把所有找不到的路径都指回 index.html。这是前后端分离项目部署的标配漏了必踩。5.4 数据库时区不对导致时间差 8 小时现象报工记录的时间比实际时间少 8 小时。原因MySQL 连接串没指定时区或者服务器时区是 UTC。解决连接串加serverTimezoneGMT%2B8同时检查 MySQL 全局时区SHOW VARIABLES LIKE %time_zone%必要时在 my.cnf 里设default-time-zone08:00。这个坑不影响功能但报表统计按天分组时会出错。5.5 Redis 未启动导致验证码和 token 失效现象启动后端时报 Redis 连接异常或者登录时验证码一直错误。原因若依用 Redis 存验证码和登录 tokenRedis 没启动或配置的库不对。解决确认 Redis 服务在跑application.yml里的 host、port、password 和实际一致。如果用了多个 Redis 库注意database配置别和其他项目冲突否则会出现「刚登录就掉线」的玄学问题。6. 让 MES 源码真正投产二次开发边界与性能验证技巧拿到源码跑通只是起点真正要投产得知道哪些能改、哪些别碰。若依框架本身的部分权限、菜单、代码生成器尽量别动升级框架时你会感谢自己。MES 业务模块可以放心改但要注意几个边界数据库表结构改动要同步改 domain 实体和 mapper xml别只改表不改代码新增状态要在枚举和前端字典里同步加否则页面显示的是数字不是中文。性能验证有个简单办法用 JMeter 或 Apache Bench 对报工接口压测重点看库存扣减在并发下是否准确。我一般会造 100 个并发报工请求跑完后核对done_qty和库存数量是否和预期一致不一致就说明有并发问题。看板接口则关注响应时间数据量上来后如果超过 2 秒就要考虑加缓存或预聚合。二次开发时我习惯先在ruoyi-mes模块里新建一个自己的包比如custom所有定制代码放这里不直接改原有文件。这样将来框架升级或换源码自己的东西能整体迁移。另外MES 和 ERP 的对接是绕不开的工单来源、库存同步这些接口建议用定时任务 中间表的方式别做实时强耦合一方挂了另一方跟着挂。最后说个我自己的教训第一次部署这类源码时我图省事没看 pom 里的 SpringBoot 版本直接用了 JDK 17结果启动报了一堆InaccessibleObjectException查了两小时才发现是版本不匹配。从那以后我拿到任何源码第一件事就是看 pom 和 package.json 里的版本号先把环境对齐再动手。希望帮到你。本文还有配套的精品资源点击获取
返回列表