作为一名有着10年开发经验的Java工程师,我最近完成了一个基于Spring Boot的小区车位共享小程序项目。这个项目源于我所在小区长期存在的停车难问题——每天晚上回家找车位就像"抢车位"游戏一样让人头疼。通过这个小程序,我们实现了小区内闲置车位的共享和高效利用,让停车不再是个难题。
这个小程序采用了典型的B/S架构,后端使用Spring Boot框架,前端采用Vue.js,数据库选用MySQL。系统主要包含三大角色:管理员负责系统整体管理,出租用户可以发布和管理自己的车位,注册用户则可以查询和预约空闲车位。经过3个月的开发和测试,系统已经在我们小区稳定运行2个月,车位利用率提升了35%,用户反馈非常积极。
选择Spring Boot作为后端框架主要基于以下几个考虑:
数据库选用MySQL 8.0,主要因为:
前端采用Vue.js + Element UI的组合,主要优势在于:
系统采用典型的三层架构:
架构图如下:
code复制[前端Vue.js] ←HTTP→ [Spring Boot应用] ←JDBC→ [MySQL数据库]
↑
↓
[Redis缓存]
提示:在实际开发中,我们在Spring Boot和Vue之间增加了Nginx作为反向代理,既提高了性能也增强了安全性。
车位管理是系统的核心功能,主要包括:
java复制// 车位发布核心代码示例
@PostMapping("/publish")
public Result publishParkingSpace(@Valid @RequestBody ParkingSpaceDTO dto) {
// 验证用户身份
User user = getCurrentUser();
if(user == null || !user.isRentalUser()) {
return Result.error("无权限操作");
}
// DTO转Entity
ParkingSpace space = new ParkingSpace();
BeanUtils.copyProperties(dto, space);
space.setOwnerId(user.getId());
space.setStatus(ParkingSpaceStatus.AVAILABLE);
// 保存到数据库
parkingSpaceService.save(space);
return Result.success("发布成功");
}
预约功能的技术要点:
并发控制:
UPDATE parking_space SET status='RESERVED' WHERE id=? AND status='AVAILABLE'预约流程:
mermaid复制graph TD
A[用户查询车位] --> B[选择时间段]
B --> C{余额充足?}
C -->|是| D[生成预约记录]
C -->|否| E[提示充值]
D --> F[发送通知]
超时处理:
支付模块采用策略模式设计,便于扩展多种支付方式:
支付流程:
安全措施:
车位表(parking_space):
sql复制CREATE TABLE `parking_space` (
`id` bigint NOT NULL AUTO_INCREMENT,
`space_number` varchar(32) NOT NULL COMMENT '车位编号',
`location` varchar(255) NOT NULL COMMENT '位置描述',
`price_per_hour` decimal(10,2) NOT NULL COMMENT '每小时价格',
`owner_id` bigint NOT NULL COMMENT '车主ID',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-可用 1-已预约 2-使用中',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_owner` (`owner_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
预约表(reservation):
sql复制CREATE TABLE `reservation` (
`id` bigint NOT NULL AUTO_INCREMENT,
`space_id` bigint NOT NULL COMMENT '车位ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`total_fee` decimal(10,2) NOT NULL COMMENT '总费用',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-待支付 1-已支付 2-已取消',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_space` (`space_id`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
针对我们的查询模式,特别优化了以下索引:
认证授权:
数据安全:
日志审计:
缓存策略:
数据库优化:
前端优化:
我们采用Docker容器化部署:
使用Docker Compose编排,一键部署。
系统监控:
日志收集:
健康检查:
问题描述:初期发现偶尔会出现车位状态不同步,比如已经被预约的车位仍显示为可用。
解决方案:
问题描述:热门时段多人同时预约同一车位导致冲突。
解决方案:
问题描述:用户支付过程中可能因各种原因中断。
解决方案:
这个小程序从构思到上线共耗时3个月,目前在我们小区已经有200+活跃用户,日均交易量50+次。通过这个项目,我总结了以下几点经验:
未来计划:
这个项目的完整源码已经上传到GitHub,欢迎交流指正。在开发过程中遇到的坑和解决方案,我也会陆续整理成技术文章分享出来。