1. 项目背景与核心价值
高校电动车租赁系统是近年来校园场景下的刚需应用。随着校园面积扩大和分校区建设,学生日常通勤距离普遍在1-3公里范围,电动自行车成为最受欢迎的短途交通工具。但传统购买模式存在三个痛点:一是学生毕业时车辆处理困难;二是充电安全隐患频发;三是车辆闲置率高造成资源浪费。
我们开发的这套系统采用SpringBoot+Vue技术栈实现,主要解决以下问题:
- 通过分时租赁提高车辆使用率(实测可达普通自购车辆的4-6倍)
- 集中充电桩管理降低火灾风险
- 线上化运营减少人工管理成本
- 支持信用积分体系培养规范用车习惯
这个毕设项目的独特之处在于:
- 完整实现了商业级租赁系统的核心功能链
- 采用微服务架构设计,各模块可独立扩展
- 包含详细的接口文档和SQL脚本
- 特别优化了高并发场景下的订单处理
提示:系统默认配置支持50台电动车同时在线运营,经压力测试可在200QPS下稳定运行,完全满足中型高校需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端技术栈设计
SpringBoot 2.7.4作为核心框架,模块化设计如下:
code复制com.campus.rental
├── config # 安全及第三方配置
├── controller # 对外接口层
├── service # 业务逻辑层
│ ├── impl # 实现类
├── dao # 数据访问层
├── entity # 数据库实体
├── util # 工具类
└── exception # 异常处理
关键依赖包说明:
- spring-boot-starter-data-jpa:简化数据库操作
- hutool-all:5.8.8 国产工具包(处理日期/加密等)
- alipay-sdk-java:支付接口封装
- emqx-client:MQTT协议对接智能车锁
数据库选用MySQL 8.0,主要考虑:
- 校园场景数据量在10万级以下
- 事务操作频繁(订单/支付)
- 与运维团队现有技术栈匹配
2.2 前端技术选型
Vue 3.2 + Element Plus构建管理后台,主要特点:
- 基于RBAC的权限控制系统
- 可视化数据看板(ECharts集成)
- 微信小程序原生开发用户端
特别优化点:
javascript复制// 地图组件懒加载
const AMapLoader = () => import('@amap/amap-jsapi-loader')
2.3 接口文档规范
采用Swagger + YAPI双模式:
- 开发阶段用Swagger UI实时调试
- 交付时导出Markdown格式完整文档
- 关键接口示例:
java复制@PostMapping("/rent/start")
@ApiOperation("开始租车")
public Result<OrderVO> startRent(
@RequestBody @Valid RentStartDTO dto) {
// 业务逻辑
}
3. 核心业务实现
3.1 租车流程设计
完整状态机实现:
code复制[空闲] → (扫码开锁) → [使用中]
↓ ↓
(异常上报) (到达还车点)
↓ ↓
[维修中] ← (后台处理) ← [待支付]
关键代码片段:
java复制// 分布式锁防止重复开锁
String lockKey = "lock:vehicle:" + vehicleId;
boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
3.2 支付系统集成
采用支付宝沙箱环境+本地模拟双模式:
- 正式环境需要企业资质
- 毕设演示可用模拟器
- 重要安全措施:
properties复制# 加密密钥单独配置
alipay.aes-key=43a5f8c9e2b7d601
alipay.sign-type=RSA2
3.3 智能车锁对接
硬件通信方案选型对比:
| 方案 | 成本 | 延迟 | 适用场景 |
|---|---|---|---|
| 蓝牙 | 低 | 1-3s | 小型园区 |
| 4G | 中 | 500ms | 多校区 |
| LoRa | 高 | 2-5s | 无信号区 |
本项目采用4G模组,关键配置:
yaml复制emqx:
broker: tcp://iot.campus.edu:1883
username: vehicle_client
password: securePass123
4. 数据库设计要点
4.1 核心表结构
sql复制CREATE TABLE `vehicle` (
`id` bigint NOT NULL AUTO_INCREMENT,
`plate_no` varchar(10) COLLATE utf8mb4_bin NOT NULL,
`battery_level` tinyint DEFAULT '100',
`gps_lng` decimal(10,6) DEFAULT NULL,
`gps_lat` decimal(10,6) DEFAULT NULL,
`status` enum('FREE','IN_USE','MAINTENANCE') DEFAULT 'FREE',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_plate` (`plate_no`),
SPATIAL KEY `idx_gps` (`gps_lng`,`gps_lat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
4.2 性能优化实践
- 空间索引加速附近车辆查询
- 订单表按学期分表(2023_spring_orders)
- 热点数据缓存策略:
java复制@Cacheable(value = "vehicle", key = "#id")
public Vehicle getById(Long id) {
return vehicleRepository.findById(id).orElse(null);
}
5. 部署与测试
5.1 环境准备清单
硬件要求:
- 服务器:2核4G(最低)
- 数据库:SSD磁盘
- 网络:5Mbps带宽
软件依赖:
- JDK 17+
- Node 16+
- MySQL 8.0+
- Redis 6+
5.2 压力测试结果
使用JMeter模拟100并发用户:
| 接口 | 平均响应时间 | 错误率 |
|---|---|---|
| 登录 | 128ms | 0% |
| 附近车辆 | 203ms | 0% |
| 开始租车 | 356ms | 1.2% |
优化方案:
- 增加Redis连接池大小
- 订单服务独立部署
- 引入Sentinel限流
6. 毕设答辩技巧
6.1 演示重点设计
推荐演示路径:
- 管理员后台 - 车辆分布热力图
- 用户端 - 完整租车流程
- 异常案例 - 电池耗尽处理
6.2 常见问题准备
高频答辩问题:
-
如何防止学生长期占用车辆?
- 答:采用阶梯计价策略,超时部分每分钟费用递增50%
-
系统如何应对断电断网?
- 答:车锁本地缓存最新指令,网络恢复后同步状态
-
数据安全如何保障?
- 答:三层次防护:HTTPS传输、AES存储加密、JWT签名验证
我在实际开发中遇到最棘手的问题是GPS漂移导致还车失败,最终通过设置电子围栏缓冲区和多次坐标校验解决。建议同学们在类似场景下优先考虑业务容错性而非绝对精确
