1. 项目背景与需求分析
停车难问题一直是城市交通管理的痛点。传统地下停车场普遍存在信息不透明、管理效率低下等问题。根据2022年城市交通报告显示,约68%的驾驶员曾因找不到车位而浪费时间,而停车场方也面临空置率高达40%的运营困境。
我们团队开发的智慧停车系统正是为了解决这一矛盾。系统采用微信小程序作为入口,主要实现三大核心功能:
- 实时车位可视化:用户可查看停车场空余车位情况
- 预约停车服务:支持提前15分钟至2小时预约车位
- 无感支付:绑定车牌后自动扣费,减少出场等待时间
关键设计考量:选择微信小程序而非原生APP主要基于用户使用习惯。数据显示,微信月活用户超过12亿,小程序无需安装的特性能最大限度降低用户使用门槛。
2. 技术架构设计
2.1 整体架构
系统采用典型的三层架构:
- 前端:Uniapp跨端框架(兼容微信小程序和H5)
- 后端:SpringBoot 2.7 + MyBatis Plus
- 数据库:MySQL 5.7(必须此版本,因使用了JSON字段特性)
code复制用户端小程序 → 微信云开发 → API网关 → 业务微服务集群
↓
Redis缓存 ← MySQL主从集群
2.2 关键技术选型
- SpringBoot框架:简化配置,内置Tomcat容器,快速构建RESTful API
- Uniapp:一套代码同时生成小程序和H5页面,降低维护成本
- 微信支付:集成最新V3接口,支持分账功能(适合停车场分成场景)
避坑提示:微信小程序获取用户位置需要配置合法域名,务必在开发初期就申请HTTPS证书并备案。
3. 核心功能实现
3.1 车位状态管理
采用状态机模式设计车位状态流转:
code复制空闲 → 已预约(15分钟有效期)→ 已入场 → 计费中 → 空闲
数据库表关键字段:
sql复制CREATE TABLE `parking_space` (
`id` bigint NOT NULL AUTO_INCREMENT,
`zone` varchar(20) COMMENT '区域编号',
`number` varchar(10) COMMENT '车位编号',
`status` tinyint DEFAULT 0 COMMENT '0空闲 1已预约 2已占用',
`reserve_time` datetime COMMENT '预约时间',
`plate_number` varchar(20) COMMENT '车牌号',
`start_time` datetime COMMENT '入场时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_zone_number` (`zone`,`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 预约超时处理
使用Redis过期键监听实现预约超时自动释放:
java复制@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory factory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(new KeyExpirationListener(),
new PatternTopic("__keyevent@0__:expired"));
return container;
}
}
@Component
class KeyExpirationListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
if(expiredKey.startsWith("reserve:")) {
// 处理预约超时逻辑
}
}
}
4. 性能优化实践
4.1 高并发处理
停车场早晚高峰时面临巨大并发压力,我们采取以下措施:
- 热点数据缓存:使用Redis缓存车位状态信息,设置5秒过期时间
- 分布式锁:采用Redisson实现预约操作的互斥
java复制RLock lock = redissonClient.getLock("reserve_lock:"+spaceId);
try {
if(lock.tryLock(1, 10, TimeUnit.SECONDS)) {
// 执行业务逻辑
}
} finally {
lock.unlock();
}
4.2 数据库优化
- 读写分离:查询走从库,写入走主库
- 垂直分表:将停车记录按月分表,避免单表过大
- 索引优化:为高频查询字段(如plate_number)添加组合索引
5. 典型问题排查
5.1 微信定位偏差
现象:用户实际位置与小程序返回坐标偏差较大
解决方案:
- 调用wx.getLocation时设置type为gcj02
- 后台使用高德地图API进行坐标转换
- 在停车场内部部署蓝牙信标辅助定位
5.2 支付超时
现象:出场时支付接口响应慢
处理流程:
- 本地先抬杆放行,记录出场时间
- 异步重试支付,最多3次
- 最终失败则生成待补缴订单
6. 部署方案
6.1 服务器配置
| 服务类型 | 配置 | 数量 | 备注 |
|---|---|---|---|
| API网关 | 4C8G | 2 | 负载均衡 |
| 业务服务 | 8C16G | 4 | Docker部署 |
| Redis | 8G内存 | 3 | 哨兵模式 |
| MySQL | 16C32G | 2主2从 | SSD存储 |
6.2 监控体系
- Prometheus + Grafana监控服务指标
- ELK收集业务日志
- 微信云监控小程序性能
7. 运营数据
上线三个月后核心指标:
- 日均活跃用户:1200+
- 预约成功率:92.7%
- 平均出场时间:从45秒降至8秒
- 停车场收入提升:约18%
实际运营中发现:约35%用户会在预约到期前5分钟内取消,因此我们增加了"即将超时"的推送提醒功能,使预约转化率提升了11%。