基于SSM框架的共享汽车租赁管理系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-144 浏览

文章摘要

本项目是一款基于SSM(Spring+Spring MVC+MyBatis)框架技术栈构建的共享汽车租赁管理系统,旨在为汽车租赁企业或共享出行平台提供一个集车辆管理、订单处理、用户服务于一体的综合性业务中台。其核心业务价值在于通过数字化的方式,有效解决传统汽车租赁行业中信息不透明、车辆调度效率低、人...

随着汽车共享经济的快速发展,传统租赁行业面临着信息化转型的迫切需求。数字化共享出行管理平台应运而生,该系统采用SSM(Spring+Spring MVC+MyBatis)技术栈构建,为汽车租赁企业提供全流程的智能化管理解决方案。

系统采用经典的三层架构设计。表现层基于Spring MVC框架,通过Controller接收前端请求并实现参数校验与页面转发,结合JSP视图技术动态渲染用户界面。业务逻辑层依托Spring框架的IoC容器进行Bean管理,利用AOP切面编程统一处理事务控制、日志记录等横切关注点。数据持久层采用MyBatis框架,通过灵活的XML映射配置实现与MySQL数据库的高效交互。

数据库设计包含11个核心数据表,其中车辆信息表的设计尤为关键:

CREATE TABLE `car_info` (
  `car_id` int(11) NOT NULL AUTO_INCREMENT,
  `car_brand` varchar(50) NOT NULL COMMENT '车辆品牌',
  `car_model` varchar(50) NOT NULL COMMENT '车型',
  `license_plate` varchar(20) NOT NULL UNIQUE COMMENT '车牌号',
  `current_mileage` decimal(10,2) DEFAULT '0.00' COMMENT '当前里程',
  `rental_status` tinyint(1) DEFAULT '0' COMMENT '租赁状态',
  `daily_rate` decimal(10,2) NOT NULL COMMENT '日租金',
  `location_id` int(11) NOT NULL COMMENT '所属网点',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`car_id`),
  KEY `idx_status_location` (`rental_status`,`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该表通过唯一索引确保车牌号不重复,联合索引提升按状态和网点的查询效率,decimal类型精确存储金额和里程数据。

订单表的设计体现了业务复杂性:

CREATE TABLE `rental_order` (
  `order_id` varchar(32) NOT NULL COMMENT '订单编号',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `car_id` int(11) NOT NULL COMMENT '车辆ID',
  `start_time` datetime NOT NULL COMMENT '取车时间',
  `end_time` datetime NOT NULL COMMENT '还车时间',
  `actual_end_time` datetime DEFAULT NULL COMMENT '实际还车时间',
  `total_amount` decimal(10,2) NOT NULL COMMENT '订单总额',
  `order_status` enum('pending','confirmed','using','completed','cancelled') DEFAULT 'pending',
  `insurance_fee` decimal(10,2) DEFAULT '0.00' COMMENT '保险费用',
  `deposit_amount` decimal(10,2) NOT NULL COMMENT '押金金额',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_status` (`user_id`,`order_status`),
  KEY `idx_car_time` (`car_id`,`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

采用枚举类型规范订单状态流转,多字段索引优化用户订单查询和车辆时间冲突检测。

车辆管理模块实现完整的CRUD操作。CarController中新增车辆的接口实现:

@Controller
@RequestMapping("/admin/car")
public class CarController {
    
    @Autowired
    private CarService carService;
    
    @PostMapping("/add")
    @ResponseBody
    public ResultVO addCar(@Valid CarInfo carInfo, BindingResult result) {
        if (result.hasErrors()) {
            return ResultVO.error(result.getFieldError().getDefaultMessage());
        }
        
        try {
            carService.addCar(carInfo);
            return ResultVO.success("车辆添加成功");
        } catch (DuplicateKeyException e) {
            return ResultVO.error("车牌号已存在");
        }
    }
    
    @GetMapping("/list")
    @ResponseBody
    public PageResult<CarInfo> getCarList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit,
            String searchKey) {
        return carService.getCarList(page, limit, searchKey);
    }
}

服务层实现业务逻辑和事务管理:

@Service
@Transactional
public class CarServiceImpl implements CarService {
    
    @Autowired
    private CarMapper carMapper;
    
    @Override
    public void addCar(CarInfo carInfo) {
        // 设置默认状态为可用
        carInfo.setRentalStatus(0);
        carInfo.setCreateTime(new Date());
        carMapper.insert(carInfo);
        
        // 记录车辆添加日志
        logService.recordOperation("添加车辆", "车牌号:" + carInfo.getLicensePlate());
    }
    
    @Override
    public PageResult<CarInfo> getCarList(Integer page, Integer limit, String searchKey) {
        PageHelper.startPage(page, limit);
        List<CarInfo> cars = carMapper.selectByCondition(searchKey);
        PageInfo<CarInfo> pageInfo = new PageInfo<>(cars);
        return new PageResult<>(pageInfo.getTotal(), cars);
    }
}

MyBatis映射文件实现复杂查询:

<mapper namespace="com.rental.mapper.CarMapper">
    <select id="selectByCondition" resultType="CarInfo">
        SELECT c.*, l.location_name, b.brand_name 
        FROM car_info c
        LEFT JOIN lease_location l ON c.location_id = l.location_id
        LEFT JOIN car_brand b ON c.brand_id = b.brand_id
        <where>
            <if test="searchKey != null and searchKey != ''">
                AND (c.license_plate LIKE CONCAT('%', #{searchKey}, '%') 
                     OR c.car_model LIKE CONCAT('%', #{searchKey}, '%'))
            </if>
        </where>
        ORDER BY c.create_time DESC
    </select>
</mapper>

订单生成模块处理复杂的业务规则。OrderService中创建订单的核心逻辑:

@Service
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private CarMapper carMapper;
    @Autowired
    private OrderMapper orderMapper;
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResultVO createOrder(OrderCreateDTO orderDTO) {
        // 检查车辆可用性
        CarInfo car = carMapper.selectById(orderDTO.getCarId());
        if (car == null || car.getRentalStatus() != 0) {
            return ResultVO.error("车辆不可用");
        }
        
        // 检查时间冲突
        int conflictCount = orderMapper.checkTimeConflict(
            orderDTO.getCarId(), orderDTO.getStartTime(), orderDTO.getEndTime());
        if (conflictCount > 0) {
            return ResultVO.error("该时间段车辆已被预约");
        }
        
        // 计算租赁费用
        BigDecimal amount = calculateRentalAmount(orderDTO, car);
        
        // 创建订单
        RentalOrder order = buildOrder(orderDTO, car, amount);
        orderMapper.insert(order);
        
        // 更新车辆状态
        carMapper.updateStatus(orderDTO.getCarId(), 1);
        
        return ResultVO.success("订单创建成功", order.getOrderId());
    }
    
    private BigDecimal calculateRentalAmount(OrderCreateDTO dto, CarInfo car) {
        long days = ChronoUnit.DAYS.between(
            dto.getStartTime().toInstant(), dto.getEndTime().toInstant());
        return car.getDailyRate().multiply(new BigDecimal(days))
                .add(dto.getInsuranceFee());
    }
}

用户界面提供直观的操作体验。车辆查询页面通过AJAX实现动态加载:

function loadCarList(locationId, startTime, endTime) {
    $.ajax({
        url: '/car/available',
        type: 'GET',
        data: {
            locationId: locationId,
            startTime: startTime,
            endTime: endTime
        },
        success: function(result) {
            if (result.code === 200) {
                renderCarList(result.data);
            } else {
                alert('查询失败:' + result.message);
            }
        }
    });
}

function renderCarList(cars) {
    let html = '';
    cars.forEach(car => {
        html += `<div class="car-item">
            <img src="${car.imageUrl}" alt="${car.carModel}">
            <h3>${car.carBrand} ${car.carModel}</h3>
            <p>日租金:¥${car.dailyRate}</p>
            <button onclick="selectCar(${car.carId})">立即预订</button>
        </div>`;
    });
    $('#carListContainer').html(html);
}

车辆管理界面 管理员可通过该界面管理所有车辆信息,包括状态监控、价格调整和位置管理。

订单提交页面 用户在选择车辆后进入订单确认页面,系统自动计算租赁费用并显示明细。

用户订单管理 用户可查看历史订单和当前订单状态,进行取消或续租操作。

实体模型设计采用面向对象原则,核心实体关系清晰。CarInfo实体类定义:

public class CarInfo {
    private Integer carId;
    private String carBrand;
    private String carModel;
    private String licensePlate;
    private BigDecimal currentMileage;
    private Integer rentalStatus;
    private BigDecimal dailyRate;
    private Integer locationId;
    private Date createTime;
    
    // 关联属性
    private String locationName;
    private List<RentalOrder> orders;
    
    // getter/setter方法
    public Integer getCarId() { return carId; }
    public void setCarId(Integer carId) { this.carId = carId; }
    
    public String getCarBrand() { return carBrand; }
    public void setCarBrand(String carBrand) { this.carBrand = carBrand; }
    
    // 其他getter/setter方法...
}

RentalOrder实体包含完整的订单业务属性:

public class RentalOrder {
    private String orderId;
    private Integer userId;
    private Integer carId;
    private Date startTime;
    private Date endTime;
    private Date actualEndTime;
    private BigDecimal totalAmount;
    private String orderStatus;
    private BigDecimal insuranceFee;
    private BigDecimal depositAmount;
    
    // 关联实体
    private UserInfo user;
    private CarInfo car;
    
    public enum Status {
        PENDING("待确认"),
        CONFIRMED("已确认"),
        USING("使用中"),
        COMPLETED("已完成"),
        CANCELLED("已取消");
        
        private String description;
        Status(String desc) { this.description = desc; }
        public String getDescription() { return description; }
    }
}

系统在以下方面具有显著优势:基于SSM框架的稳定架构保证系统可靠性,完善的事务管理确保数据一致性,灵活的查询机制支持复杂业务场景,响应式前端设计提升用户体验。

未来优化方向包括:集成第三方支付平台实现线上支付闭环,开发移动端APP扩展用户使用场景,引入Redis缓存提升系统性能,实现智能调度算法优化车辆分配,增加车辆实时监控功能提升安全管理水平。通过持续迭代升级,该系统将更好地服务于共享出行行业的数字化转型需求。

本文关键词
SSM框架共享汽车租赁管理系统源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章