车钥匙递过去的那一刻,业务才算真正开始——这是我做完这套Springboot汽车租赁系统后最深的感受。很多人以为租车系统就是“车辆表加订单表”的CRUD,真正动手才发现,从实名认证到车辆状态流转,从押金冻结到超时计费,每个环节都藏着业务细节。这篇文章我会从设计思路、数据库建模、核心模块实现到本地部署,把整个系统的关键决策和落地过程完整拆开讲,给正在做同类项目或准备接手汽车租赁系统开发的同学一份能直接参考的实操笔记。
这个系统面向两类人:一是做毕业设计或课程项目的学生,需要一套结构清晰、能跑通完整业务链路的代码;二是刚入行的后端开发者,想看看一个真实业务系统里订单状态机、并发防重、费用计算这些模块到底怎么组织。内容会覆盖Spring Boot的核心实践、MySQL表结构设计、Redis在业务中的真实用途,以及Windows和Linux两种环境下的部署细节,读完你应该能独立把类似系统搭起来。
1. 整体设计与技术选型思路
1.1 业务复杂度决定了技术栈
汽车租赁系统表面看是信息管理,实际上是一套带着强状态约束的交易系统。用户要注册、实名、选车、下单、支付押金、取车、还车、结算,管理员要管车辆档案、门店、订单、优惠、统计报表。这个链路决定了系统至少需要三个核心能力:可靠的用户认证、严格的订单状态管理、灵活的计费规则。
技术选型我用了Spring Boot 3 + MyBatis-Plus + MySQL + Redis + Spring Security的组合。Spring Boot 3相比2.x最大的变化是基线升级到Jakarta命名空间和Spring Framework 6,新项目直接用Boot 3可以少走一次未来迁移的弯路。MyBatis-Plus选它的原因是单表CRUD不需要手写SQL,像车辆管理、门店管理这类基础模块能省大量重复代码,复杂查询再通过自定义SQL兜底。Redis在这里不是摆设,车辆库存预占、用户登录Token、热点车辆缓存都靠它。
注意:Spring Boot 3要求JDK 17起步,如果你本机是JDK 8,要么升级JDK,要么老老实实用Spring Boot 2.7.x。这是很多新手上来就栽的第一个坑。
1.2 单体架构为什么够用
我没有拆微服务。汽车租赁系统这种业务规模,一个Spring Boot应用加一个MySQL实例完全能扛住,拆成微服务只会引入服务注册、配置中心、分布式事务这些和核心业务无关的复杂度。单体架构的好处是调试方便,IDE里一个应用直接跑起来,断点想打哪打哪,对学习和二次开发都友好。
项目结构上按模块分包而不是按技术层分包:controller、service、mapper这些是技术层,而user、car、order、store、coupon是业务域。我推荐按业务域组织代码,因为需求变更通常围绕某个业务域展开,比如给订单模块加个取消逻辑,你只需要动order包下的文件,而不是在十几个controller和service之间来回跳。具体分包方式是controller、service、mapper、entity、dto、vo、config、common并列,其中dto放请求入参、vo放接口返回结构、common放统一响应体、异常处理、工具类。
1.3 认证方案:JWT还是Session
租车系统有用户端和管理端,用户端需要支持手机号登录,管理端需要账号密码登录,两边都会调用后端接口。我用JWT做无状态认证,用户登录成功后后端签发一个token返回给前端,前端存在本地存储里,每次请求放到Authorization头里。
为什么不用Session?因为租车系统未来很可能要扩展小程序或App端,多端共用一套认证体系时,JWT的天然无状态特性让你不需要额外做Session同步。另外Spring Security的过滤器链处理JWT非常顺手,写一个OncePerRequestFilter,从请求头解析token,校验通过后把用户信息塞进SecurityContext,后续接口直接用注解拿当前用户即可。
Spring Security在Spring Boot 3里的配置方式和旧版差异很大,主要的坑在于lambda配置写法。比如放行注册登录接口:
java复制http
.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.sessionCreatio
