简介:这套设备故障报修小程序毕设资源,面向计算机专业毕业生与微信小程序开发者,解决设备报修管理系统的设计与实现。项目基于微信小程序+SSM+MySql开发,设管理员、用户、维修员三个角色,覆盖报修提交、维修报告、经验分享等完整业务模块,后台用Java SSM框架,数据库MySQL,结构清晰、便于二次开发。
资源包共1255个文件,约49.98MB,主体为Java源码、Vue后台页面、微信小程序wxml/wxss/js文件、SQL脚本及论文文档,另有演示视频和启动脚本,覆盖环境配置到部署运行全链路,方便快速搭建项目。已有131人学习,适合需要完整毕设案例、想掌握SSM与小程序联调的读者。内含毕业论文与视频演示,可对照操作完成复现,兼具参考与实用价值。
1. 设备故障报修小程序:这个毕设包到底值不值得花时间拆
先说结论:如果你正在做基于微信小程序的毕业设计,又不想从零画原型、写接口、调联调,这套「小程序+SSM+MySQL」的三端闭环项目包可以省下至少两周的重复劳动。它覆盖了微信小程序用户端、维修员端,以及基于SSM框架的Web管理后台,三个角色、七张核心业务表,还配了毕业论文和视频演示,属于那种「代码能跑通、论文能交差」的完整交付物。
很多同学拿到这类资源第一反应是双击1-install.bat,然后卡在环境变量上报错。这篇笔记我从项目结构、数据库设计、启动顺序、微信开发者工具导入、常见坑这几个维度把它拆透,你照着做就能在本地把整条报修流程跑起来——从用户提交报修、维修员接单、提交维修报告,到管理员在后台看全量数据。废话不多说,直接从这套系统最值钱的部分开始。
2. 系统结构与技术选型:三个角色是怎么通过七张表协作的
2.1 角色权限拆解:管理员、用户、维修员的数据边界
这套系统最值得学习的是它的角色设计。管理员、用户、维修员三个身份并不只是登录入口不同,而是从功能菜单到数据权限都做了隔离。管理员跑在Web端后台,用SSM框架渲染管理页面;用户和维修员跑在微信小程序端,通过请求后端接口获取数据。
管理员的功能集中在后台管理系统里,包括个人中心、用户管理、维修员管理、实验室管理、经验分享管理、报修信息管理和维修报告管理。用户在小程序端能做的事是查看经验分享、对实验室设备发起报修、查看维修结果、在留言板留言。维修员则多了一个发布经验分享的入口,能查看分配给自己的报修信息、提交维修报告。
这种设计的巧妙之处在于「实验室管理」的存在。报修不是直接报给某个维修员,而是先绑定到具体实验室,再由管理员或维修员处理,这样既方便统计设备故障分布,也能让维修任务按实验室维度去分配。数据权限上,用户只能看到自己提交的报修单,维修员只看到自己负责的报修单,管理员看全部,对应SQL查询里where条件的写法也不一样。
2.2 SSM框架落地方式:SpringMVC控制器、Service层与MyBatis映射
项目后台是标准的Java SSM组合,Spring管理Bean,SpringMVC处理路由,MyBatis负责数据库操作。它和SpringBoot的最大区别在于配置是XML和注解混着来的,这对习惯了SpringBoot的同学会有点不适应,但它在毕业设计里依然被广泛使用,因为论文好写、原理好讲。
我拆这个包的时候发现控制器层的命名很规整,比如报修信息模块对应的是RepairInfoController,维修报告对应RepairReportController。每个Controller遵循「先查分页列表、再查单个详情、然后新增、编辑、删除」的固定套路。Service层接口和实现分离,比如RepairInfoService和RepairInfoServiceImpl,这种写法在答辩时被问到「分层架构的意义」能直接答上来。
MyBatis的mapper文件是这套项目里需要重点看的部分。动态SQL基本都写在XML里,用if标签做条件拼接。比如后台管理员的报修列表查询,会按报修单号、用户、实验室名称做模糊搜索,对应的SQL片段是这样的:
<select id="queryRepairInfoList" resultType="map" parameterType="map"> SELECT r.id, r.repair_code, r.user_id, u.user_name, r.lab_id, l.lab_name, r.repair_desc, r.repair_status, r.create_time FROM repair_info r LEFT JOIN sys_user u ON r.user_id = u.id LEFT JOIN lab_info l ON r.lab_id = l.id <where> <if test="repairCode != null and repairCode != ''"> AND r.repair_code LIKE CONCAT('%', #{repairCode}, '%') </if> <if test="labName != null and labName != ''"> AND l.lab_name LIKE CONCAT('%', #{labName}, '%') </if> <if test="status != null"> AND r.repair_status = #{status} </if> </where> ORDER BY r.create_time DESC </select>这里的LEFT JOIN把报修单和用户表、实验室表关联起来,避免在Java代码里做二次查询。如果你是拿来改造成自己的毕设,建议保持这种join写法,因为MyBatis的resultType="map"能直接返回带实验室名和用户名的结果集,小程序端拿到就能渲染,不用再做数据拼装。参数传递用的是Map而不是DTO,这在小型项目里够用,但答辩时被问到「为什么不定义实体类」需要能解释清楚——Map灵活、减少类数量,缺点是类型不安全,项目规模不大时可以接受。
2.3 数据库设计:报修状态流转是核心主键和业务表
数据库方面,MySQL是本地部署的,导入sql文件就能用,数据库名一般叫repair_db或者wx_repair之类的,具体以你拿到的sql文件为准。核心业务表我列一下结构,方便你对照:
| 表名 | 核心字段 | 作用 |
|---|---|---|
| sys_user | id, user_name, password, role_type | 用户和维修员共用一张表,role_type区分身份 |
| lab_info | id, lab_name, lab_location, manager | 实验室基础信息 |
| repair_info | id, repair_code, user_id, lab_id, repair_desc, repair_status, create_time | 报修单主表,状态字段贯穿整个流程 |
| repair_report | id, repair_info_id, repair_result, report_time, repairer_id | 维修员提交的维修报告 |
| experience_share | id, title, content, publisher_id, create_time | 经验分享内容 |
| message_board | id, user_id, content, reply_content, create_time | 留言板 |
这里最核心的是repair_info这张表的repair_status字段,它驱动着报修流程的状态机。通常的设计是「待处理-处理中-已完成」,对应前端小程序里的不同展示状态。改造的时候如果你想加一个「已驳回」或者「待确认」状态,只需要改这个字段的值和前端判断逻辑,不需要动表结构。
3. 部署启动:从安装脚本到第一行日志
3.1 环境准备清单:JDK版本、Maven、MySQL字符集
启动这套项目之前,先把环境对齐,不然报错了你会怀疑是代码问题。我实际拆包时用的环境是JDK 1.8、Maven 3.6.3、MySQL 5.7。如果你用的是MySQL 8.x,有两点必须调整:一是驱动依赖的版本,pom.xml里如果引入的是mysql-connector-java 5.1.x,连MySQL 8会直接报ClassNotFoundException或者Public Key Retrieval is not allowed;二是连接串里要加useSSL=false和allowPublicKeyRetrieval=true。
JDK版本不能太高,很多SSM框架老项目在JDK 11以上跑会报java.lang.NoClassDefFoundError跟javax.xml.bind有关的错误,因为JAXB从JDK 11开始移除了。如果你电脑上只有高版本JDK,两种解法:一是装一个JDK 8单独给这个项目用,二是在pom.xml里引入jaxb-api依赖,但更推荐前者,省事。
项目根目录下有两个bat脚本,1-install.bat和2-run.bat,这个设计思路是先执行安装脚本初始化环境,再执行运行脚本启动服务。1-install.bat的核心逻辑一般是检查本地Maven环境、执行mvn clean install或者直接编译打包,然后把war包或者jar包放到指定位置。
@echo off echo ======================================== echo 正在检查Maven环境... mvn -v >nul 2>&1 if %errorlevel% neq 0 ( echo [ERROR] 未检测到Maven,请先安装并配置环境变量 pause exit /b 1 ) echo Maven环境正常,开始编译项目... call mvn clean package -DskipTests echo 编译完成,war包已生成到target目录 pause这段脚本里mvn clean package -DskipTests是关键,-DskipTests跳过单元测试能避免测试类报错导致打包中断。如果你本地Maven私服配置了镜像,第一次执行会比较慢,因为要下载大量依赖。用阿里云镜像的同学注意,某些老版本的SSM依赖在阿里云私服上可能找不到,遇到下载失败就把仓库切回Maven中央仓库再试一次。
3.2 数据库初始化:导入SQL文件后必须做的事
拿到项目包后,数据库这块我建议不要直接双击导入就完事,有几件事需要做。第一步是创建数据库实例,用utf8mb4字符集,不然小程序端传上来的emoji表情或者特殊符号入库时会报Incorrect string value错误。
第二步是检查sql文件里的时间和自增主键设置。老项目导出的时候可能会带DEFINER=root@localhost这类视图定义,新环境如果没有对应权限的账号,导入存储过程或视图会报错。解决办法是用文本编辑器打开sql文件,把DEFINER=root@localhost全部替换成DEFINER=当前用户,或者直接删掉这部分。
CREATE DATABASE IF NOT EXISTS repair_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE repair_db; -- 导入完成后执行一条测试SQL SELECT COUNT(*) FROM sys_user;导入完成后,强烈建议先确认sys_user表里有没有初始账号。很多毕设项目会有个默认admin账号,密码可能是admin123或123456,存在这张表里。如果sql文件里没有初始数据,你需要手动插入一条管理员账号,不然后台登录入口都进不去。
3.3 启动顺序:后台服务先起还是小程序端先起
通用顺序是先启动后端服务,再用微信开发者工具打开小程序前端。后端服务如果是war包形式,通过tomcat的webapps目录部署,需要先启动tomcat;如果是jar包形式,直接java -jar xxxx.war或java -jar xxxx.jar即可。个人推荐jar包方式,因为这两个bat脚本大概率就是按这个逻辑写的。
启动成功的标志是控制台出现类似SpringMVC框架初始化完成的日志,接着是Tomcat started on port(s): 8080这样的信息。如果你的8080端口被占用了,两个处理方案:一是找到占用进程杀掉,二是改tomcat的server.xml端口配置,但改了端口之后小程序端请求接口的baseURL也要同步改,不然请求全部失败。
我见过很多同学卡在这一步,启动日志显示成功但小程序请求接口还是失败,大概率是请求地址写的是localhost,而微信开发者工具模拟器里localhost指向的是开发机,不是你的电脑。后端接口部署在电脑上,小程序模拟器请求要用http://127.0.0.1:8080或者你电脑的局域网IP,并且要在微信开发者工具里勾选「不校验合法域名」。
4. 微信小程序端对接:登录态、报修流程与接口联调
4.1 小程序登录与后端Session的设计
小程序端不是通过传统账号密码登录到Web端后台,而是用户在微信小程序里做登录注册,先调微信的wx.login拿到code,再把code发给后端换取session。但要注意,这套项目的登录逻辑很可能简化成了直接提交账号密码到后端,然后再进入首页。原因是纯微信生态的登录需要小程序AppID和AppSecret,而毕设项目不会真的去申请微信开放平台,所以一般用的是模拟登录。
看小程序代码时先找utils目录或者request目录下的封装文件。一般会有一个request.js或api.js封装wx.request,统一的baseURL在这里配置。你需要做的事是把baseURL改成后端实际地址。
// utils/request.js 示例 const BASE_URL = 'http://127.0.0.1:8080/repair-admin'; const request = (url, method = 'GET', data = {}) => { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + url, method: method, data: data, header: { 'Content-Type': 'application/json', 'token': wx.getStorageSync('token') || '' }, success: (res) => { if (res.data.code === 200) { resolve(res.data.data); } else { wx.showToast({ title: res.data.msg, icon: 'none' }); reject(res.data); } }, fail: (err) => reject(err) }); }); }; module.exports = { request, BASE_URL };这个封装里有几个设计值得学习:一是把token存在本地storage,每次请求通过header带给后端,后端用拦截器校验登录态;二是统一处理code不等于200的业务异常,前端页面不用每个请求都写错误弹出逻辑。如果你拿到的版本没有token拦截器,只有简单的Session校验,那也是常见做法。只改BASE_URL这一个变量,然后全项目调用都会生效。
4.2 用户报修流程:从选择实验室到提交报修单
用户端的核心路径是「首页 → 实验室列表 → 选择实验室 → 填写故障描述 → 提交报修」。小程序页面对应的大概率是pages/repair/repairForm这类文件。报修单号一般是后端生成的,格式可能是repair_code字段,由时间戳加随机数拼接,保证唯一性。
提交报修时最容易被忽视的是图片上传。如果项目支持用户拍照上传设备故障照片,用的是wx.chooseImage或wx.chooseMedia接口,上传到后端的接口路径通常是upload/image。这个功能在生产环境需要处理图片存储路径和静态资源映射,但在毕设项目里往往就是存到服务器某个目录然后返回相对路径。如果你不想折腾图片上传,可以在前端把上传按钮隐藏,报修描述改成纯文本就够演示了。
维修员端的关键流程是「查看待处理报修 → 接单/开始处理 → 填写维修报告 → 提交完成」。前端对应的状态判断一般这么写:
// 维修员更新报修状态的页面逻辑 updateRepairStatus(repairId, status) { const url = status === 2 ? '/repairInfo/finish' : '/repairInfo/accept'; request(url, 'POST', { repairId: repairId }).then(res => { wx.showToast({ title: '操作成功', icon: 'success' }); this.loadRepairList(); }); }状态字段的含义和数值映射要跟后端保持一致,后端接口的字段名是repairStatus还是repair_status,前端参数就要对应传。这块是对接最容易翻车的地方,因为Java后端返回的JSON用驼峰命名,而MySQL表字段用下划线命名,MyBatis如果开启了mapUnderscoreToCamelCase,返回的JSON会自动把repair_status转成repairStatus。没开的话,前端拿到的是repair_status,页面绑定的却是repairStatus,就显示不出来。遇到这种问题先查MyBatis配置里有没有这一行:
<setting name="mapUnderscoreToCamelCase" value="true"/>没配置就加上,或者在resultMap里手动做字段映射。这是拆这类SSM项目必查的一个点,很多页面数据空白不是接口没返回,而是字段名对不上。
4.3 经验分享和留言板:两个简单模块的复用价值
经验分享和留言板在功能上属于「低复杂度高复用」的模块,非常适合用来理解这套项目的前后端交互模式。经验分享是维修员发布设备维修经验,用户在小程序端阅读;留言板则是用户留问题,管理员或维修员回复。两个模块都是「列表+详情+发布」的标准结构,没有复杂的业务状态,代码可读性最好。
我建议你把这两个模块当切入学习的入口,先跑通一个简单的列表页接口,再去看报修和维修报告这种多状态流转的业务,思路会顺很多。后端对应的Controller是最简单的List查询加Insert操作,前端页面也是onLoad拉数据、onPullDownRefresh做下拉刷新。这种「从易到难」的拆代码顺序,比直接看维修报告模块要友好得多。
5. 部署与使用中的常见问题排查:五个必踩的坑
5.1 启动Tomcat后访问404:项目没部署到webapps
现象:双击2-run.bat,Tomcat成功启动,浏览器访问后台地址返回404。
原因:war包没有被Tomcat自动解压部署。很多用了IDE部署方式的同学,war包在target目录下,但Tomcat的webapps目录里什么都没有。bat脚本只启动了Tomcat,没有把war包拷贝到webapps目录下。
解决:手动把target目录下的war包复制到Tomcat的webapps目录,再重启Tomcat。或者直接改bat脚本,在启动前加一行copy命令把war包拷贝过去。
5.2 小程序请求接口报ERR_CERT_COMMON_NAME_INVALID
现象:微信开发者工具里发起请求,控制台报SSL证书错误,请求根本发不出去。
原因:微信开发者工具默认强制HTTPS,对手动配置的本地HTTP接口会拦截。你调的是http://127.0.0.1:8080,不是HTTPS协议。
解决:在微信开发者工具右上角详情 → 本地设置里勾选「不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书」。如果用的是真机预览,需要在手机端打开开发者模式或者用调试模式,但模拟器联调阶段勾选这个选项就够用了。
5.3 登录后接口返回未登录或token失效
现象:小程序里登录成功后,请求登录后的接口还是提示未登录,或者返回401状态码。
原因:登录态校验失败。常见情况是后端拦截器从Header里取token的字段名,和前端request.js里传的字段名不一致。比如前端传的是token,后端拦截器取的是Authorization,匹配不上。
解决:去后端找到拦截器或过滤器类的代码,看它从哪个Header取token,改成和前端一致。前端一般传token,后端取token就行。改完之后重启后端,小程序重新编译再试。
5.4 数据库中文乱码或插入失败
现象:前端提交报修信息时,描述里含中文,入库变成???,或者直接报SQLException。
原因:数据库表字符集不是utf8mb4,或者连接串里没有指定characterEncoding=UTF-8。MySQL的默认字符集可能是latin1,中文字符存不进去。
解决:修改数据库连接URL加上characterEncoding=utf8mb4&useSSL=false。同时检查表的字符集,执行ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;。这两个都做了,乱码问题基本能解决。
5.5 jar包启动后端口被占用
现象:执行2-run.bat,控制台报Port 8080 was already in use,Tomcat启动失败。
原因:本机已经有一个进程占用8080端口,常见的是之前启动的Tomcat没关掉,或者别的前端开发服务器占了这个端口。
解决:按Win+R输入cmd,执行netstat -ano | findstr 8080,找到占用端口的PID,然后taskkill /PID 对应PID /F。或者干脆改项目的端口配置,但注意改端口后小程序端的BASE_URL也要同步改。
6. 把demo变作品:报修状态自定义与消息通知的改造思路
如果只是把项目跑通就能毕业,你已经拿到及格分。但如果想让答辩更有亮点,或者未来放到简历上,我建议花两天做两个小改造,成本低但收益明显。
第一个是报修状态的自定义。原始项目可能只有待处理和处理中、已完成三个状态,这个流转过程没有闭环——用户提交报修后,如果维修员一直不处理,就没有超时提醒或者催办机制。你可以加一个「催办」功能:用户在小程序端点击催办按钮,对应报修单的处理优先级被置高,后台列表按优先级排序,维修员端的小程序首页显示待优先处理的报修。实现方式很简单:在repair_info表加一个priority字段,小程序端调接口更新字段值,维修员端列表页多一个排序条件。这是能写进论文的创新点,而且改动量在一个方法以内。
第二个是维修完成后的消息提醒。不管是小程序还是微信公众号,推送消息需要模板消息或订阅消息权限,在毕设阶段跑不通。但你可以换个思路模拟这个通知:维修员提交维修报告时,状态置为已完成,用户端的报修列表增加一个未读标记,没有查看过维修结果的报修单在列表左上角显示红点。这需要用一张表记录用户最近查看时间,查询时比对create_time。改动也不大,但体验一下子就接近真实产品了。
最后说一点我拆这类项目的心得。很多同学拿到源码习惯先跑起来再说,但跑起来之后一定要做一件事:把「报修单从提交到完结」的完整数据流在代码里走一遍,从前端页面发起请求、到Controller接收、Service处理、Mapper查库、数据库落表、返回JSON、前端渲染,每一步都在代码里找到对应位置。这个动作做完,答辩的时候不管老师问哪一层你都能答得上来。
从那以后我每次拿到毕设项目包,都强制自己先梳理业务流程而不是先跑代码。这个习惯在调试复杂系统时救了我很多次。希望这篇笔记能帮你少走一点弯路,也祝你这套报修小程序顺利跑通,答辩顺利。
本文还有配套的精品资源,点击获取