停车难问题已经成为现代城市管理的痛点。传统停车场管理存在人工收费效率低、计费误差多、高峰期拥堵严重等问题。我们团队基于SpringBoot框架开发的智能停车计费系统,通过车牌识别、自动计费、移动支付等技术手段,实现了停车场管理的数字化转型。
这套系统最核心的价值在于:
系统采用经典的三层架构:
code复制表现层:Vue.js + ElementUI
业务层:SpringBoot 2.7 + Spring Security
数据层:MySQL 8.0 + Redis 6.2
选择SpringBoot的主要考虑:
code复制- 车辆识别模块(对接摄像头SDK)
- 计费规则引擎(支持分时计价)
- 支付网关集成(微信/支付宝)
- 车位状态管理
- 数据统计分析
- 系统权限管理
我们测试了三种主流方案后选择了OpenALPR:
| 方案 | 识别率 | 响应时间 | 成本 |
|---|---|---|---|
| 百度AI | 98% | 300ms | 按次收费 |
| 阿里云 | 97% | 350ms | 包月制 |
| OpenALPR | 95% | 200ms | 开源免费 |
实现代码示例:
java复制// 车牌识别服务接口
public interface PlateRecognitionService {
RecognitionResult recognize(InputStream imageStream);
}
// OpenALPR实现
@Service
public class OpenALPRService implements PlateRecognitionService {
private final ALPR alpr = new ALPR("eu");
@PostConstruct
public void init() {
alpr.setTopN(3);
alpr.setDefaultRegion("md");
}
@Override
public RecognitionResult recognize(InputStream imageStream) {
// 实现识别逻辑
}
}
系统支持多种计费策略:
使用规则引擎Drools实现灵活配置:
drl复制rule "工作日白天计费"
when
$record : ParkingRecord(
enterTime.isAfter(workDayStart) &&
enterTime.isBefore(workDayEnd))
then
$record.setRate(5.0); // 每小时5元
end
关键点:规则变更后需要调用
KieContainer.updateReleaseId热更新
支付流程设计要点:
微信支付集成代码示例:
java复制@RestController
@RequestMapping("/payment")
public class PaymentController {
@PostMapping("/wxpay")
public WxPayResponse createWxPayOrder(@RequestBody PaymentRequest request) {
// 构建微信支付请求参数
WxPayUnifiedOrderRequest wxRequest = new WxPayUnifiedOrderRequest();
wxRequest.setBody("停车费支付");
wxRequest.setOutTradeNo(generateTradeNo());
wxRequest.setTotalFee(request.getAmount());
// 调用SDK
return wxPayService.unifiedOrder(wxRequest);
}
@PostMapping("/wxpay/notify")
public String handleWxPayNotify(@RequestBody String notifyData) {
// 验证签名
// 更新订单状态
// 返回success告知微信
}
}
压力测试发现的问题:
优化方案:
原始方案的问题:
优化后的表结构:
sql复制CREATE TABLE `parking_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`plate_no` VARCHAR(20) NOT NULL,
`enter_time` DATETIME NOT NULL,
`exit_time` DATETIME,
`amount` DECIMAL(10,2),
`status` TINYINT NOT NULL COMMENT '0-进行中 1-已完成',
PRIMARY KEY (`id`),
INDEX `idx_plate_no` (`plate_no`),
INDEX `idx_enter_time` (`enter_time`)
) ENGINE=InnoDB PARTITION BY RANGE (YEAR(enter_time)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
Docker Compose编排方案:
yaml复制version: '3'
services:
app:
image: parking-system:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
ports:
- "3306:3306"
Prometheus监控指标示例:
yaml复制- job_name: 'parking-system'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']
关键监控项:
车牌识别光线问题:
支付超时处理:
java复制public enum PaymentState {
INIT,
PROCESSING,
SUCCESS,
FAILED,
TIMEOUT
}
SpringBoot多环境配置:
properties复制# application-dev.properties
alpr.enabled=true
# application-prod.properties
alpr.enabled=false
alpr.cloud.url=https://api.recognize.com
数据库事务陷阱:
java复制// 错误示例:大事务导致锁等待
@Transactional
public void processPayment() {
// 多个耗时操作...
}
// 正确做法:拆分事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void savePaymentRecord() {
// 仅保存记录
}
这套系统在实际部署后,单个停车场日均处理车辆从800辆提升到1500辆,管理人员从4人减少到1人。最大的收获是认识到:可靠的系统=合适的技术选型+严谨的异常处理+完善的监控机制。特别是在支付这类资金相关的功能上,必须做到"怀疑一切,验证一切"。