1. 项目背景与核心价值
校园自助洗衣管理系统是近年来高校后勤信息化建设的重要组成部分。作为一名经历过大学宿舍生活的开发者,我深刻理解传统洗衣房管理模式的痛点:排队时间长、支付方式单一、设备状态不透明、故障报修效率低。这套基于SpringBoot的系统正是为解决这些实际问题而设计。
系统采用B/S架构,前端使用Thymeleaf模板引擎配合Bootstrap,后端基于SpringBoot 2.7.3开发,数据库选用MySQL 8.0。相比传统C/S架构的洗衣管理系统,我们的方案具有三大优势:一是支持移动端随时预约,学生可以通过微信小程序查看洗衣机实时状态;二是集成多种支付方式(校园卡/微信/支付宝);三是采用微服务架构设计,便于后续扩展烘干机、洗鞋机等新设备接入。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计解析
2.1 技术栈选型依据
选择SpringBoot作为核心框架主要基于以下考虑:
- 快速开发特性:通过starter依赖可快速集成MyBatis、Redis等组件
- 内嵌Tomcat:简化部署流程,适合校园机房环境
- Actuator端点:方便远程监控设备连接状态
- 与微信生态整合便利:通过Spring Social轻松实现微信登录
数据库设计遵循第三范式,核心表包括:
- 设备表(washer_info):记录洗衣机物理位置、型号、状态
- 订单表(wash_order):包含开始/结束时间、支付金额等
- 用户表(student_info):与校园认证系统对接
2.2 微服务拆分方案
系统按功能划分为三个微服务:
- 设备管理服务:处理洗衣机状态上报、故障报警
- 订单服务:管理预约、支付、超时处理
- 用户服务:处理认证、余额查询
服务间通过Spring Cloud OpenFeign进行通信,使用Nacos作为注册中心。这种设计使得后期扩展新设备类型时,只需新增对应的微服务模块。
3. 核心功能实现细节
3.1 设备状态实时更新
洗衣机端通过ESP32芯片采集运行数据,每30秒通过MQTT协议向服务端发送心跳包。后端采用Netty实现的TCP长连接服务处理设备通信,关键代码如下:
java复制@RestController
@RequestMapping("/device")
public class DeviceController {
@Autowired
private SimpMessagingTemplate template;
@PostMapping("/status")
public void updateStatus(@RequestBody DeviceStatus status) {
// 更新数据库
deviceService.updateStatus(status);
// 通过WebSocket推送前端
template.convertAndSend("/topic/status", status);
}
}
3.2 支付系统集成
支付模块采用策略模式设计,支持三种支付方式:
- 校园卡支付:调用校园一卡通系统接口
- 微信支付:使用V3版JSAPI支付
- 支付宝支付:集成手机网站支付
支付超时处理采用Spring的@Scheduled注解实现定时任务扫描:
java复制@Scheduled(cron = "0 */5 * * * ?")
public void checkTimeoutOrders() {
List<Order> orders = orderService.getUnpaidOrders();
orders.forEach(order -> {
if(System.currentTimeMillis() - order.getCreateTime() > 30*60*1000){
orderService.cancelOrder(order.getId());
}
});
}
4. 安全防护方案
4.1 防XSS攻击措施
针对洗衣预约表单可能存在的XSS攻击,采用以下防护策略:
- 前端使用DOMPurify对输入内容消毒
- 后端通过Jackson的@JsonSerialize注解进行HTML转义
- 响应头设置X-XSS-Protection
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.xssProtection()
.and()
.contentSecurityPolicy("script-src 'self'");
}
}
4.2 支付安全加固
支付环节采用以下安全措施:
- 金额参数使用BigDecimal类型避免精度问题
- 支付签名增加时间戳防重放
- 敏感数据加密存储(使用Jasypt)
5. 部署与性能优化
5.1 Docker化部署方案
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
redis:
image: redis:6-alpine
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
5.2 缓存策略设计
采用多级缓存架构:
- 本地缓存(Caffeine):存储设备基础信息
- Redis缓存:存储热门洗衣机实时状态
- 数据库:持久化存储
缓存更新策略采用发布-订阅模式,当设备状态变化时通过Redis的Pub/Sub通知所有节点。
6. 毕业设计扩展建议
对于希望基于此项目做深度扩展的同学,可以考虑以下方向:
- 增加AI模块:通过历史数据预测各时段洗衣机使用高峰
- 物联网集成:添加水温、转速等传感器数据采集
- 节能优化:根据用电波峰波谷智能调度设备
项目源码中已预留了这些扩展点的接口设计,在service包下可以看到对应的SPI接口定义。例如IEnergySavingService接口就为节能算法提供了扩展入口。
7. 开发踩坑实录
在实际开发过程中,有几个典型问题值得注意:
-
微信支付证书加载问题:在Linux环境下需要注意证书路径的权限设置,建议将.p12文件放在resources/cert目录下并通过ClassPathResource加载
-
MQTT消息堆积:当网络不稳定时设备端可能积压大量心跳包,解决方案是在服务端实现消息去重逻辑,相同状态的更新只处理最后一次
-
定时任务并发:使用@Scheduled时要注意默认是单线程执行,如果任务耗时较长需要配置线程池
java复制@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
这个项目从技术选型到最终部署上线共耗时3个月,期间经历了两次架构调整。最大的收获是认识到校园场景下的特殊需求:比如要兼容老式校园卡系统、考虑校园网不稳定的情况等。这些实战经验是教科书上难以学到的宝贵财富。
