1. 项目概述:学生宿舍维修服务平台的设计初衷
这个项目源于我在高校信息化部门工作时遇到的实际痛点。每到开学季,宿舍报修量激增,传统的纸质登记+电话通知方式效率低下,经常出现维修工单丢失、响应延迟、进度不透明等问题。我们团队用Java+SSM+Flask搭建的这套系统,实现了从报修到验收的全流程数字化管理,上线后平均维修响应时间从72小时缩短到8小时。
系统采用前后端分离架构:后端用Java+SSM处理核心业务逻辑(用户管理、工单流转、数据统计),Flask则负责微信小程序接口和消息推送。这种混合架构既发挥了Java在企业级应用中的稳定性优势,又利用了Python在快速开发接口方面的灵活性。
2. 技术栈选型与核心组件解析
2.1 为什么选择SSM框架
SSM(Spring+SpringMVC+MyBatis)组合在高校信息化系统中应用广泛,我们的选择基于三点考量:
- Spring的IoC容器:通过依赖注入管理维修工单状态机、消息通知策略等组件,方便后期扩展。例如当需要新增短信通知时,只需实现NotificationService接口并修改配置。
- MyBatis的灵活SQL:维修记录查询涉及多表关联(学生表、宿舍表、维修工表),手写SQL可以精细优化性能。我们为高频查询添加了二级缓存,QPS提升40%。
- 事务管理:支付环节需要同时更新订单状态和财务记录,用@Transactional注解保证原子性。
典型配置示例:
java复制// 维修工单服务层
@Service
public class RepairOrderServiceImpl implements RepairOrderService {
@Autowired
private RepairOrderMapper orderMapper;
@Transactional
public void completeOrder(Long orderId) {
orderMapper.updateStatus(orderId, "COMPLETED");
paymentService.createPaymentRecord(orderId);
}
}
2.2 Flask的轻量化接口实践
选择Flask主要考虑微信生态集成需求:
- 消息模板推送:用Flask-RESTful开发接口处理微信订阅消息,比Java更简洁
- 异步任务处理:用Celery+Redis实现维修进度通知的队列化发送
- 跨域支持:Flask-CORS轻松解决小程序跨域问题
关键接口代码:
python复制@app.route('/api/wechat/notify', methods=['POST'])
def send_repair_notify():
data = request.json
openid = data['openid']
template_id = config.WX_REPAIR_TPL_ID
# 异步发送模板消息
celery.send_task('tasks.send_wechat_msg', args=(openid, template_id, data))
return jsonify(code=200)
3. 系统核心功能实现细节
3.1 多角色权限控制设计
系统包含四类角色:
- 学生:提交报修单、评价服务、查看历史记录
- 维修工:接单、上传维修照片、申请配件
- 宿管:分配工单、审核配件申请
- 财务:结算维修费用
权限控制方案:
- 前端路由守卫:Vue.js根据角色动态生成菜单
- 后端拦截器:Spring MVC用自定义注解实现方法级鉴权
- 数据权限:MyBatis插件自动添加WHERE条件(如维修工只能看到自己负责的工单)
3.2 工单状态机引擎
维修工单包含10余种状态流转,我们采用状态模式实现:
java复制public interface RepairState {
void handle(RepairContext context);
}
// 具体状态实现
@Component
@Scope("prototype")
public class PendingState implements RepairState {
public void handle(RepairContext context) {
if ("ASSIGN".equals(context.getEvent())) {
context.getOrder().setState("ASSIGNED");
notifyWorker(context.getOrder());
}
}
}
状态转换规则用XML配置,便于业务人员维护:
xml复制<transition from="PENDING" event="ASSIGN" to="ASSIGNED"/>
<transition from="ASSIGNED" event="START" to="PROCESSING"/>
4. 典型问题排查与性能优化
4.1 微信图片上传瓶颈
初期直接上传原图到服务器导致的问题:
- 安卓手机上传5MB+图片,接口超时
- 存储空间快速增长
解决方案:
- 前端用uni.compressImage压缩到800x600
- 后端用Flask接收后转存七牛云OSS
- 数据库只保存缩略图URL
4.2 高并发下的订单锁定
维修工抢单时出现的并发问题:
- 多个工人同时接同一订单
- MySQL乐观锁导致大量失败重试
最终方案:
java复制public boolean acceptOrder(Long orderId, Long workerId) {
// 使用SELECT...FOR UPDATE悲观锁
RepairOrder order = orderMapper.selectForUpdate(orderId);
if (order.getStatus().equals("PENDING")) {
order.setWorkerId(workerId);
order.setStatus("ASSIGNED");
return orderMapper.update(order) > 0;
}
return false;
}
5. 部署架构与监控方案
生产环境采用Docker Compose部署:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
redis:
image: redis:alpine
java-app:
build: ./ssm
ports:
- "8080:8080"
flask-app:
build: ./flask
ports:
- "5000:5000"
监控配置要点:
- Spring Boot Actuator暴露健康检查接口
- Prometheus采集JVM和MySQL指标
- Grafana展示维修响应时间百分位图
6. 项目演进方向
这套系统在实际运行中还在持续迭代:
- 智能派单:正在实验用机器学习算法(基于维修工历史数据、位置、技能匹配度)
- AR远程指导:通过小程序WebRTC实现学生与维修工的视频通话
- 配件库存预警:与学校仓储系统对接自动触发采购流程
我在开发过程中最深的体会是:校园系统的设计必须考虑用户习惯。例如老维修工不习惯用手机,我们专门增加了语音录入功能;学生喜欢即时反馈,所以强化了消息推送的实时性。这些细节往往比技术选型更能决定项目成败。
