基于SpringBoot的智慧泊车系统的设计与实现
1. 项目背景与意义随着城市化进程的加速和汽车保有量的持续增长“停车难”已成为困扰城市管理者和市民的普遍问题。传统停车场管理模式存在信息不透明、车位利用率低、人工管理成本高、用户体验差等痛点。智慧泊车系统旨在利用物联网、云计算、大数据和移动互联网等技术实现停车场资源的智能化管理与高效利用其意义主要体现在提升管理效率通过自动化设备与信息化平台减少人工干预降低运营成本。优化资源配置实时感知车位状态引导车辆快速泊车提高车位周转率。改善用户体验提供车位查询、预约、导航、无感支付等一站式服务提升出行便利性。助力智慧城市作为城市静态交通的重要组成部分为城市交通规划与管理提供数据支撑。2. 技术栈选型本系统采用前后端分离的微服务架构后端基于SpringBoot构建具体技术栈如下2.1 后端技术栈核心框架Spring Boot 2.7.xWeb框架Spring MVC数据持久层MyBatis-Plus数据库MySQL 8.0 (主业务数据) Redis 7.0 (缓存与Session)API文档Knife4j (Swagger增强)安全框架Spring Security JWT消息队列RabbitMQ (用于订单、车位状态变更等异步通知)服务注册与发现Nacos配置中心Nacos Config分布式事务Seata监控与链路追踪Spring Boot Admin SkyWalking2.2 前端技术栈管理后台Vue 3 Element Plus用户小程序微信小程序 (原生或Uni-app)2.3 硬件与物联网车位检测地磁传感器/超声波传感器/摄像头道闸控制PLC/智能道闸控制器通信协议MQTT/CoAP (传感器数据上报)3. 系统核心功能模块设计3.1 用户服务模块负责用户注册、登录、个人信息管理、车辆绑定等。3.2 停车场管理模块停车场信息维护、车位分区管理、费率策略设置、设备管理道闸、摄像头、传感器。3.3 实时车位服务模块核心模块通过物联网网关接收传感器上报的车位状态空闲/占用在Redis中维护全局车位地图并通过WebSocket向客户端推送实时变化。3.4 预约与导航模块用户可查询并预约指定时段的车位系统生成预约码并规划从入口到车位的室内导航路径。3.5 订单与支付模块记录停车订单集成微信支付/支付宝支持无感支付签约代扣和手动支付。3.6 数据统计与分析模块对车流量、车位利用率、营收等数据进行多维度统计分析为运营决策提供支持。4. 核心代码实现示例4.1 车位状态实时更新与推送import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.socket.WebSocketSession; import javax.annotation.Resource; import java.util.concurrent.ConcurrentHashMap; /** 车位状态服务 */ Service public class ParkingSpaceService { Resource private RedisTemplateString, Object redisTemplate; // 存储在线用户的WebSocket会话 private static final ConcurrentHashMapString, WebSocketSession sessionMap new ConcurrentHashMap(); private static final String PARKING_SPACE_KEY_PREFIX parking:space:; /** 更新车位状态由物联网网关调用 param spaceId 车位ID param status 状态 (0-空闲, 1-占用) */ public void updateSpaceStatus(String spaceId, Integer status) { String key PARKING_SPACE_KEY_PREFIX spaceId; // 1. 更新Redis缓存 redisTemplate.opsForValue().set(key, status); // 2. 发布状态变更消息到MQ供其他服务消费 // rabbitTemplate.convertAndSend(parking.space.exchange, space.status.change, spaceId); // 3. 通过WebSocket实时推送状态给在线用户 broadcastSpaceStatus(spaceId, status); } /** 广播车位状态给所有在线客户端 */ private void broadcastSpaceStatus(String spaceId, Integer status) { String message String.format({spaceId:%s,status:%d}, spaceId, status); sessionMap.forEach((userId, session) - { if (session.isOpen()) { try { session.getBasicRemote().sendText(message); } catch (Exception e) { // 日志处理 } } }); } }4.2 基于JWT的用户认证与授权import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; /** JWT工具类 */ Component public class JwtTokenUtil { Value(${jwt.secret}) private String secret; Value(${jwt.expiration}) private Long expiration; /** 生成Token */ public String generateToken(String username, String userId) { MapString, Object claims new HashMap(); claims.put(username, username); claims.put(userId, userId); return Jwts.builder() .setClaims(claims) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() expiration * 1000)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } /** 从Token中解析用户ID */ public String getUserIdFromToken(String token) { Claims claims getAllClaimsFromToken(token); return (String) claims.get(userId); } private Claims getAllClaimsFromToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } /** 验证Token是否有效 */ public boolean validateToken(String token, String userId) { final String tokenUserId getUserIdFromToken(token); return (tokenUserId.equals(userId) !isTokenExpired(token)); } private boolean isTokenExpired(String token) { final Date expiration getExpirationDateFromToken(token); return expiration.before(new Date()); } private Date getExpirationDateFromToken(String token) { Claims claims getAllClaimsFromToken(token); return claims.getExpiration(); } }4.3 停车订单生成与状态机import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; /** 停车订单实体 / Data TableName(t_parking_order) public class ParkingOrder { TableId(type IdType.ASSIGN_ID) private Long id; private String orderNo; private Long userId; private Long parkingLotId; private Long spaceId; private LocalDateTime entryTime; private LocalDateTime exitTime; private BigDecimal totalAmount; private BigDecimal paidAmount; /* 订单状态0-已预约1-已入场2-已出场未支付3-已支付4-已取消 */ private Integer status; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** 计算停车费用简化示例 */ public BigDecimal calculateFee() { if (exitTime null || entryTime null) { return BigDecimal.ZERO; } long minutes java.time.Duration.between(entryTime, exitTime).toMinutes(); // 假设每小时5元不足1小时按1小时计 long hours (minutes 59) / 60; return BigDecimal.valueOf(hours * 5); } }5. 总结与展望本文介绍了基于SpringBoot的智慧泊车系统的技术选型、核心模块设计以及关键代码实现。系统通过整合物联网感知、实时通信、微服务与移动应用技术构建了一个高效、智能的停车管理解决方案。未来可进一步探索与城市级停车平台的数据互通、基于AI的车位预测与动态定价、以及自动驾驶车辆的自动泊车对接等方向持续提升系统的智能化水平与服务能力。