汽车租赁行业正经历从传统人工管理向数字化运营的转型过程。作为一名参与过多个企业级系统开发的Java全栈工程师,我将分享基于SpringBoot+Vue3+MyBatis技术栈实现的汽车租赁管理系统开发经验。这个系统采用前后端分离架构,前端使用Vue3+Element Plus构建响应式界面,后端基于SpringBoot提供RESTful API,数据持久层采用MyBatis操作MySQL数据库。
在实际开发中,我们主要解决了以下几个核心问题:
系统完整实现了车辆信息管理、用户租赁、订单处理、费用结算等业务流程,并提供了数据统计看板辅助决策。下面将从技术选型、核心实现和实战经验三个维度展开详细解析。
系统采用经典的三层架构:
code复制前端层:Vue3 + Element Plus + Axios + Vue Router
后端层:SpringBoot 2.7 + Spring Security + JWT
数据层:MySQL 8.0 + MyBatis-Plus + Druid
前后端通过RESTful API交互,使用JWT进行身份认证。这种架构的优势在于:
前端技术栈选择依据:
后端技术栈选择依据:
数据库设计原则:
车辆信息表设计遵循以下规范:
sql复制CREATE TABLE `car_info` (
`car_id` bigint NOT NULL AUTO_INCREMENT COMMENT '车辆ID',
`car_model` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '车型',
`car_plate` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '车牌',
`car_status` tinyint NOT NULL DEFAULT '0' COMMENT '0-空闲 1-已租',
`daily_price` decimal(10,2) NOT NULL COMMENT '日租金',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`car_id`),
UNIQUE KEY `idx_plate` (`car_plate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
关键实现代码(SpringBoot):
java复制@RestController
@RequestMapping("/api/car")
public class CarController {
@Autowired
private CarService carService;
@GetMapping("/list")
public Result list(@RequestParam(required = false) Integer status) {
LambdaQueryWrapper<CarInfo> wrapper = new LambdaQueryWrapper<>();
if (status != null) {
wrapper.eq(CarInfo::getCarStatus, status);
}
return Result.success(carService.list(wrapper));
}
@PostMapping("/updateStatus")
@Transactional
public Result updateStatus(@RequestBody CarStatusDTO dto) {
CarInfo car = carService.getById(dto.getCarId());
if (car == null) {
return Result.error("车辆不存在");
}
car.setCarStatus(dto.getStatus());
return Result.success(carService.updateById(car));
}
}
订单状态机设计:
code复制待支付 → 已支付 → 使用中 → 已完成
↓
已取消
订单创建业务逻辑:
关键代码示例:
java复制public class OrderServiceImpl implements OrderService {
@Override
@Transactional
public Result createOrder(OrderCreateDTO dto) {
// 1. 验证车辆状态
CarInfo car = carService.getById(dto.getCarId());
if (car.getCarStatus() != 0) {
throw new BusinessException("车辆不可租");
}
// 2. 计算费用
long days = ChronoUnit.DAYS.between(
dto.getStartTime().toLocalDate(),
dto.getEndTime().toLocalDate()
);
BigDecimal amount = car.getDailyPrice().multiply(new BigDecimal(days));
// 3. 创建订单
RentalOrder order = new RentalOrder();
order.setOrderId(SnowFlake.nextId());
order.setUserId(SecurityUtil.getCurrentUserId());
order.setCarId(dto.getCarId());
order.setStartTime(dto.getStartTime());
order.setEndTime(dto.getEndTime());
order.setTotalAmount(amount);
order.setOrderStatus(0);
// 4. 更新车辆状态
car.setCarStatus(1);
carService.updateById(car);
orderMapper.insert(order);
return Result.success(order.getOrderId());
}
}
系统采用角色-权限模型:
code复制用户角色:
- 普通用户:查看车辆、创建订单
- 管理员:车辆CRUD、订单管理、数据统计
权限控制实现:
1. 前端:基于路由守卫控制菜单可见性
2. 后端:Spring Security + 方法级注解
安全配置示例:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/user/**").hasAnyRole("USER", "ADMIN")
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
}
}
令牌生成代码:
java复制public class JwtUtil {
private static final String SECRET = "your-secret-key";
private static final long EXPIRATION = 86400000; // 24小时
public static String generateToken(Long userId, String role) {
return Jwts.builder()
.setSubject(userId.toString())
.claim("role", role)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static Claims parseToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody();
}
}
缓存策略:
数据库优化:
前端优化:
问题1:车辆状态不同步
问题2:并发下单冲突
java复制@Transactional
public Result createOrder(OrderCreateDTO dto) {
// 使用SELECT FOR UPDATE锁定记录
CarInfo car = carMapper.selectByIdForUpdate(dto.getCarId());
if (car.getStatus() != 0) {
throw new BusinessException("车辆已被预订");
}
// ...后续操作
}
问题3:JWT令牌失效
智能推荐系统:
风控模块:
IoT集成:
微服务改造:
环境要求:
启动步骤:
bash复制# 克隆项目
git clone https://github.com/your-repo/car-rental.git
# 配置数据库
mysql -uroot -p < docs/sql/schema.sql
# 修改配置
vim src/main/resources/application-prod.yml
# 打包运行
mvn clean package -DskipTests
java -jar target/car-rental.jar --spring.profiles.active=prod
环境要求:
构建流程:
bash复制# 安装依赖
npm install
# 配置环境变量
cp .env.production .env
# 构建生产包
npm run build
# 部署到Nginx
cp -r dist/* /usr/share/nginx/html/
Nginx配置示例:
nginx复制server {
listen 80;
server_name your-domain.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
}
}
在实际开发过程中,有几个关键点值得特别注意:
状态一致性保证:车辆状态与订单状态的同步是系统可靠性的关键。我们最终采用了数据库事务+乐观锁的方案,在并发测试中表现良好。
接口设计原则:RESTful接口设计要遵循以下规范:
前端工程化:建议在Vue3项目中:
测试策略:
文档规范:
这个项目让我深刻体会到,一个高质量的汽车租赁系统不仅需要完善的功能实现,更需要考虑实际业务场景中的各种边界情况。比如节假日价格浮动、车辆维修状态处理、用户信用评估等,都需要在系统设计中充分考虑。