简介面向计算机专业毕业设计、课程设计场景这份源码包提供完整的上门维修系统实现采用微信小程序JavaMySQL架构划分为用户端、维修员端与管理后台覆盖维修下单、记录管理、评价系统及广告资讯等典型业务模块既能支撑论文答辩也方便二次拓展。压缩包共1249个文件、26.02MB内含123个Java后端类、145个Vue页面、49个wxml/wxss小程序文件、16个xml配置及1个sql数据库脚本另有大量png、jpg图片与启动/备份脚本目录划分清晰可在Eclipse/Idea与微信开发者工具中直接导入运行。目前已有87人浏览学习适合需要快速搭建同类系统、梳理毕业设计文档或理解前后端联调流程的开发者。除运行环境JDK1.8、MySQL5.7、Tomcat7等说明外还保留了bat启动脚本、备份配置等细节有助于还原部署环境并掌握项目结构要点。1. 这个三端维修系统值不值得下先看清它的业务闭环和坑点微信小程序毕业设计里每年都有大量学生选“上门维修”这个题因为业务足够贴近生活功能边界清楚评委一眼能看懂。你手上这套资源就是典型的三端结构用户端、维修员端、管理员端共用一套Java后端和MySQL库小程序只负责展示和交互核心判断全部落到后端。它真正值钱的地方不在单个页面而在“用户下单—维修员接单—填写记录—用户评价—管理员监督”这条闭环上只要把这套闭环跑通答辩基本就站住了。适合想省时间、不想从零搭框架、又怕“打不开跑不起来”的毕业设计或课程设计用户。后面几章我会按复现顺序把环境、建库、启动、踩坑一次讲透。2. 技术栈拆解为什么Java 1.8MySQL 5.7Tomcat 7到2024年照样能跑毕业设计2.1 技术选型一套看着老却稳得出奇的组合这套资源在环境上写得很明确JDK 1.8、MySQL 5.7、Navicat 11、Maven 3.3、Tomcat 7前端开发工具是HBuilderX或微信开发者工具。很多人一看到JDK 1.8和Tomcat 7就觉得过时实际上对毕业设计来说这套组合恰恰是“少折腾”的代名词。JDK 1.8是目前绝大多数高校机房和二手笔记本上存在的版本MySQL 5.7和Navicat 11的兼容性极好很多网上教程都是按这个版本组合截图写的遇到问题搜得到答案。组件版本要求说明JDK1.8后面所有Maven依赖和Tomcat部署都依赖这个版本不要装17或21MySQL5.7和小程序的JSON交互没问题排序、分组也够用Maven3.3 或更高主要用于拉取Spring相关依赖包Tomcat7有些模板用内嵌Tomcat你在IDE里直接启动也行前端工具HBuilderX / 微信开发者工具如果用HBuilderX打开通常意味着工程是uni-app形态这套栈还有一层好处你答辩时被问到“为什么不用MySQL 8.0”“为什么不用Spring Boot 3”完全可以用“兼容性优先”“教材和参考实现都基于这套版本”来回应。对于课程设计和本科毕设能跑、能演示、能讲清楚设计思路比追最新版本更能得分。2.2 后端分层Controller→Service→Mapper这条链子在哪儿改解压后你首先看到的是大量.bak文件和bat脚本很多人到这里就懵了。其实.bak是编辑器或开发工具自动生成的备份文件真正参与运行的是同名不带.bak的文件。后端代码整体上会按三层结构组织Controller负责接收小程序端请求Service处理业务逻辑Mapper写SQL或对接MyBatis。大多数毕设模板用的是Spring Boot MyBatis也有老一些的工程是SSMSpringSpringMVCMyBatis但分层套路一样。RestController RequestMapping(/api/repair) public class RepairController { Resource private RepairService repairService; GetMapping(/list) public Result list(RequestParam Integer page, RequestParam Integer pageSize, RequestParam(required false) String keyword) { return Result.ok(repairService.pageList(page, pageSize, keyword)); } PostMapping(/create) public Result create(RequestBody RepairInfo repairInfo) { return Result.ok(repairService.createRepair(repairInfo)); } }这段代码很典型RestController告诉Spring这个类暴露HTTP接口RequestMapping(/api/repair)定下模块前缀GetMapping和PostMapping区分查询和提交。参数里的page和pageSize就是给小程序端分页用的keyword是可选的模糊查询词。你在自己的项目里要改的是Service层里的具体业务Controller基本不动改接口路径时注意小程序端请求地址必须同步改。如果你解压后发现源码不是Spring Boot而是SSM也不用慌。SSM里Controller同样存在只是类上多用Controller加ResponseBodyService层多一堆Service和Autowired本质上还是“方法接收请求—调用业务—返回JSON”。小程序端不关心后端是哪种框架它只认HTTP接口返回的JSON结构这层隔离是好事。2.3 LW是什么bat脚本干什么用项目标题里的“LW”在同类毕设资源里通常指论文/文档位也就是帮你对应开题、任务书、设计说明这类材料的位置。解压后如果看到单独的文档目录里面的说明文件建议先翻一遍重点看数据库脚本说明和运行步骤往往能帮你省下不少试错时间。资源里的1-install.bat、2-run.bat、3-build.bat是Windows下的便捷脚本。按命名习惯推测1-install.bat执行Maven依赖安装2-run.bat启动后端服务3-build.bat做重新打包。用的时候注意两点一是脚本默认带了mvn命令要求你电脑装过Maven并且配了环境变量二是脚本里的端口默认为8080如果被占用就会启动失败。我一般会手动执行脚本里的核心命令方便看清日志而不是黑框一闪而过这个习惯在排查问题时特别有用。3. 复现操作三步走建库、起后端、把小程序送进微信开发者工具3.1 建数据库Navicat导入SQL编码和连接参数别偷懒数据库是整个系统的地基。先用Navicat 11连接本地MySQL 5.7新建一个名为repair的库字符集选utf8mb4排序规则选utf8mb4_general_ci。然后用Navicat的“运行SQL文件”功能导入资源包里的.sql文件。导入完成后你就会看到用户表、维修员表、维修信息表、维修记录表、评价信息表、广告表、新闻资讯表这几张核心表。导入时最容易翻车的点是SQL文件本身是UTF-8编码而Navicat连接默认按本地字符集解析导致中文变乱码。spring.datasource.urljdbc:mysql://localhost:3306/repair?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password123456这是后端常见的数据库连接配置写法。localhost:3306指本机MySQL端口useUnicodetrue和characterEncodingutf8是中文不乱码的关键useSSLfalse避免MySQL 5.7与JDBC驱动的SSL握手报错serverTimezoneAsia/Shanghai防止时间差八小时。密码那栏换成你自己MySQL的密码如果只改密码仍连不上优先检查MySQL服务有没有启动net start mysql或任务管理器里看进程。3.2 起后端install和run到底在跑什么后端启动最稳妥的顺序是先执行依赖安装再启动服务。你看那三个bat脚本1-install.bat大概率是mvn clean install2-run.bat大概率是mvn spring-boot:run或java -jar target/xxx.jar3-build.bat是mvn clean package。直接双击bat如果屏幕上出现BUILD SUCCESS说明依赖没毛病如果一闪而过说明命令失败此时要打开命令行手动执行。mvn clean install -DskipTests mvn spring-boot:run第一条命令把项目的依赖包下载到本地Maven仓库-DskipTests跳过测试减少意外。第二条命令直接启动后端服务日志里出现Tomcat started on port(s): 8080就是起来了。启动完成后用浏览器访问http://localhost:8080/api/repair/list?page1pageSize10能看到JSON数据就说明接口通。注意如果8080被占用日志会报Port already in use这时要么关掉占用进程要么去配置里改端口改完小程序端的基础URL也要跟着改。3.3 跑小程序端HBuilderX与微信开发者工具之间的配合小程序端的工程如果能在HBuilderX里打开说明它是uni-app工程。在HBuilderX里打开项目后先找到配置文件里的基础URL通常在common/request.js或config.js中统一维护。这个URL写的是后端的地址预览到微信开发者工具之前必须改成你电脑的局域网IP否则真机预览时会请求失败。// common/request.js const BASE_URL http://192.168.1.100:8080 function request(url, method GET, data {}) { return new Promise((resolve, reject) { uni.request({ url: BASE_URL url, method, data, header: { Content-Type: application/json }, success: (res) { if (res.data.code 200) { resolve(res.data.data) } else { reject(res.data.msg || 请求失败) } }, fail: reject }) }) } export default { request, BASE_URL }这段封装把网络请求统一到一个函数里后端返回的JSON约定为{ code, data, msg }三条字段code 200表示业务成功。URL里的192.168.1.100要换成你电脑的IP在命令行执行ipconfig可以查到。开发时微信开发者工具要勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”因为本地调试用的是HTTP明文接口不勾选会直接报request:fail。HBuilderX里点“运行→运行到小程序模拟器→微信开发者工具”它会自动拉起微信开发者工具并编译。如果你拿到的是原生小程序工程直接用微信开发者工具打开根目录即可区别不大。提示真机调试时手机和电脑必须在同一WiFi下。电脑防火墙如果拦截了8080端口手机会连不上接口临时关防火墙或添加入站规则即可。4. 三种角色一套闭环从表结构反推界面与状态流转4.1 用户侧首页、广告资讯、维修下单与收藏用户端的功能看着多拆开就三类看内容、提维修单、维护个人信息。用户进入小程序能看到首页、广告信息、新闻资讯和“我的”页面在我的页面里可以管自己的维修信息、维修记录、评价和收藏。这里最核心的是“发维修单”用户填维修类型、问题描述、期望上门时间后端插入一条维修信息记录状态默认“待接单”。收藏功能的实现其实就是一张收藏表存用户ID和收藏对象ID后端提供一个增删查接口。用户端列表页是最容易被答辩老师追问的地方因为数据一多就得做分页。小程序里滚动到底部加载下一页是标准操作对应页面生命周期onReachBottom。data() { return { page: 1, pageSize: 10, list: [], hasMore: true } }, async loadList() { const res await request(/api/repair/list, GET, { page: this.page, pageSize: this.pageSize }) this.list this.page 1 ? res.records : this.list.concat(res.records) this.hasMore res.records.length this.pageSize }, onReachBottom() { if (!this.hasMore) return this.page this.loadList() }page和pageSize是分页参数后端根据这两个值返回第几页的数据。hasMore用来判断还有没有下一页避免滚到底部后反复请求同样的空数据。concat把新数据追加到旧数据后面保证列表不断滚动加载。这个写法可以直接迁移到任何列表页微信小程序原生语法里换成wx.request和this.setData即可。4.2 维修员侧接单处理与维修记录维修员端同样有首页、广告、新闻资讯和“我的”但我的页面里多出了维修信息、维修记录、评价信息的管理。维修员看到的是“待接单”的维修单列表点击接单后维修单状态变为“处理中”同时关联维修员ID。处理完成后维修员写一条维修记录状态变“已完成”用户这时才能对本次维修做评价。这里最值得在答辩时讲的是状态机设计维修信息表里的status字段可以取“待接单、处理中、已完成、已取消”四个值每次状态变更都往维修记录表插一条流水这样就能追溯整个过程。UPDATE repair_info SET status 处理中, worker_id 2 WHERE id 1001 AND status 待接单; INSERT INTO repair_record(repair_id, worker_id, content, create_time) VALUES (1001, 2, 已上门检修更换水龙头并试水, NOW()); UPDATE repair_info SET status 已完成 WHERE id 1001;三条SQL串起来就是一次完整的上门维修过程。第一条用AND status 待接单作为乐观锁条件防止两个维修员同时接同一单第二条落记录把处理内容写入维修记录表第三条收尾改状态。这个“状态变更流水记录”的套路在很多管理系统里通用答辩时讲出来比空谈“面向对象”实在得多。4.3 管理员侧用户管理、维修员管理、内容管理三块管理员端覆盖系统首页、个人中心、用户管理、维修员管理、维修信息管理、维修记录管理、评价信息管理、广告信息管理、系统管理。管理员最大的价值不是修东西而是“调度”和“审计”看到所有维修单、把维修单指派给维修员、审核广告和新闻、删除不合规的评价。管理员功能操作对象常见按钮用户管理用户表查看、禁用、重置密码维修员管理维修员表添加、编辑、删除、分配订单维修信息管理维修信息表指派、修改状态、备注评价信息管理评价表查看、删除、隐藏广告信息管理广告表新增、上下架、排序系统管理系统配置日志、角色、菜单配置实现上管理员和用户、维修员通常通过一个role字段区分而不是单独做一张权限表。模板里用角色字段做区分足够应付毕设答辩老师如果问“权限怎么控制”你就说在后端Controller加角色校验不同角色请求同一接口时按角色过滤数据。如果问“为什么不设计RBAC”可以说“系统角色少、权限固定角色字段方案更直观扩展时可以升级为RBAC”。4.4 广告与新闻资讯最简单的CMS玩法广告和新闻资讯本质上是一张内容表加一张列表页广告信息表存图片、跳转链接、排序值、上下架状态新闻资讯表存标题、正文、封面图、发布时间。管理员在小程序的后台发布内容前台小程序首页拉取列表点击后跳详情页。这里可以说的细节是“排序值”字段广告位置有限首页只需要取status1的记录按sort_order升序返回用SQL的ORDER BY和LIMIT就能实现不需要额外做复杂的推荐算法。内容管理的后端接口通常也是标准的增删改查写起来不复杂但它是演示时最容易出效果的功能因为内容一变前端立刻能看到变化。5. 避坑与常见问题五个实测翻车点按现象排查5.1 小程序白屏加request:fail报错现象小程序在微信开发者工具里能打开但所有列表都是空的控制台出现request:fail或url not in domain list。原因最常见的两个一是BASE_URL里写了localhost而真机模拟里localhost指向的是手机自己不是你的电脑二是微信开发者工具勾选了域名校验对HTTP明文请求做了拦截。解决把BASE_URL改成电脑的局域网IP在微信开发者工具右上角“详情→本地设置”里勾选“不校验合法域名”。改完配置后重新编译接口一般就通了。血泪经验是改完URL之后一定要清掉小程序缓存重新编译有时候代码改了但旧缓存还在容易误判成后端问题。5.2 MySQL连接失败或者中文乱码现象后端启动时报Access denied for user rootlocalhost或者数据库里中文显示成???。原因连接密码和本地MySQL密码不一致多数时候是当初安装MySQL时设置的密码和配置里不一样。乱码则多半是建库时字符集没选utf8mb4或者连接字符串里没加characterEncodingutf8。解决统一密码是最快的ALTER USER rootlocalhost IDENTIFIED BY 123456;可以重置密码。乱码问题先把库的字符集改成utf8mb4ALTER DATABASE repair CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;再把连接URL补齐重启后端即可。MySQL 5.7默认情况下SSL会有告警日志连接串里带上useSSLfalse能消掉这个噪音。5.3 Tomcat端口8080被占用现象后端启动日志出现Port already in use: 8080或者启动后服务访问不了。原因很多电脑上装了别的服务占着8080最常见的是Apache、Nginx或者其他Spring Boot实例没关干净。解决命令行执行netstat -ano | findstr 8080看到占用进程PID再到任务管理器结束对应进程。不想动别的程序就去后端配置文件里把端口改成8081改动后记得小程序端的BASE_URL同步改成http://IP:8081。我习惯的做法是启动前先看一眼端口免得启动到一半才发现冲突。5.4 一堆.bak文件改没反应、删了就炸现象解压后看到大量.bak文件在.bak文件里改了代码重新编译页面没变化把.bak文件删了项目反而报错。原因.bak是IDE或代码生成工具留下的备份文件不是运行文件。你改了备份主文件没变自然不会生效删掉.bak之后某些IDE恢复文件时会找不到素材于是报文件缺失。解决改代码永远改不带.bak的同名文件。编辑器如果开了保存时自动生成备份担心把文件改坏就主动复制一份改名xxx.bak当作后悔药但不要让.bak文件参与编译。如果主文件已经被改坏可以用备份文件改名覆盖回来把IndexMain.vue.bak重命名为IndexMain.vue即可。5.5 登录不上、角色跑偏、token失效现象登录页面提示用户名或密码错误或者登录成功却进入了错误的角色页面再或者用着用着突然提示未登录。原因初始账号密码与数据库种子数据不一致或者本地存储里保留了老token。模板自带的管理员账号通常写在SQL文件的插入语句里如果之前有人改过密码你再用旧密码自然登录不上。token过期也会导致后端拿不到有效身份。解决去数据库对应表里查一条记录SELECT * FROM user WHERE username admin;拿到真实密码或直接用SQL重置密码。登录后清理本地缓存微信开发者工具里“清缓存→清除数据缓存”。我处理这类问题有个固定顺序先把进程全部停掉重置数据库种子脚本再按用户、维修员、管理员三种账号分别登录一次确认角色页面入口正确后再继续改业务。6. 改造与答辩三个替换点把维修系统换成你的课题拿到这套系统后不建议直接改业务代码而是先完成三个替换点把“维修”的痕迹抹掉换成你自己的课题名。第一处是tabBar菜单和页面标题。在uni-app里打开pages.json把每个页面的navigationBarTitleText改成你的课题名tabBar里的文字和图标路径也同步换掉。第二处是数据库里的业务字段语义。比如把“维修类型”改成“预约类型”“故障描述”改成“需求描述”最好是在Navicat里直接改注释字段名可以不动因为代码编译依赖字段名。第三处是登录后的角色名称把用户、维修员、管理员换成你课题里的三类角色比如“业主、物业、平台运营”。答辩演示时最稳妥的方式是按真实业务顺序走一遍用户端提交一条记录切到维修员端执行处理再切回用户端评价最后用管理员端看到全过程。演示前重置数据库把小程序缓存清掉保证演示时数据干净。演示过程中打开数据库表窗口边操作边让评委看记录表里新增的行这比只点页面更有说服力。如果老师问“项目难点”就讲同一订单被多人接单时如何用状态字段防止并发这比讲增删改查高级很多。从那以后我每次拿到一套新源码都会先跑通再改业务先在数据库里把表关系搞清楚再碰页面代码这样既能保证原有功能不崩又能清楚地知道改动会影响哪些接口。如果你正在把这套维修系统往自己的课题上靠建议把上面的替换顺序当成第一步改完标题和字段再动业务逻辑你会在答辩时少踩很多坑——希望帮到你。本文还有配套的精品资源点击获取