毕业设计实战:基于SpringBoot的汽车租赁管理系统设计与实现全攻略
在开发“基于SpringBoot的汽车租赁管理系统”毕业设计时,曾因“租车订单与还车信息数据脱节”踩过关键坑——初期未设计清晰的订单状态机和还车联动机制,导致用户租车后还车时订单状态未同步更新、取消订单与租车订单状态混乱、车辆状态无法自动更新为可租,耗费4天重构订单管理模块、引入订单状态流转和车辆状态联动机制才解决问题📝。基于此次实战经验,本文精简拆解核心开发流程,附避坑要点与实操细节,为同类毕设提供可落地的实施参考。
一、需求分析:聚焦租车+还车双核心,避免功能冗余
部分同学易陷入“功能堆砌”误区,比如我曾耗时3天开发“车辆地图追踪”模块,最终因偏离“汽车信息管理、租车订单、还车管理、取消订单”核心需求被导师要求删减。明确“车辆发布→用户租车→订单生成→车辆出库→还车结算→车辆入库”的业务闭环,是降低返工率的关键。
1. 核心角色与功能(精简版)
| 角色 | 核心功能 |
|---|---|
| 管理员 | 用户管理、普通管理员管理、汽车类别管理、汽车信息管理、租车订单管理、取消订单管理、还车信息管理、汽车资讯管理、汽车论坛、留言板管理、系统管理 |
| 普通管理员 | 汽车信息管理、租车订单管理、取消订单管理、还车信息管理、汽车资讯管理、个人中心 |
| 用户 | 汽车浏览/搜索、租车下单、订单查看、取消订单、还车申请、个人中心 |
2. 需求避坑要点
- 拒绝空想调研:邀请15名用户模拟“用户浏览车辆→下单租车→生成订单→车辆出库→还车申请→订单完成”完整流程,基于“用户需要知道订单状态和车辆状态”需求,增设“订单状态跟踪”和“车辆状态实时更新”模块,实用性远大于冗余的“车辆地图追踪”;
- 明确约束条件:提前规定“订单编号自动生成(格式:DD+年月日+序号)”“租车时车辆状态自动更新为已租”“还车审核通过后车辆状态恢复为可租”“取消订单需审核”,为系统实现提供明确依据。
二、技术选型:稳定框架+订单联动,新手可上手
前期曾尝试引入Redis缓存车辆库存,因数据一致性难保证且学习成本高,调试耗时3天。最终确定“成熟框架+数据库事务”组合:
| 技术工具 | 选型理由 | 避坑提醒 |
|---|---|---|
| Spring Boot 2.x + MyBatis-Plus | 快速开发,简化配置,高效实现CRUD和业务逻辑,声明式事务管理方便 | 事务注解@Transactional记得在Service层添加;租车下单和车辆状态更新必须加事务 |
| Vue 2.x + ElementUI | 组件丰富,快速构建前后台界面,表格和表单组件好用 | 订单状态用标签展示;车辆状态用颜色区分 |
| MySQL 5.7 | 存储用户、车辆、订单、还车等核心业务数据 | 金额字段用Decimal类型;事务要保证订单和车辆状态一致性 |
| Thymeleaf(可选) | 服务端模板引擎,适合快速开发后台管理界面 | 毕设时间充裕可统一用Vue |
三、数据库设计:业务关联清晰,支撑车辆-订单-还车闭环
数据库设计直接影响后续开发效率。前期因未设计“订单状态字段”和“车辆状态联动机制”,导致用户还车后车辆状态未自动更新、取消订单与租车订单状态混乱。
1. 核心表结构(精选12张表)
- 管理员表(users):id、username、password(MD5加密)、role、addtime;
- 用户表(yonghu):id、zhanghao(账号)、mima(密码)、xingming(姓名)、nianling(年龄)、xingbie(性别)、shenfenzheng(身份证)、shouji(手机)、touxiang(头像)、addtime;
- 普通管理员表(putongguanliyuan):id、guanlizhanghao(管理账号)、mima(密码)、guanlixingming(管理姓名)、xingbie(性别)、nianling(年龄)、lianxidianhua(联系电话)、touxiang(头像)、addtime;
- 汽车类别表(qicheleibie):id、qicheleibie(汽车类别)、addtime;
- 汽车信息表(qichexinxi):id、chepaihao(车牌号)、cheliangxinghao(车辆型号)、qicheleibie(汽车类别)、cheliangpinpai(车辆品牌)、jiage(日租价格)、yanse(颜色)、zhuangtai(状态)、huandangfangshi(换挡方式)、cheliangzhaopian(车辆照片)、zuoweishu(座位数)、qichepailiang(汽车排量)、qichejiage(汽车价格)、chuchangnianfen(出厂年份)、dengjiriqi(登记日期)、qichejianjie(汽车简介)、guanlizhanghao(管理账号)、guanlixingming(管理姓名)、clicktime、clicknum、addtime;
- 租车订单表(zuchedingdan):id、dingdanbianhao(订单编号)、chepaihao(车牌号)、cheliangpinpai(车辆品牌)、qicheleibie(汽车类别)、jiage(价格)、zuqi(租期)、zongjia(总价)、chuzuriqi(出租日期)、beizhu(备注)、zhanghao(用户账号)、xingming(用户姓名)、shouji(手机)、shenfenzheng(身份证)、guanlizhanghao(管理账号)、guanlixingming(管理姓名)、sfsh(审核状态)、shhf(审核回复)、ispay(支付状态)、addtime;
- 取消订单表(quxiaodingdan):id、dingdanbianhao(订单编号)、chepaihao(车牌号)、cheliangpinpai(车辆品牌)、qicheleibie(汽车类别)、jiage(价格)、zuqi(租期)、zongjia(总价)、quxiaoriqi(取消日期)、quxiaoyuanyin(取消原因)、zhanghao(账号)、xingming(姓名)、shouji(手机)、shenfenzheng(身份证)、guanlizhanghao(管理账号)、guanlixingming(管理姓名)、sfsh(审核状态)、shhf(审核回复)、ispay(支付状态)、addtime;
- 还车信息表(haichexinxi):id、dingdanbianhao(订单编号)、chepaihao(车牌号)、cheliangpinpai(车辆品牌)、qicheleibie(汽车类别)、haicheriqi(还车日期)、haichebeizhu(还车备注)、zhanghao(账号)、xingming(姓名)、shouji(手机)、shenfenzheng(身份证)、guanlizhanghao(管理账号)、guanlixingming(管理姓名)、sfsh(审核状态)、shhf(审核回复)、addtime;
- 汽车资讯表(qichezixun):id、biaoti(标题)、jianjie(简介)、fabushijian(发布时间)、neirong(内容)、faburen(发布人)、fengmian(封面)、clicktime、clicknum、userid、addtime;
- 汽车论坛表(qicheluntan):id、title(帖子标题)、content(帖子内容)、parentid(父节点id)、userid(用户id)、username(用户名)、avatarurl(头像)、isdone(状态)、addtime;
- 留言板表(liuyanban):id、userid、username、avatarurl、content、cpicture、reply、rpicture、addtime;
- 收藏表(shoucang):id、userid、refid、tablename、name、picture、type、addtime。
2. 关键业务SQL示例
示例SQL(查询车辆租车历史及还车记录):
-- 查询指定车辆的租车订单和还车记录
SELECT
z.*,
h.haicheriqi,
h.haichebeizhu,
h.sfsh as huache_status
FROM qichexinxi q
LEFT JOIN zuchedingdan z ON q.chepaihao = z.chepaihao
LEFT JOIN haichexinxi h ON z.dingdanbianhao = h.dingdanbianhao
WHERE q.chepaihao = #{chepaihao}
ORDER BY z.addtime DESC
关键避坑:订单状态需与车辆状态联动;还车审核通过后自动更新车辆状态为可租;取消订单需审核。
四、核心功能实现:8大模块满足答辩需求
无需复杂功能,优先完成以下8个核心模块,其中租车订单与还车联动是答辩重点。
1. 用户/普通管理员管理(人员模块)
- 核心逻辑:管理员管理用户和普通管理员信息(账号、姓名、联系方式等);
- 页面设计:用户列表显示账号、姓名、身份证、手机;普通管理员列表显示管理账号、姓名、电话;
- 代码要点(用户注册):
public void addYonghu(Yonghu user) {
// 校验账号是否重复
LambdaQueryWrapper<Yonghu> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Yonghu::getZhanghao, user.getZhanghao());
if (yonghuMapper.selectCount(wrapper) > 0) {
throw new RuntimeException("账号已存在");
}
user.setAddtime(new Date());
yonghuMapper.insert(user);
}
2. 汽车类别管理(分类模块)
- 核心逻辑:管理员维护汽车类别(轿车、SUV、商务车、跑车等);
- 页面设计:类别列表支持增删改查;
- 代码要点:删除前检查是否有车辆关联。
3. 汽车信息管理(核心资源模块)
- 核心逻辑:普通管理员发布车辆信息(车牌号、型号、品牌、颜色、日租价格、座位数、排量等)→用户浏览、搜索;
- 页面设计:车辆卡片式展示,显示车牌号、品牌、型号、图片、日租价格;详情页展示完整参数;
- 代码要点(车辆发布与状态管理):
@Transactional
public void addQichexinxi(Qichexinxi car) {
// 1. 校验车牌号是否重复
LambdaQueryWrapper<Qichexinxi> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Qichexinxi::getChepaihao, car.getChepaihao());
if (qichexinxiMapper.selectCount(wrapper) > 0) {
throw new RuntimeException("车牌号已存在");
}
car.setZhuangtai("可租");
car.setClicknum(0);
car.setAddtime(new Date());
qichexinxiMapper.insert(car);
log.info("普通管理员 {} 发布了车辆 {}", car.getGuanlixingming(), car.getChepaihao());
}
// 车辆状态更新(租车/还车时调用)
public void updateCarStatus(String chepaihao, String status) {
Qichexinxi car = qichexinxiMapper.selectOne(
new LambdaQueryWrapper<Qichexinxi>().eq(Qichexinxi::getChepaihao, chepaihao)
);
car.setZhuangtai(status);
qichexinxiMapper.updateById(car);
}
4. 租车订单管理(核心业务模块)
- 核心逻辑:用户选择车辆→填写租期→下单→生成订单→管理员/普通管理员审核→支付→车辆状态更新为已租;
- 页面设计:订单列表显示订单编号、车牌号、租期、总价、审核状态、支付状态;
- 代码要点(租车下单与状态联动):
@Transactional
public void addZuchedingdan(Zuchedingdan order) {
// 1. 生成订单编号
String orderId = "DD" + System.currentTimeMillis();
order.setDingdanbianhao(orderId);
// 2. 计算总价
order.setZongjia(order.getJiage() * order.getZuqi());
// 3. 设置初始状态
order.setSfsh("待审核");
order.setIspay("未支付");
order.setAddtime(new Date());
// 4. 保存订单
zuchedingdanMapper.insert(order);
log.info("用户 {} 提交租车订单 {}", order.getXingming(), orderId);
}
// 订单审核通过
@Transactional
public void approveOrder(Long orderId) {
Zuchedingdan order = zuchedingdanMapper.selectById(orderId);
order.setSfsh("通过");
zuchedingdanMapper.updateById(order);
// 更新车辆状态为已租
updateCarStatus(order.getChepaihao(), "已租");
log.info("订单 {} 审核通过,车辆 {} 状态更新为已租",
order.getDingdanbianhao(), order.getChepaihao());
}
// 订单支付
@Transactional
public void payOrder(Long orderId) {
Zuchedingdan order = zuchedingdanMapper.selectById(orderId);
order.setIspay("已支付");
zuchedingdanMapper.updateById(order);
log.info("订单 {} 支付成功", order.getDingdanbianhao());
}
5. 取消订单管理(订单变更模块)
- 核心逻辑:用户申请取消订单→填写取消原因→管理员审核→审核通过后车辆状态恢复为可租;
- 页面设计:取消订单列表显示订单编号、车牌号、取消原因、审核状态;
- 代码要点(取消订单联动):
@Transactional
public void addQuxiaodingdan(Quxiaodingdan cancel) {
// 1. 获取原订单信息
Zuchedingdan order = zuchedingdanMapper.selectOne(
new LambdaQueryWrapper<Zuchedingdan>()
.eq(Zuchedingdan::getDingdanbianhao, cancel.getDingdanbianhao())
);
// 2. 设置取消订单信息
cancel.setChepaihao(order.getChepaihao());
cancel.setCheliangpinpai(order.getCheliangpinpai());
cancel.setQicheleibie(order.getQicheleibie());
cancel.setJiage(order.getJiage());
cancel.setZuqi(order.getZuqi());
cancel.setZongjia(order.getZongjia());
cancel.setZhanghao(order.getZhanghao());
cancel.setXingming(order.getXingming());
cancel.setSfsh("待审核");
cancel.setIspay("未支付");
cancel.setQuxiaoriqi(new Date());
cancel.setAddtime(new Date());
quxiaodingdanMapper.insert(cancel);
log.info("用户 {} 申请取消订单 {}", cancel.getXingming(), cancel.getDingdanbianhao());
}
// 取消订单审核通过
@Transactional
public void approveCancel(Long cancelId) {
Quxiaodingdan cancel = quxiaodingdanMapper.selectById(cancelId);
cancel.setSfsh("通过");
quxiaodingdanMapper.updateById(cancel);
// 车辆状态恢复为可租
updateCarStatus(cancel.getChepaihao(), "可租");
log.info("取消订单 {} 审核通过,车辆 {} 状态恢复为可租",
cancel.getDingdanbianhao(), cancel.getChepaihao());
}
6. 还车信息管理(服务闭环模块)
- 核心逻辑:用户申请还车→填写还车备注→管理员审核→审核通过后车辆状态恢复为可租;
- 页面设计:还车列表显示订单编号、车牌号、还车日期、还车备注、审核状态;
- 代码要点(还车联动):
@Transactional
public void addHaichexinxi(Haichexinxi haiche) {
haiche.setSfsh("待审核");
haiche.setHaicheriqi(new Date());
haiche.setAddtime(new Date());
haichexinxiMapper.insert(haiche);
log.info("用户 {} 申请还车,订单 {}", haiche.getXingming(), haiche.getDingdanbianhao());
}
// 还车审核通过
@Transactional
public void approveHaiche(Long haicheId) {
Haichexinxi haiche = haichexinxiMapper.selectById(haicheId);
haiche.setSfsh("通过");
haichexinxiMapper.updateById(haiche);
// 车辆状态恢复为可租
updateCarStatus(haiche.getChepaihao(), "可租");
// 更新原订单状态为已完成
Zuchedingdan order = zuchedingdanMapper.selectOne(
new LambdaQueryWrapper<Zuchedingdan>()
.eq(Zuchedingdan::getDingdanbianhao, haiche.getDingdanbianhao())
);
order.setSfsh("已完成");
zuchedingdanMapper.updateById(order);
log.info("还车申请 {} 审核通过,车辆 {} 状态恢复为可租",
haiche.getDingdanbianhao(), haiche.getChepaihao());
}
7. 汽车资讯/论坛管理(互动模块)
- 核心逻辑:管理员发布汽车资讯,用户参与论坛交流;
- 页面设计:资讯列表显示标题、封面、发布时间;论坛列表支持发帖/回帖;
- 代码要点:论坛支持楼中楼回复;资讯支持点击量统计。
8. 留言板管理(反馈模块)
- 核心逻辑:用户留言反馈→管理员回复;
- 页面设计:留言板显示留言内容、图片、回复内容;
- 代码要点:支持留言图片上传。
五、汽车租赁特色功能设计(关键加分项)
汽车租赁管理系统的核心在于“车辆全生命周期管理”,即车辆入库、租车出库、还车入库、订单状态流转全流程闭环,以下是实测有效的设计方案:
1. 车辆-订单-还车全流程追溯
| 环节 | 记录内容 | 可追溯信息 |
|---|---|---|
| 车辆发布 | 车牌号、品牌、型号、日租价格、状态 | 什么车、多少钱、可租吗 |
| 租车下单 | 订单编号、租期、总价、审核状态、支付状态 | 谁租的、租多久、多少钱、审核了吗 |
| 订单审核 | 审核状态、审核回复 | 为什么审核通过/拒绝 |
| 取消订单 | 取消原因、审核状态 | 为什么取消、批准了吗 |
| 还车申请 | 还车日期、还车备注、审核状态 | 什么时候还的、车况如何 |
| 车辆状态 | 可租/已租状态 | 车现在能租吗 |
2. 订单状态自动流转
// 订单状态枚举
public enum OrderStatus {
PENDING("待审核"),
APPROVED("已审核"),
PAID("已支付"),
RENTED("已租出"),
RETURNED("已还车"),
CANCELLED("已取消"),
COMPLETED("已完成");
private String desc;
}
// 车辆状态枚举
public enum CarStatus {
AVAILABLE("可租"),
RENTED("已租"),
MAINTENANCE("维护中");
}
3. 租车费用自动计算
// 根据租期和日租价格自动计算总价
public BigDecimal calculateTotalPrice(BigDecimal dailyPrice, int days) {
// 长期租赁优惠:租期≥7天9折,≥30天8折
if (days >= 30) {
return dailyPrice.multiply(new BigDecimal(days)).multiply(new BigDecimal("0.8"));
} else if (days >= 7) {
return dailyPrice.multiply(new BigDecimal(days)).multiply(new BigDecimal("0.9"));
}
return dailyPrice.multiply(new BigDecimal(days));
}
4. 车辆租赁统计
-- 统计各车辆租赁情况
SELECT
q.chepaihao,
q.cheliangpinpai,
q.qicheleibie,
COUNT(z.id) as rent_count,
SUM(z.zuqi) as total_rent_days,
SUM(z.zongjia) as total_income
FROM qichexinxi q
LEFT JOIN zuchedingdan z ON q.chepaihao = z.chepaihao
AND z.sfsh = '通过' AND z.ispay = '已支付'
GROUP BY q.id
ORDER BY rent_count DESC
六、测试与答辩:流程演示为主,突出租车还车闭环
1. 核心测试用例
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 车辆发布全流程 | 普通管理员发布车辆→用户查看 | 车辆信息正确显示;状态为可租 |
| 租车下单流程 | 用户选择车辆→下单→审核通过→支付 | 订单生成;车辆状态更新为已租 |
| 取消订单流程 | 用户申请取消订单→审核通过 | 订单取消;车辆状态恢复为可租 |
| 还车流程 | 用户申请还车→审核通过 | 还车记录生成;车辆状态恢复为可租 |
| 资讯论坛功能 | 管理员发布资讯→用户浏览评论 | 资讯正确显示;论坛可互动 |
2. 答辩准备技巧
- 演示流程:分角色演示(管理员端 + 普通管理员端 + 用户端)→ 普通管理员发布车辆 → 用户浏览并下单租车 → 普通管理员审核订单 → 用户支付 → 车辆状态更新为已租 → 用户申请还车 → 普通管理员审核还车 → 车辆状态恢复为可租 → 展示完整的车辆-订单-还车管理闭环;
- 业务讲解:准备一页PPT展示系统功能结构图(图4-1),说明每个模块的作用和角色定位;
- 技术亮点:重点讲解租车订单与车辆状态的联动机制、取消订单与还车的状态流转、租期费用自动计算;
- 突出问题解决:讲清“如何保证车辆状态实时更新”(租车/还车时联动更新)、“订单审核如何影响车辆”(审核通过/取消时更新状态)、“租期费用如何计算”(日租价格×租期+长期优惠);提前预判“为什么要设计车辆状态字段”,回答“便于用户和管理员实时查看车辆可用性,提高租赁效率”。
结语
本文核心是“聚焦车辆-订单-还车核心业务、实现车辆全生命周期管理、设计完整的汽车租赁闭环”。毕设无需复杂系统,把车辆管理+租车订单+取消订单+还车管理的业务逻辑讲透、实现一个可运行的汽车租赁管理系统、展示完整的租车还车闭环,即可成为答辩亮点。
若需完整项目源码(带详细注释)、测试数据SQL脚本、订单状态流转完整代码,可在评论区留言“SpringBoot汽车租赁管理系统”获取;开发中遇问题(如事务一致性、订单状态流转、车辆状态更新),也可留言咨询~ 祝毕设顺利!🎉