微信小程序+SSM+MySQL设备故障报修系统:工单闭环与实战解析
简介设备故障报修小程序毕业设计资料包面向需要完成微信小程序类课题的高校毕业生及Java后端学习者。系统基于微信小程序与SSM框架、MySql数据库开发设计管理员、用户、维修员三类角色管理员端涵盖用户管理、维修员管理、实验室管理、报修信息管理与维修报告管理等模块用户可提交报修、查看维修结果维修员可发布经验分享并提交维修报告业务流程完整适合作为毕业设计或课程项目参考。全部资料共1255个文件以png界面图、js与vue前端代码、java后端源码、json和xml配置、sql数据库文件为主另含mp4演示视频与doc论文文档压缩包大小49.98MB。当前已有130人学习。资料内置源码、数据库脚本、毕业论文和操作演示可按角色理解功能链路也可直接部署运行对搭建同类型报修管理系统很有帮助。1. 从报修单到维修闭环这个设备故障报修小程序把实验室和后勤的人从微信消息里解放了出来很多人做毕业设计最爱选「报修系统」但真正落地的少——要么只做了个表单提交维修员看不到工单要么后台只给管理员看用户这边完全没有状态反馈。这个基于微信小程序 SSM MySQL 的设备故障报修小程序是把「用户报修 → 维修员接单 → 维修报告 → 经验分享」这条链路完整闭环的版本三个角色管理员、用户、维修员各管一段后台用 Java SSM 框架跑在浏览器上前端跑在微信开发者工具里。它既有现成的源码和数据库脚本也有配套的毕业论文和视频演示适合拿去做毕设二次开发也适合不想从零写后台管理系统的团队做原型验证。我拆完这套资源后发现它的价值不在「功能多炫」而在于把「工单流」这件事讲清楚了。2. 项目架构与技术选型为什么是 SSM 微信小程序 MySQL2.1 三层架构与角色权限的落地方式这套系统后台走的是标准的 Java SSM 三层架构Spring 管对象和事务SpringMVC 管请求路由MyBatis 管 SQL 映射。小程序端只负责界面和交互所有数据操作都通过 HTTP 请求打到后台的 REST 接口上。被拆分的资源包里有.classpath和org.eclipse.wst.common.component这类 Eclipse 工程文件说明原始项目是在 Eclipse 里建的导入 IDEA 时需要手动转一下 Maven 结构。三个角色对应着不同的数据权限边界管理员在后台管理用户、维修员、实验室和设备分类用户在小程序端提交报修单、查看维修进度、浏览经验分享维修员接收报修任务、提交维修报告、发布经验分享。这种角色划分在数据库层面就是 user 表里加一个 role 字段后台接口根据 role 做拦截。常见做法是通过拦截器HandlerInterceptor对请求路径做权限匹配管理员路径以/admin/开头小程序端路径以/api/开头。2.2 为什么用 SSM 而不是 Spring Boot现在很多新项目直接上 Spring Boot但 SSM 在这里并没有过时——毕业设计答辩时老师更看重你对框架原理的理解而 SSM 的 XML 配置、声明式事务、MyBatis 的 SQL 手写恰好能把「框架是怎么跑起来的」讲清楚。这套资源里的后台是 SSM JSP 或前后端分离中的一种从main.css.bak、update-password.vue.bak这些文件能看出后端管理界面其实用到了 Vue 组件比如IndexAsideStatic.vue是侧边栏、IndexHeader.vue是顶栏说明管理端是 SSM 提供接口、Vue 做页面的混合模式。如果你接手这套源码我建议保留 SSM 不动因为它和论文里的架构描述完全对应。强行改成 Spring Boot 反而要重写大量配置和依赖管理论文内容也对不上了。真正值得改的是把硬编码的 JDBC 连接信息抽到配置文件里后面我会说在哪改。2.3 数据库层的核心设计意图MySQL 在这里不只是存数据它承担了状态流转的记录职责。报修单从提交到完成要经历「待处理 → 维修中 → 已完成」这几个状态MyBatis 的 update 语句把状态字段从 0 改成 1、1 改成 2。经验分享模块则是维修员把常见故障的排查过程写下来用户端直接可见减少重复报修。这套设计对毕设来说足够完整但对生产环境还缺两张表设备资产表和维修耗材表。论文里提到了实验室管理但没提设备台账如果你要扩展可以在报修单表加一个device_id外键指向设备表这样就能统计「哪台设备报修次数最多」。3. 把源码跑起来从零到小程序端显示报修列表的完整步骤3.1 环境准备JDK、Tomcat、Maven、MySQL 版本怎么配我拆过的毕设项目里翻车概率最高的不是代码本身而是环境版本不匹配。这套资源用的是 SSM所以 JDK 建议 1.8Tomcat 用 8.5 或 9.0Maven 3.6 以上MySQL 5.7 或 8.0 都行。如果你本机已经装了更高版本 JDK比如 17需要把 IDE 的 Project Structure 里的 SDK 改回 1.8否则javax.servlet相关的依赖会报错。MySQL 安装这块没有太多玄学但有一个坑MySQL 8.0 默认的认证插件是caching_sha2_password而项目里数据库连接池如果用的是旧版驱动就会报Public Key Retrieval is not allowed。解决方案是连接 URL 上加allowPublicKeyRetrievaltrue或直接换 mysql-connector-java 8.x 版本。资源包里自带数据库脚本导入时用 Navicat 或命令行都行。# 创建数据库并导入脚本Windows 环境 mysql -u root -p device_repair.sql上面的命令会读取device_repair.sql文件并执行其中的建库建表语句。如果你用 Navicat可以新建连接后右键「运行 SQL 文件」同样效果。导入完成后建议执行show tables;确认核心表都在比如user_info、repair_order、repair_report、experience_share这些。3.2 导入 IDEA/Eclipse 与数据库连接配置修改资源包里的.classpath和.project是 Eclipse 的工程文件用 IDEA 打开时不要直接选 Open而是选择 Import Project 然后选 Maven 或 Eclipse 模式。导入后第一步是找到jdbc.properties或db.properties文件把数据库地址、账号、密码改成你本机的。jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/device_repair?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456这里的useSSLfalse很关键如果你本机 MySQL 没配 SSL 证书但连接串里没关掉 SSL启动时 Tomcat 会报 SSL 握手失败。characterEncodingutf8保证中文不乱码报修单描述字段和维修报告字段都是中文内容这个参数不能省。3.3 启动后台与小程序端联调后台是标准的 Web 项目IDEA 里配置好 Tomcat 后点击运行等控制台出现Spring Context initialized之类日志就说明启动成功。浏览器访问http://localhost:8080/设备报修后台路径进入管理员登录页默认账号通常在数据库初始化脚本里能查到常见的是admin/admin123。小程序端用微信开发者工具导入项目目录选择包含app.js的那一层AppID 先点「测试号」就能跑起来。// app.js 里的小程序全局配置示例 App({ onLaunch: function () { wx.request({ url: http://localhost:8080/api/user/login, method: POST, data: { username: test, password: 123456 }, header: { Content-Type: application/json }, success: function (res) { wx.setStorageSync(token, res.data.data.token) } }) }, globalData: { baseUrl: http://localhost:8080 } })这段代码在 App 启动时向后端发一次登录请求把返回的 token 存到本地缓存。baseUrl是全局请求前缀后面所有页面的wx.request都从这里取值。如果你的后台端口不是 8080或者部署到服务器上换了 IP只需改这一处。3.4 验证第一个核心功能用户提交报修单在小程序端以用户身份登录后进入报修页面。报修表单通常包含实验室名称、设备名称、故障描述、手机号。提交时后端会做非空校验和长度校验。这里有个容易被忽略的细节报修单号是用时间戳生成的字符串不是数据库自增 ID这样做的目的是让工单号可追溯比如BX202405121030001代表 2024 年 5 月 12 日 10 点 30 分 001 号单。如果你想改成自增 ID要同时改后端生成逻辑和前端展示逻辑不建议动。4. 核心业务链拆解从用户报修到维修报告的状态流转4.1 repair_order 表报修工单的状态机设计整个系统的数据核心是报修单表我拆库时重点关注了这张表。报修单的状态字段通常用int类型标记0 表示待处理、1 表示维修中、2 表示已完成、3 表示已关闭。用户提交报修后状态为 0维修员接单后改成 1提交维修报告后改成 2管理员手动关闭工单改成 3。CREATE TABLE repair_order ( id int(11) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 报修单号, lab_id int(11) DEFAULT NULL COMMENT 实验室ID, device_name varchar(64) DEFAULT NULL COMMENT 设备名称, description text COMMENT 故障描述, status tinyint(4) DEFAULT 0 COMMENT 0待处理 1维修中 2已完成 3已关闭, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;status字段是状态机的核心。如果后续要加「待评价」或「已评价」状态在代码里对应枚举类加一个值即可但要注意所有update repair_order set status x的 SQL 都要同步审查否则会出现状态跳变混乱的问题。charsetutf8mb4比utf8更保险因为用户可能在故障描述里输入 emoji 表情utf8存不了 emoji 会报错。4.2 维修员接单与提交报告两条更新语句如何联动维修员在小程序端或后台看到待处理工单点击接单后触发两个动作一是把repair_order.status改成 1二是在repair_report表插入一条初始记录。提交维修报告时再把报告内容填进去状态改 2。这个过程用到了 Spring 的声明式事务Transactional注解保证两步操作要么都成功、要么都回滚。Transactional public void submitReport(Integer orderId, String reportContent) { RepairOrder order repairOrderMapper.selectByPrimaryKey(orderId); if (order null || order.getStatus() 2) { throw new BusinessException(工单不存在或已完成); } // 更新工单状态为维修完成 repairOrderMapper.updateStatus(orderId, 2); // 插入维修报告 RepairReport report new RepairReport(); report.setOrderId(orderId); report.setContent(reportContent); report.setCreateTime(new Date()); repairReportMapper.insert(report); }这段代码里的事务很重要如果 report 插入失败而 order 状态已经改了用户端会看到系统显示维修完成但没有报告这在答辩演示时会非常尴尬。BusinessException是自定义异常会被全局异常处理器捕获并返回友好提示而不是把堆栈抛给前端。4.3 经验分享模块维修员写的知识库如何推送给所有用户维修员可以在小程序端发布经验分享内容是文本加图片。用户端有一个经验列表页可以按分类筛选。这个模块比想象中实用因为很多实验室设备故障是重复性的比如投影仪无法开机、电脑蓝屏维修员把排查步骤写下来用户下次可能自己就解决了。经验分享表的结构简单但要注意图片存的是 URL 还是 base64。常见做法是维修员在小程序端先调用wx.uploadFile把图片传到后台后台保存到服务器或 OSS 上数据库只存 URL 字符串。如果直接用 base64 字符串塞进 MySQL 的text字段数据量会爆炸单条记录轻松超过 1MB查询和备份都会变慢。CREATE TABLE experience_share ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(100) NOT NULL, content text, image_url varchar(255) DEFAULT NULL COMMENT 封面图URL, category varchar(32) DEFAULT NULL COMMENT 分类电脑/投影/网络, publisher_id int(11) DEFAULT NULL COMMENT 发布人ID即维修员ID, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里没建外键约束是因为 MyBatis MySQL 在毕设场景下最好别依赖物理外键逻辑外键足够publisher_id关联user_info.id。物理外键的问题在于更新和删除时要先检查关联表事务范围扩大对并发不友好。答辩时如果老师问为什么没外键你就说「用逻辑外键 事务控制保证一致性提高写入性能」。4.4 管理后台的人与实验室管理管理员在后台的职责是维护基础数据。用户管理对应的是小程序注册用户的审核或封禁维修员管理是分配维修权限实验室管理是维护楼栋、房间号、负责人信息报修信息管理是查看所有工单并按状态筛选。这些功能本质都是单表 CRUDSSM 里用 MyBatis 逆向工程生成的 Mapper 就能搞定。一个容易忽略的细节是实验室表和报修单表的关联。如果报修单要展示「哪个实验室的哪台设备」需要repair_order表存lab_id查询时 joinlab表取lab_name。如果资源包里的报修单表没有lab_id字段而是直接用description里的文本描述实验室名称那查询效率会低而且统计不准确。你拿到源码后先看这个设计如果要加字段记得同步改小程序端的报修表单。5. 避坑指南我拆这套毕设时踩过的五个典型坑5.1 报修单中文乱码Tomcat 控制台乱码但页面正常现象小程序端提交的报修单描述在后台数据库里变成问号但管理员页面显示正常。原因Tomcat 接收 HTTP 请求时POST 参数默认按 ISO-8859-1 解码中文就乱了页面显示正常是因为后端设置了响应编码为 UTF-8。解决在web.xml里加 Spring 的 CharacterEncodingFilter强制请求和响应都走 UTF-8。filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filterforceEncodingtrue表示不管请求头里有没有 charset都强制用 UTF-8 处理。这个过滤器必须放在所有过滤器链的最前面否则后面再解一次仍然会乱。5.2 小程序端无法访问后台接口request 合法域名校验现象微信开发者工具里请求http://localhost:8080报url not in domain list。原因小程序正式环境要求所有请求域名必须是 HTTPS 且在 mp 后台配置过合法域名。开发模式下可以在「详情 → 本地设置」勾选「不校验合法域名」。解决开发阶段点开微信开发者工具的右上角详情勾选「不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书」就可以直接请求本机接口。上线时必须换成配置好的 HTTPS 域名否则用户手机打开小程序会是白屏加报错。5.3 MySQL 8.0 连不上Public Key Retrieval 玄学现象Tomcat 启动时报Public Key Retrieval is not allowed偶尔重启几次又能连上极其玄学。原因MySQL 8.0 默认认证插件是caching_sha2_password客户端第一次连接需要向服务器获取公钥但 JDBC 驱动默认不自动获取。解决在jdbc.url后面加allowPublicKeyRetrievaltrue或者把数据库用户的认证插件改成mysql_native_password。改插件命令ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;我更推荐前者因为改插件会影响数据库安全策略。5.4 .bak 备份文件混在源码里Eclipse 或 IDEA 编译报错现象资源包里有main.css.bak、update-password.vue.bak这些文件名导入项目后 IDE 提示解析错误。原因.bak是文本编辑器的自动备份文件不是源码文件IDE 无法识别它的语言类型如果放在源码目录下会被当成普通文件参与编译对于 Java 项目不会编译但 Vue 或 CSS 插件会尝试解析。解决导入项目后先把所有.bak文件删掉或移到_backup文件夹然后执行 Maven Clean再重新编译。删之前建议用文本编辑器打开看一眼确认是不是改过的版本有些同学会把改坏的文件存成.bak里面反而是老版本代码这时候要想清楚以哪个为准。5.5 后台启动后端口被占用Tomcat 起不来现象启动 Tomcat 报Port 8080 was already in use。原因可能之前启动过一次没关干净或者系统里有其他服务占用了 8080。解决先杀掉占用进程。Windows 下用netstat -ano | findstr 8080找到 PID再taskkill /PID 1234 /F。也可以直接改 Tomcat 端口在conf/server.xml里把 Connector 的 port 改成 8081但这时候要同步改小程序端globalData.baseUrl里的端口号否则两边对不上。6. 把毕设变成可用系统报表统计、部署技巧与答辩加分项6.1 用 SQL 统计报修数据给答辩加一个「数据看板」这套系统的后台管理界面有报修信息管理但缺少一个统计维度。你可以基于现有的表结构用一条 SQL 统计每个实验室的报修次数在小程序端或后台加一个简单的柱状图页面。这个功能难度适中但答辩时非常出彩因为它展示了你不是只会 CRUD而是能基于数据做分析。SELECT lab.lab_name, COUNT(o.id) AS repair_count FROM repair_order o LEFT JOIN lab lab ON o.lab_id lab.id WHERE o.create_time DATE_SUB(NOW(), INTERVAL 3 MONTH) GROUP BY lab.lab_name ORDER BY repair_count DESC LIMIT 10;这里的关键点是LEFT JOIN而不是INNER JOIN这样即使某个实验室还没有报修记录也会出现在结果集里count 为 0前端展示时更友好。实现图表时小程序端可以用wx-charts插件后台管理页可以用 ECharts两者都是引入一个 JS 文件的事。6.2 部署到服务器从 localhost 到公网可访问毕设答辩时如果能在自己的笔记本上演示就够用了但如果想让老师或同学通过手机访问可以考虑部署到云服务器。部署前要改三处一是jdbc.properties里的数据库地址换成线上地址二是小程序端的baseUrl换成服务器的公网 IP 或域名三是服务器防火墙和安全组放行 8080 端口。# 云服务器上打包并部署以 Ubuntu 为例 mvn clean package -DskipTests cp target/device-repair.war /opt/tomcat/webapps/ systemctl restart tomcatmvn clean package会跳过测试并打出 war 包放进 Tomcat 的 webapps 目录后Tomcat 会自动解压部署。如果你服务器上已经装了 Nginx建议用 Nginx 反向代理/api/路径到localhost:8080这样小程序端请求的域名不带端口号更像生产环境。小程序上线前别忘了在 mp 后台把域名加进 request 合法域名列表。6.3 把资源包里被遗忘的东西用起来资源包里有1-install.bat和2-run.bat这两个批处理文件很多同学从来不看但这其实是作者留给你的「后悔药」。一般1-install.bat是做环境初始化比如自动导入 SQL、创建目录2-run.bat是启动项目。你可以在答辩前把这两个脚本里的路径改成你机器上的实际路径一键演示环境搭建评委看了会觉得你工程化能力很强。那两个.json和.component文件是 Eclipse 的工程描述文件不用管它们。真正重要的是src目录下的 Java 源码和resources目录下的 XML 配置拆项目时先把这两个目录的层级结构理清再对照论文里的系统设计图基本半小时就能定位到核心代码在哪。我自己的习惯是拿到任何毕设源码先不急着跑先把数据库脚本里所有表的主键、外键、状态字段注释过一遍再打开项目里的jdbc.properties、applicationContext.xml、web.xml看看框架配置有没有缺依赖。这样能把运行期的坑提前摁死。这套系统拆到这里其实最值钱的部分不是代码本身而是「报修工单 角色权限 知识库沉淀」这套业务逻辑你把它吃透换成 Spring Boot 或者 Vue 3 技术栈重写就是一份全新的工作项目。希望这份拆解笔记能帮到你少走几步弯路。本文还有配套的精品资源点击获取