1. 项目背景与核心价值
宿舍维修管理系统是高校后勤管理中的刚需场景。传统纸质报修流程存在响应慢、进度不透明、数据难统计等痛点。我们团队基于SpringBoot+Vue技术栈实现的这套系统,在三个维度实现了突破:
- 报修流程数字化:学生通过微信端提交工单时,系统自动关联宿舍信息并支持图片上传,维修工接单后实时推送消息提醒,平均响应时间从48小时缩短至4小时
- 维修资源智能调度:根据维修工技能标签(水电/家具/网络)和当前位置自动分配最近距离的合适人员,维修效率提升60%
- 数据分析可视化:自动生成设备故障热力图和维修周期报表,帮助后勤部门优化配件库存和人力配置
实际部署案例:某高校应用本系统后,学期报修量2300+单中,超时工单占比从35%降至8%,学生满意度调查显示"维修及时性"指标提升27个百分点
2. 技术架构设计
2.1 前后端分离架构
采用经典的SpringBoot+Vue组合,通过RESTful API进行数据交互。特别之处在于:
- JWT+RBAC鉴权体系:学生/维修工/管理员三类角色共15种权限颗粒度控制
- WebSocket长连接:用于维修工接单提醒和进度推送(心跳间隔30秒)
- 混合存储策略:维修记录用MySQL,图片附件用MinIO对象存储
java复制// SpringSecurity配置示例
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/student/**").hasRole("STUDENT")
.antMatchers("/api/worker/accept").hasAuthority("WORKER:ACCEPT")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
2.2 数据库关键表设计
核心的6张表及其关联关系:
| 表名 | 字段示例 | 索引设计 |
|---|---|---|
| repair_order | id, dorm_id, device_type, fault_desc, status | 联合索引(dorm_id, status) |
| repair_worker | id, skill_tags, current_location, workload | GEO索引(位置查询) |
| dormitory | id, building_no, room_no, student_count | 唯一索引(building_no, room_no) |
| maintenance_log | order_id, worker_id, start_time, end_time | order_id外键索引 |
| material_usage | order_id, item_name, quantity, unit_price | 无(低频查询) |
| evaluation | order_id, rating, comment, anonymity | order_id外键索引 |
特别注意:skill_tags字段使用JSON格式存储如["水电","门窗"],通过MySQL 8.0的JSON_CONTAINS函数实现技能匹配查询
3. 核心功能实现细节
3.1 维修工智能调度算法
基于GIS的派单逻辑包含三个权重因子:
- 距离权重(50%):使用Haversine公式计算工单地点与维修工距离
python复制def haversine(lon1, lat1, lon2, lat2): # 将十进制度数转化为弧度 lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine公式 dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) r = 6371 # 地球平均半径,单位为公里 return c * r * 1000 # 返回米制单位 - 技能匹配度(30%):Jaccard相似度计算工单需求与工人技能标签的重合度
- 当前负荷(20%):worker.workload字段记录未完成工单数
3.2 工单状态机设计
使用Spring StateMachine实现严谨的状态流转:
code复制[NEW] → [ASSIGNED](派单成功)
↓
[ACCEPTED](维修工接单)→ [IN_PROGRESS](开始维修)
↓
[COMPLETED](完成维修)
↓
[EVALUATED](学生评价)→ [CLOSED](工单归档)
关键约束条件:
- 只有状态为ASSIGNED的工单允许维修工接单
- 评价完成后24小时自动归档(Quartz定时任务)
- 超时未接单工单(30分钟)触发二次派单
4. 部署与性能优化
4.1 生产环境配置建议
推荐使用Docker Compose部署方案:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PWD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
ports:
- "3306:3306"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_PROFILES_ACTIVE: prod
frontend:
build: ./frontend
ports:
- "80:80"
4.2 高并发场景应对
通过JMeter压力测试发现的三个性能瓶颈及解决方案:
- 工单提交峰值:开学季上午10-12点QPS可达150+
- 解决方案:Redis缓存宿舍楼基础信息,减少MySQL查询
- 工单状态推送:500人在线时WebSocket连接内存占用超2GB
- 解决方案:改用STOMP协议+RabbitMQ作为消息代理
- 维修工位置更新:GPS每30秒上报产生大量UPDATE
- 解决方案:合并更新(每5分钟批量提交一次)
5. 扩展功能开发指南
5.1 微信小程序集成
通过uni-app改造现有Vue页面的关键步骤:
- 修改manifest.json配置微信AppID
- 替换网页端axios为uni.request()
- 实现微信定位API获取宿舍楼位置:
javascript复制uni.getLocation({ type: 'gcj02', success: res => { this.longitude = res.longitude this.latitude = res.latitude } })
5.2 智能预测模块
基于历史数据的故障预测方案:
- 使用Python sklearn构建随机森林模型:
python复制from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100) model.fit(X_train, y_train) - 特征工程包含:
- 设备类型(One-Hot编码)
- 使用年限
- 季节因素
- 上次维修距今天数
- 通过SpringBoot的Python执行器调用预测脚本
实际运行中发现,空调设备在夏季的故障预测准确率达到82%,有效实现了预防性维护。
