随着汽车共享经济的快速发展,传统租赁行业面临着信息化转型的迫切需求。数字化共享出行管理平台应运而生,该系统采用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缓存提升系统性能,实现智能调度算法优化车辆分配,增加车辆实时监控功能提升安全管理水平。通过持续迭代升级,该系统将更好地服务于共享出行行业的数字化转型需求。