1. 项目概述:SSM框架下的智能停车管理系统
这个基于SSM(Spring+SpringMVC+MyBatis)框架的停车管理系统,是我在智慧城市领域参与的一个典型企业级应用。系统主要解决传统停车场管理效率低下、人工记录易出错、数据统计困难等痛点,通过车牌识别、在线支付、可视化监控等技术手段,实现停车位的智能化调度与运营管理。
从技术架构来看,系统采用经典的三层架构设计:
- 前端使用Bootstrap+jQuery实现响应式布局
- 中间层采用SpringMVC处理业务逻辑
- 数据持久层通过MyBatis与MySQL交互
特别值得注意的是,项目中整合了阿里云OSS实现停车证据照片的云端存储,并接入了微信支付SDK完成移动端缴费功能。整套源码包含12个核心模块,从基础的车辆进出管理到复杂的财务统计报表,完整覆盖停车场运营的各个环节。
2. 核心功能模块解析
2.1 车辆进出场管理子系统
作为系统的核心业务模块,我们采用了多线程+队列机制处理高并发场景下的车辆进出请求。关键技术实现包括:
// 基于Spring定时任务的入场队列处理 @Scheduled(fixedDelay = 1000) public void processEntryQueue() { List<Car> pendingCars = carService.getPendingEntries(); pendingCars.parallelStream().forEach(car -> { // 车牌识别逻辑 String plateNo = plateRecognition(car.getImage()); // 车位分配算法 ParkingSpace space = allocateSpace(plateNo); // 道闸控制指令下发 gateControl.openGate(car.getGateId()); }); }关键点:实际部署时发现,当摄像头同时捕获多辆车时,简单的顺序处理会导致识别延迟。最终采用线程池(核心线程数=CPU核心数*2)配合BlockingQueue实现生产-消费模式,吞吐量提升3倍。
2.2 计费规则引擎设计
系统支持多种计费策略的灵活配置,采用策略模式实现:
public interface BillingStrategy { BigDecimal calculateFee(LocalDateTime entry, LocalDateTime exit); } // 标准计费实现 @Component @Qualifier("standard") public class StandardBilling implements BillingStrategy { @Value("${billing.first.hour}") private BigDecimal firstHourPrice; @Override public BigDecimal calculateFee(LocalDateTime entry, LocalDateTime exit) { long minutes = Duration.between(entry, exit).toMinutes(); // 首小时后每30分钟计费逻辑 return calculateByMinutes(minutes); } }在applicationContext.xml中配置策略映射:
<util:map id="billingStrategies"> <entry key="standard" value-ref="standard"/> <entry key="vip" value-ref="vipDiscount"/> <entry key="holiday" value-ref="holidaySpecial"/> </util:map>2.3 可视化监控看板
通过ECharts实现实时数据可视化:
- 使用WebSocket推送车位状态变化
- 采用Redis缓存热点数据(如当前在场车辆数)
- 实现的关键SQL优化:
-- 原低效查询 SELECT COUNT(*) FROM parking_record WHERE exit_time IS NULL; -- 优化方案:添加状态字段并建立索引 ALTER TABLE parking_record ADD COLUMN status TINYINT DEFAULT 0; CREATE INDEX idx_status ON parking_record(status);3. 技术难点与解决方案
3.1 车牌识别准确率优化
初期使用OpenCV的传统图像处理方案,在复杂光照条件下准确率仅85%。后续改进方案:
图像预处理流水线:
- 高斯模糊去噪(kernel size=3)
- 直方图均衡化增强对比度
- 基于HSV空间的颜色过滤
集成百度AI车牌识别SDK后:
- 准确率提升至98.7%
- 增加本地缓存减少API调用
- 失败时自动重试机制
配置示例:
# 百度AI配置 baidu.ocr.appid=your_appid baidu.ocr.api.key=your_apikey baidu.ocr.secret.key=your_secretkey baidu.ocr.retry.max=33.2 支付对账一致性
遇到的典型问题:因网络延迟导致支付状态不同步。最终解决方案:
- 引入状态机模式管理订单生命周期
- 定时对账任务设计:
@Transactional public void reconcileOrders() { List<Order> pendingOrders = orderDao.findByStatus(OrderStatus.PENDING); pendingOrders.forEach(order -> { PaymentStatus status = wechatPayService.queryPayment(order.getNo()); if(status == PaymentStatus.SUCCESS) { order.confirmPayment(); parkingService.releaseSpace(order.getSpaceId()); } }); }- 补偿机制设计:
- 本地消息表记录操作日志
- 最大努力通知策略(最多尝试5次)
- 人工干预接口开发
4. 系统部署实践
4.1 性能调优经验
通过JMeter压测发现的瓶颈及优化措施:
| 场景 | 原QPS | 优化措施 | 优化后QPS |
|---|---|---|---|
| 车辆入场 | 120 | 增加Redis缓存车位状态 | 450 |
| 支付请求 | 80 | 接口异步化改造 | 300 |
| 报表生成 | 15 | 预聚合+定时任务 | 100 |
关键JVM参数调整:
-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=2004.2 高可用方案
我们的生产环境部署架构:
- 前端:Nginx负载均衡(2台)
- 应用层:Tomcat集群(4节点)
- 数据库:MySQL主从复制+读写分离
- 缓存:Redis哨兵模式(3节点)
- 文件存储:阿里云OSS多可用区部署
健康检查配置示例:
upstream backend { server 192.168.1.101:8080 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 max_fails=3 fail_timeout=30s; check interval=5000 rise=2 fall=3 timeout=1000; }5. 开发经验总结
MyBatis优化实践:
- 二级缓存启用需谨慎,建议仅用于低频修改数据
- 动态SQL编写时,
<where>标签比WHERE 1=1更规范 - 批量插入使用
<foreach>+rewriteBatchedStatements=true
Spring事务管理坑点:
- 同类方法自调用失效问题
- 异常捕获需注意RuntimeException才触发回滚
- 建议明确指定rollbackFor属性
文档编写建议:
- Swagger UI自动生成API文档
- 数据库字段注释要完整
- 关键业务流程图使用PlantUML绘制
这套系统从开发到上线历时4个月,期间最大的收获是认识到:在传统行业信息化项目中,技术方案的稳定性往往比先进性更重要。比如最初计划使用Spring Cloud微服务架构,但考虑到客户IT维护能力,最终选择了更稳健的SSM单体架构。这个决策在实际运维阶段被证明是正确的——客户技术团队能够快速掌握系统维护技能,故障排查效率也更高。