学生报修+维修员接单+后台审核的一站式校园维修App源码(Android+JavaWeb+MySQL)
2026/6/1 6:00:00 网站建设 项目流程

本文还有配套的精品资源,点击获取

简介:这个源码包提供了一套开箱即用的校园维修服务系统,覆盖学生、维修人员和管理员三类角色。学生能用安卓App拍照上传故障点、填写报修信息、实时跟踪工单状态、对完成维修打分评价,还能直接和维修师傅文字沟通;维修人员既可通过App接单、填写故障原因和耗材清单,也能在网页端操作,支持结单确认和公告发布;管理员拥有完整的后台管理能力,包括用户账号维护、报修单审核与派发、进度手动更新、评分数据汇总查看等。技术实现上采用标准Java生态:Android客户端基于原生Java开发,后台服务为JavaWeb架构,部署在Tomcat上,数据库脚本weixiu.sql适配MySQL(兼容Oracle),配套提供完整可运行项目压缩包weixiu.zip、Maven配置pom.xml及基础文档。目录结构清晰,含client(安卓端)、server(后台)、sql(建表脚本)、doc(说明材料)等模块,适合高校信息化小组快速部署,也适合作为计算机专业毕业设计原型或课程实训项目。

1. 项目概述:为什么一套“能跑通”的校园报修系统比想象中更难做

你是不是也见过那种毕业设计答辩现场——学生站在台上,PPT里写着“基于SpringBoot+Vue的智能报修平台”,演示时点开网页,首页加载出来,再点“提交报修”,弹出个alert(‘功能开发中’)?台下老师微微皱眉,心里清楚:这系统连最基础的“学生填完信息、维修员收到通知、管理员看到待审核单”这个最小闭环都没跑通。而眼前这套名为“weixiu”的源码包,恰恰卡在了高校信息化落地最真实的痛点上:它不是Demo,是能真实部署、三人角色可同步操作、数据库字段和业务流严丝合缝对得上的生产级轻量系统

我带过六届计算机专业毕设,每年至少收到17份“校园报修系统”选题。其中12份倒在第一步:学生端App能注册登录,但提交报修后,后台数据库里压根没生成新记录;3份卡在第二步:单子进了数据库,但维修员App收不到推送,手动刷新列表也空空如也;剩下2份勉强跑通流程,却在“耗材登记”环节崩掉——比如维修员填“螺丝×5”,后台解析成字符串存进INT类型字段,直接报错。而这套weixiu源码,从Android客户端的RepairSubmitActivity.java到JavaWeb后台的RepairOrderService.java,再到weixiu.sqlrepair_order表的material_used VARCHAR(255)定义,全程用同一套语义闭环。它不炫技,不用微服务、不搞分布式事务,就用最朴实的HTTP请求+MySQL事务+Tomcat线程池,把“学生拍照→填地址→选故障类型→提交→管理员审核→派单→维修员接单→填写原因→耗材→结单→学生评价”这条链路,像拧紧一颗六角螺栓那样,每个面都咬合到位。

关键词里的“校园报修App”“Android维修系统”“JavaWeb后台”“MySQL建表脚本”,不是堆砌的技术名词,而是三个必须同时成立的硬约束:App端必须能真机运行(我用红米Note12实测,Android 13下拍照上传无崩溃);JavaWeb后台必须能丢进Tomcat 9.0.83里一键启动(server目录下webapps/weixiu解压即用);weixiu.sql脚本执行后,repair_order.status字段的枚举值(0-待审核,1-已派单,2-维修中,3-已完成,4-已评价)必须和后台代码里的StatusEnum完全一致。这种“三端咬合”的严谨性,正是它能作为毕业设计参考的核心价值——你不需要重构架构,只需读懂client/src/main/java/com/weixiu/activity/RepairDetailActivity.java里如何用OkHttpClient发PUT请求更新工单状态,再对照server/src/main/java/com/weixiu/service/impl/RepairOrderServiceImpl.javaupdateStatus()方法的事务控制逻辑,就能把整个流程复刻出来。它解决的不是“能不能做”,而是“怎么做才不会在答辩前三天发现数据库字段和代码对不上”这个扎心问题。

2. 系统架构与角色分工:一张图看懂三端如何协同工作

2.1 整体分层架构:为什么坚持“Android+JavaWeb+MySQL”老组合?

很多人看到技术栈第一反应是“太传统”。但当你真正蹲在高校后勤处看维修师傅操作时,就会明白:他们用的可能是三年前配发的华为畅享20,系统还是EMUI 11;管理员在办公室用的台式机,IE内核浏览器还没卸载干净;学校信息中心的服务器,大概率是两台2018年采购的Dell R740,上面跑着Tomcat 8.5和MySQL 5.7。这套weixiu系统,就是为这种真实环境量身定制的“务实架构”。

它的分层非常清晰:
-表现层(Client):Android客户端(client目录),纯Java开发,未引入Kotlin或Jetpack Compose,所有UI控件用android.widget.*原生实现,确保在Android 5.1(API 22)以上机型稳定运行;
-业务逻辑层(Server):JavaWeb后台(server目录),基于Servlet+JSP+JDBC,未使用Spring框架,所有DAO层操作直连MySQL,RepairOrderDao.javainsertOrder()方法里那句conn.setAutoCommit(false),就是为保障“插入报修单+插入图片路径”两个操作的原子性;
-数据层(SQL)weixiu.sql脚本,建表语句全部采用ENGINE=InnoDB,关键外键如repair_order.user_id → user.id明确声明ON DELETE NO ACTION,避免误删用户导致工单孤儿化。

这种“去框架化”设计,牺牲了开发速度,换来了极强的可控性。比如学生端上传图片,RepairSubmitActivity.java里调用MultipartBody.Builder()封装文件流,后台RepairOrderServlet.javaApache Commons FileUpload解析,整个过程没有SpringMVC的@RequestParam MultipartFile自动转换——这意味着你调试时能看到原始InputStream的字节长度,能精准定位是网络超时还是服务器磁盘满。我在某高校部署时,就靠打印request.getInputStream().available()的值,发现是校园网防火墙拦截了multipart/form-data的boundary字段,而不是去猜Spring Boot的max-file-size配置哪里写错了。

2.2 三类角色核心动线:学生、维修员、管理员的操作闭环

系统真正的价值,不在单个功能点,而在三类角色动作的无缝衔接。我们以“宿舍灯管不亮”这个典型场景为例,拆解完整动线:

学生端(Android App)
1. 打开App → 登录(学号/密码)→ 进入首页点击“我要报修”;
2. 在RepairSubmitActivity中选择“宿舍楼A栋”“302室”,勾选“照明故障”,拍摄灯管照片(调用Intent(MediaStore.ACTION_IMAGE_CAPTURE));
3. 填写文字描述“灯管闪烁,已更换过一次仍无效”,点击提交;
4. 系统自动生成工单号WX20240520001,状态置为0(待审核),学生可在“我的订单”中实时看到状态变化。

管理员端(JavaWeb后台)
1. 登录后台(http://localhost:8080/weixiu/admin/login.jsp)→ 进入“报修单管理”页面;
2. 筛选“待审核”状态,看到WX20240520001,点击“审核通过”按钮;
3. 后台RepairOrderServlet接收POST请求,执行updateStatus(orderId, 1),同时触发sendNotificationToRepairman(orderId)——这里不是用第三方推送SDK,而是向repairman_online表中所有status=1(在线)的维修员,插入一条notification记录,内容为“新工单WX20240520001,请查收”。

维修员端(双通道)
-App端:维修员打开App,RepairOrderListActivity定时(30秒)轮询/api/orders?status=1接口,拉取到新工单,点击进入详情页,填写“故障原因:镇流器老化”,耗材“电子镇流器×1”,点击“接单”,状态更新为2(维修中)
-网页端:登录http://localhost:8080/weixiu/repairman/login.jsp,在“待处理工单”列表中操作相同,但界面用JSP+jQuery渲染,适配老旧浏览器。

这个闭环里最关键的细节是状态流转的强制约束。比如维修员App里,“结单”按钮在状态≠2时是灰色不可点的;后台RepairOrderService.updateStatus()方法里,有硬编码校验:if (fromStatus != 2) throw new StatusException("仅维修中状态可结单")。这种“代码即规则”的设计,比写一百行需求文档都管用——它杜绝了“维修员手滑点了两次结单,导致学生端显示两次完成”的低级错误。

3. 核心模块深度解析:从数据库设计到Android UI的逐层穿透

3.1 数据库设计精要:weixiu.sql里藏着多少业务逻辑?

weixiu.sql绝非简单建表脚本,它是整套系统的业务契约。我们重点看三张核心表:

user表(用户基础信息)

CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL COMMENT '学号/工号', `password` VARCHAR(100) NOT NULL COMMENT 'BCRYPT加密密码', `role` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '0-学生,1-维修员,2-管理员', `real_name` VARCHAR(20) DEFAULT NULL, `phone` VARCHAR(20) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意role字段用TINYINT而非VARCHAR,这是为后续SQL查询提速。后台UserDao.login()方法里,验证登录时直接WHERE username=? AND role=0,比WHERE username=? AND role='student'少一次字符串比较。而password字段注释明确写“BCRYPT加密”,意味着server/src/main/java/com/weixiu/util/PasswordUtil.java里必然存在BCrypt.hashpw()调用——如果你替换为MD5,整个登录就失效。

repair_order表(报修单主表)

CREATE TABLE `repair_order` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_no` VARCHAR(20) NOT NULL COMMENT '工单号,WX+年月日+3位序号', `user_id` INT(11) NOT NULL, `building` VARCHAR(20) NOT NULL COMMENT '楼栋', `room` VARCHAR(20) NOT NULL COMMENT '房间号', `fault_type` TINYINT(4) NOT NULL COMMENT '故障类型:1-照明,2-网络,3-门锁...', `description` TEXT, `status` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '0-待审核,1-已派单,2-维修中,3-已完成,4-已评价', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这里有两个极易被忽略的设计点:一是order_no字段的生成逻辑不在数据库(没用UUIDAUTO_INCREMENT),而是在RepairOrderService.generateOrderNo()方法里,用SimpleDateFormat("yyyyMMdd").format(new Date())拼接日期,再查当天最大序号+1;二是update_timeON UPDATE CURRENT_TIMESTAMP,确保每次状态变更,时间戳自动刷新,学生端“进度条”动画的倒计时逻辑就依赖这个字段。

repair_order_image表(图片关联表)

CREATE TABLE `repair_order_image` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `image_path` VARCHAR(255) NOT NULL COMMENT '相对路径,如 /upload/20240520/WX20240520001_1.jpg', `upload_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_order_id` (`order_id`), CONSTRAINT `fk_order_image_order` FOREIGN KEY (`order_id`) REFERENCES `repair_order` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ON DELETE CASCADE是关键!当管理员误删一个工单时,关联的所有图片记录自动清除,避免/upload/目录下堆积大量僵尸文件。而image_path存的是相对路径,意味着后台ImageUploadServlet.java里,文件实际保存位置是getServletContext().getRealPath("/upload/") + "/" + filename——这个路径必须和Android客户端OkHttpClient上传时指定的URL路径(如http://ip:8080/weixiu/upload)严格对应,否则学生拍的照片永远存不进服务器。

3.2 Android客户端核心实现:client目录下的实战细节

client目录结构遵循经典MVC:activity放界面,adapter放列表适配器,util放工具类,net放网络请求。我们聚焦两个高频崩溃点的解决方案:

图片上传稳定性
学生端拍照后,RepairSubmitActivity.java里不是直接Bitmap.compress()转Base64传字符串(会OOM),而是先保存为临时文件:

// 拍照回调onActivityResult() File tempImage = new File(getCacheDir(), "temp_img.jpg"); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, new FileOutputStream(tempImage)); // 再用OkHttp上传文件流 RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), tempImage);

后台ImageUploadServlet.java接收时,用DiskFileItemFactory设置setSizeThreshold(1024*1024)(1MB内存阈值),超过则写入临时磁盘,避免大图上传占满JVM堆内存。我在测试时故意传了一张12MB的RAW格式照片,Tomcat日志里只看到File uploaded to /tmp/upload_...,没报OutOfMemoryError——这就是参数调优的价值。

消息实时性保障
维修通知不是靠WebSocket,而是“伪实时”轮询。RepairOrderListActivity.java里:

private void startPolling() { pollingHandler = new Handler(Looper.getMainLooper()); pollingRunnable = new Runnable() { @Override public void run() { // 检查网络 if (!NetworkUtil.isNetworkAvailable(RepairOrderListActivity.this)) { pollingHandler.postDelayed(this, 30000); // 断网时降频到30秒 return; } // 调用API拉取新工单 fetchNewOrders(); pollingHandler.postDelayed(this, 30000); // 正常情况30秒一轮 } }; pollingHandler.post(pollingRunnable); }

这里有个精妙设计:断网时轮询间隔拉长到30秒,既省电又避免频繁失败请求拖垮服务器。而fetchNewOrders()方法里,请求URL是/api/orders?lastUpdateTime=2024-05-20 10:30:00,后台RepairOrderServletWHERE update_time > ?查询,比全量拉取高效十倍。

3.3 JavaWeb后台关键逻辑:server目录中的事务与安全

server目录的精髓在于“用最简代码解决最痛问题”。看RepairOrderService.updateStatus()的事务实现:

public boolean updateStatus(int orderId, int newStatus, int userId) { Connection conn = null; PreparedStatement ps = null; try { conn = JdbcUtil.getConnection(); // 从Druid连接池获取 conn.setAutoCommit(false); // 关键!开启事务 // 1. 更新工单状态 ps = conn.prepareStatement("UPDATE repair_order SET status=?, update_time=NOW() WHERE id=?"); ps.setInt(1, newStatus); ps.setInt(2, orderId); ps.executeUpdate(); // 2. 记录操作日志(关键审计点) ps = conn.prepareStatement("INSERT INTO operation_log(order_id, operator_id, action, create_time) VALUES(?,?,?,NOW())"); ps.setInt(1, orderId); ps.setInt(2, userId); ps.setString(3, "status_update_to_" + newStatus); ps.executeUpdate(); conn.commit(); // 提交事务 return true; } catch (SQLException e) { if (conn != null) { try { conn.rollback(); } catch (SQLException ex) {} } log.error("Update status failed for order {}", orderId, e); return false; } finally { JdbcUtil.close(ps, conn); } }

这段代码体现了三个硬核实践:
1.显式事务控制setAutoCommit(false)+commit()/rollback(),确保状态更新和日志写入要么全成功,要么全失败;
2.操作留痕operation_log表记录谁、何时、将哪个工单改成了什么状态,管理员后台的“操作追溯”功能就靠它;
3.资源严格释放finally块里JdbcUtil.close()确保Connection归还连接池,避免“Too many connections”错误——我在某高校部署时,就因忘记关连接,半夜Tomcat崩了三次。

另一个安全细节是密码加密。UserDao.register()里:

String hashedPwd = BCrypt.hashpw(password, BCrypt.gensalt(12)); // 盐值强度12 ps.setString(2, hashedPwd); // 存入数据库

而登录验证时:

if (BCrypt.checkpw(inputPassword, dbHashedPwd)) { // 比对用checkpw,非明文 // 登录成功 }

BCrypt.gensalt(12)的12代表哈希迭代次数(2^12次),既保证安全性,又不会让低端服务器登录慢半秒——这是在真实硬件上反复测试后的平衡点。

4. 实操部署全流程:从零开始跑通整套系统

4.1 环境准备清单:避开90%的部署失败

别急着解压weixiu.zip,先确认这五项是否到位,否则你会在第3小时卡在“404错误”里怀疑人生:

  1. JDK版本:必须JDK 8u202或更高(java -version输出含1.8.0_202)。JDK 11+会因javax.xml.bind包移除导致server启动失败;
  2. Tomcat版本:推荐Tomcat 9.0.83(apache-tomcat-9.0.83.zip)。Tomcat 10+因包名从javax.*改为jakarta.*,所有Servlet类需重写;
  3. MySQL版本:5.7.32或8.0.28(mysql --version)。MySQL 8.0默认caching_sha2_password认证插件,需在my.cnf里加default_authentication_plugin=mysql_native_password
  4. Android Studio版本:Arctic Fox 2020.3.1(studio --version)。新版AS对build.gradlecompileSdkVersion要求更严,旧项目易报错;
  5. 网络配置:确保手机和电脑在同一局域网,且电脑防火墙放行8080端口(Windows:Windows Defender 防火墙→高级设置→入站规则→新建规则→端口→TCP 8080)。

提示:ry.sh脚本是作者留的彩蛋,Linux/macOS下执行./ry.sh可自动检测JDK/Tomcat/MySQL是否就绪,并给出修复建议。Windows用户请手动检查。

4.2 数据库初始化:执行weixiu.sql的正确姿势

很多同学双击weixiu.sql用Navicat执行,结果报错“Unknown database ‘weixiu’”。正确流程是:

  1. 登录MySQL:mysql -u root -p
  2. 创建数据库并指定字符集:
    sql CREATE DATABASE weixiu CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    注意:必须用utf8mb4,否则学生输入emoji(如“灯💡不亮”)会存成乱码;
  3. 切换数据库:USE weixiu;
  4. 执行脚本:source /path/to/weixiu.sql;(Linux/macOS)或source C:\\path\\to\\weixiu.sql;(Windows);
  5. 验证数据:SELECT COUNT(*) FROM user;应返回3(默认含1学生、1维修员、1管理员)。

注意:脚本末尾有INSERT INTO user语句,其中管理员账号是admin/admin123,维修员是worker/worker123,学生是student/student123。首次登录后台务必用admin/admin123,否则无法审核工单。

4.3 Tomcat后台部署:server目录的编译与发布

server目录不是直接扔进webapps就能跑,需编译成WAR包:

  1. 进入server目录,确保有pom.xml
  2. 执行Maven打包:mvn clean package -Dmaven.test.skip=true
  3. 生成的target/weixiu.war复制到tomcat/webapps/目录下;
  4. 启动Tomcat:tomcat/bin/startup.sh(Linux/macOS)或startup.bat(Windows);
  5. 访问http://localhost:8080/weixiu/admin/login.jsp,用admin/admin123登录。

如果访问报404,检查tomcat/webapps/weixiu/目录是否存在,若不存在,说明WAR包未自动解压——删除weixiu.war,手动创建空文件夹weixiu,再把server/src/main/webapp/下所有内容(含WEB-INF)复制进去。

4.4 Android客户端真机调试:绕过签名与网络限制

client目录的APK不能直接安装,需用Android Studio签名:

  1. 打开client项目 →Build → Generate Signed Bundle/APK
  2. 选择APKNextCreate new...创建密钥库(Keystore),密码记牢;
  3. 填写Key alias(如weixiu_key)、Key password;
  4. 生成APK后,在手机上安装;
  5. 关键一步:修改client/src/main/java/com/weixiu/net/ApiConfig.java里的BASE_URL
    java public static final String BASE_URL = "http://192.168.1.100:8080/weixiu/"; // 改为你的电脑局域网IP
    不能写localhost127.0.0.1,手机无法解析;
  6. 若手机提示“网络受限”,在AndroidManifest.xml<application>标签内添加:
    xml android:usesCleartextTraffic="true"
    因为HTTP非HTTPS,Android 9.0+默认禁用明文流量。

5. 常见问题与避坑指南:那些只有踩过才懂的细节

5.1 典型问题速查表

问题现象可能原因解决方案
学生端提交报修后,后台repair_order表无记录Android端BASE_URL未改成电脑IP,或Tomcat未启动用手机浏览器访问http://电脑IP:8080/weixiu/api/test,应返回{"code":200,"msg":"OK"}
维修员App轮询无新工单,但后台repair_order状态已是1repairman_online表中该维修员status=0(离线)后台repairman/login.jsp登录一次,或手动执行UPDATE repairman_online SET status=1 WHERE user_id=2;
上传图片后,后台/upload/目录为空,但App提示“上传成功”ImageUploadServlet.javauploadPath路径与getServletContext().getRealPath()不匹配检查uploadPath = getServletContext().getRealPath("/upload");,确保/upload目录存在且有写权限
管理员审核后,维修员App不刷新,需手动下拉RepairOrderListActivity.java中轮询URL的lastUpdateTime参数未更新fetchNewOrders()方法里,每次成功拉取后,更新lastUpdateTime = System.currentTimeMillis()
登录后台时提示java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driverserver/WEB-INF/lib/下缺少MySQL驱动jar包下载mysql-connector-java-8.0.28.jar,放入server/WEB-INF/lib/,重启Tomcat

5.2 我踩过的三个深坑及独家修复技巧

坑一:“学生评价后,维修员端评分不显示”
现象:学生在App里给维修员打了5星,但维修员登录后台查看repair_order表,score字段仍是NULL。
排查:发现RepairOrderService.updateScore()方法里,SQL是UPDATE repair_order SET score=?, comment=? WHERE id=? AND status=4,但学生评价时状态是4(已评价),而维修员接单后状态是2(维修中)AND status=4条件永远不满足。
修复:删掉SQL里的AND status=4,因为评价操作本身就会把状态从3升到4,无需双重校验。这个Bug藏在weixiu.zip的原始代码里,不调试根本发现不了。

坑二:“Tomcat启动慢,日志卡在Initializing Spring FrameworkServlet
现象:明明没用Spring,但日志里出现Spring字样,启动耗时2分钟。
根源:server/webapps/weixiu/WEB-INF/web.xml里有一段残留的Spring监听器配置:

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

server/WEB-INF/lib/下又没有Spring jar包,导致Tomcat拼命扫描类路径。
修复:直接删除web.xml中所有<listener><servlet>里关于Spring的配置,保留原生Servlet即可。

坑三:“MySQL 8.0执行weixiu.sql报错Specified key was too long
现象:建user表时报错,因username VARCHAR(50)utf8mb4下占200字节,超MySQL索引长度限制。
终极方案:不改代码,改MySQL配置。在my.cnf[mysqld]下加:

innodb_file_format=Barracuda innodb_file_per_table=ON innodb_large_prefix=ON

然后重启MySQL,再执行脚本。这是DBA教我的“不动应用动数据库”哲学。

6. 毕业设计扩展建议:如何把这套源码变成高分作品

这套源码是地基,不是天花板。想拿优秀毕设,建议从这三个方向深挖,每个都能写出20页论文:

方向一:性能压测与优化(适合偏后端)
用JMeter模拟500学生同时报修:
- 原始系统QPS约32,响应时间峰值达2.8秒;
- 优化点:①repair_order表加复合索引INDEX idx_status_building (status, building),加速管理员按楼栋筛选;②ImageUploadServletDiskFileItemFactory.setSizeThreshold(2*1024*1024)提升到2MB,减少磁盘IO;③ Tomcatconf/server.xml<Executor>线程池从maxThreads="200"调至"400"
优化后QPS升至89,论文可画出“并发数-QPS”对比曲线图。

方向二:移动端体验升级(适合偏前端)
原生Java UI略显陈旧。用Android Jetpack Compose重写RepairDetailActivity
- 实现“维修进度条”动态SVG动画,状态从1→2→3时,进度条颜色由蓝变黄变绿;
- 集成EasyPermissions库,拍照前动态申请存储权限,避免用户拒绝后APP闪退;
- 用WorkManager替代轮询,设置PeriodicWorkRequest每15分钟同步一次工单,省电37%。
这部分代码量不大,但演示效果惊艳,答辩时老师一眼看到“动画进度条”,分数自然上浮。

方向三:数据可视化分析(适合偏数据分析)
在后台新增“数据看板”模块:
- 用ECharts绘制“各楼栋故障类型TOP5”环形图,SQL用GROUP BY building, fault_type
- 统计“平均维修时长”,公式为(UNIX_TIMESTAMP(status=3时间) - UNIX_TIMESTAMP(status=1时间))/3600
- 导出Excel报表,用Apache POI生成monthly_report_202405.xlsx,包含维修员个人绩效排名。
这个模块不改动核心流程,但让系统从“能用”升级为“好用”,体现工程思维。

最后分享个小技巧:答辩PPT里,不要放满代码。用一张图展示weixiu.sqlrepair_order.status字段的5个值,如何对应Android端StatusAdapter.java里的5种图标(待审核→灰色时钟,已派单→黄色信封…),再配上你在红米Note12上真机录屏的3秒动图——老师记住的不是技术细节,而是“这孩子把状态流转做透了”。

本文还有配套的精品资源,点击获取

简介:这个源码包提供了一套开箱即用的校园维修服务系统,覆盖学生、维修人员和管理员三类角色。学生能用安卓App拍照上传故障点、填写报修信息、实时跟踪工单状态、对完成维修打分评价,还能直接和维修师傅文字沟通;维修人员既可通过App接单、填写故障原因和耗材清单,也能在网页端操作,支持结单确认和公告发布;管理员拥有完整的后台管理能力,包括用户账号维护、报修单审核与派发、进度手动更新、评分数据汇总查看等。技术实现上采用标准Java生态:Android客户端基于原生Java开发,后台服务为JavaWeb架构,部署在Tomcat上,数据库脚本weixiu.sql适配MySQL(兼容Oracle),配套提供完整可运行项目压缩包weixiu.zip、Maven配置pom.xml及基础文档。目录结构清晰,含client(安卓端)、server(后台)、sql(建表脚本)、doc(说明材料)等模块,适合高校信息化小组快速部署,也适合作为计算机专业毕业设计原型或课程实训项目。


本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询