【Java】停车管理系统 SpringBoot+Vue框架 计算机毕业设计项目 Idea+Navicat+MySQL安装 附源码+文档+讲解

95 阅读4分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊

二、系统介绍

开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery

本系统是一套基于Spring Boot和Vue技术栈开发的停车管理系统,采用B/S架构实现停车场的数字化运营管理。系统通过MySQL数据库存储和管理停车场相关数据,运用Spring+SpringMVC+Mybatis框架构建后端服务,前端采用Vue框架实现交互界面。系统涵盖了用户管理、充值记录管理、停车场信息管理、车位信息管理、车位预约管理、车辆入场管理、车辆离场管理、留言反馈管理、敏感词管理等核心功能模块。用户可以通过系统查看停车场及车位信息,进行车位预约,管理员能够实时掌握车辆入场离场情况,处理用户充值和留言反馈。系统还设置了敏感词过滤机制,保障平台信息安全。整个系统实现了从车位预约、入场登记、停车计费到离场结算的完整业务闭环,为停车场运营方提供了便捷的管理工具,同时也为车主提供了高效的停车服务体验。

三、视频解说

停车管理系统

四、部分功能展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、部分代码展示


// ========== 核心功能1: 车位预约管理 ==========
/**
 * 车位预约业务处理
 */
public Result createReservation(ReservationVO reservationVO) {
    // 验证预约时间是否合法
    Date reserveTime = reservationVO.getReserveTime();
    if (reserveTime.before(new Date())) {
        return Result.error("预约时间不能早于当前时间");
    }
    
    // 查询车位是否存在且可用
    ParkingSpace space = parkingSpaceMapper.selectById(reservationVO.getSpaceId());
    if (space == null) {
        return Result.error("车位不存在");
    }
    if (space.getStatus() != 0) {
        return Result.error("车位当前不可用");
    }
    
    // 检查该时间段车位是否已被预约
    QueryWrapper<Reservation> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("space_id", reservationVO.getSpaceId());
    queryWrapper.eq("status", 1); // 状态为已预约
    List<Reservation> existingReservations = reservationMapper.selectList(queryWrapper);
    
    for (Reservation existing : existingReservations) {
        long existingStart = existing.getReserveTime().getTime();
        long existingEnd = existingStart + existing.getDuration() * 60 * 1000;
        long newStart = reserveTime.getTime();
        long newEnd = newStart + reservationVO.getDuration() * 60 * 1000;
        
        if ((newStart >= existingStart && newStart < existingEnd) || 
            (newEnd > existingStart && newEnd <= existingEnd) ||
            (newStart <= existingStart && newEnd >= existingEnd)) {
            return Result.error("该时间段车位已被预约");
        }
    }
    
    // 检查用户余额是否充足
    User user = userMapper.selectById(reservationVO.getUserId());
    double estimatedFee = calculateReservationFee(space.getPricePerHour(), reservationVO.getDuration());
    if (user.getBalance() < estimatedFee) {
        return Result.error("账户余额不足,请先充值");
    }
    
    // 创建预约记录
    Reservation reservation = new Reservation();
    BeanUtils.copyProperties(reservationVO, reservation);
    reservation.setCreateTime(new Date());
    reservation.setStatus(1); // 已预约
    reservation.setEstimatedFee(estimatedFee);
    
    // 更新车位状态为已预约
    space.setStatus(2);
    parkingSpaceMapper.updateById(space);
    
    // 插入预约记录
    int result = reservationMapper.insert(reservation);
    
    if (result > 0) {
        return Result.success("预约成功");
    }
    return Result.error("预约失败");
}

private double calculateReservationFee(double pricePerHour, int durationMinutes) {
    return (pricePerHour / 60) * durationMinutes;
}


// ========== 核心功能2: 车辆入场管理 ==========
/**
 * 车辆入场业务处理
 */
public Result vehicleEntry(EntryRecordVO entryRecordVO) {
    // 验证车牌号格式
    String plateNumber = entryRecordVO.getPlateNumber();
    if (!validatePlateNumber(plateNumber)) {
        return Result.error("车牌号格式不正确");
    }
    
    // 检查车辆是否已在场内
    QueryWrapper<EntryRecord> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("plate_number", plateNumber);
    queryWrapper.eq("status", 1); // 在场状态
    EntryRecord existingRecord = entryRecordMapper.selectOne(queryWrapper);
    if (existingRecord != null) {
        return Result.error("该车辆已在场内,入场时间: " + existingRecord.getEntryTime());
    }
    
    // 查询是否有预约记录
    Reservation reservation = null;
    if (entryRecordVO.getReservationId() != null) {
        reservation = reservationMapper.selectById(entryRecordVO.getReservationId());
        if (reservation == null || reservation.getStatus() != 1) {
            return Result.error("预约记录无效");
        }
        
        // 检查是否在预约时间范围内
        Date now = new Date();
        long reserveTime = reservation.getReserveTime().getTime();
        long allowedEarlyMinutes = 15 * 60 * 1000; // 允许提前15分钟
        if (now.getTime() < (reserveTime - allowedEarlyMinutes)) {
            return Result.error("未到预约时间,最早可于 " + 
                new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date(reserveTime - allowedEarlyMinutes)) + " 入场");
        }
    }
    
    // 分配车位
    ParkingSpace assignedSpace = null;
    if (reservation != null) {
        // 有预约使用预约车位
        assignedSpace = parkingSpaceMapper.selectById(reservation.getSpaceId());
    } else {
        // 无预约自动分配空闲车位
        QueryWrapper<ParkingSpace> spaceQuery = new QueryWrapper<>();
        spaceQuery.eq("status", 0); // 空闲状态
        spaceQuery.eq("parking_lot_id", entryRecordVO.getParkingLotId());
        spaceQuery.last("limit 1");
        assignedSpace = parkingSpaceMapper.selectOne(spaceQuery);
    }
    
    if (assignedSpace == null) {
        return Result.error("暂无可用车位");
    }
    
    // 创建入场记录
    EntryRecord entryRecord = new EntryRecord();
    entryRecord.setPlateNumber(plateNumber);
    entryRecord.setSpaceId(assignedSpace.getId());
    entryRecord.setParkingLotId(entryRecordVO.getParkingLotId());
    entryRecord.setEntryTime(new Date());
    entryRecord.setStatus(1); // 在场
    entryRecord.setReservationId(reservation != null ? reservation.getId() : null);
    
    // 更新车位状态为占用
    assignedSpace.setStatus(1);
    parkingSpaceMapper.updateById(assignedSpace);
    
    // 如果有预约,更新预约状态为已使用
    if (reservation != null) {
        reservation.setStatus(2);
        reservationMapper.updateById(reservation);
    }
    
    // 插入入场记录
    entryRecordMapper.insert(entryRecord);
    
    Map<String, Object> resultData = new HashMap<>();
    resultData.put("spaceNumber", assignedSpace.getSpaceNumber());
    resultData.put("entryTime", entryRecord.getEntryTime());
    return Result.success("入场成功", resultData);
}

private boolean validatePlateNumber(String plateNumber) {
    String regex = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5}$";
    return plateNumber.matches(regex);
}

六、部分文档展示

在这里插入图片描述

七、END

💕💕文末获取源码联系计算机编程果茶熊