基于JSP+Servlet的智能停车场管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-02-216 浏览

文章摘要

智能停车场管理系统是基于JSP和Servlet技术栈开发的一套综合性业务平台,旨在解决传统停车场人工管理效率低、收费不透明、车位利用率不足等核心痛点。系统通过数字化的车位状态监控与无现金支付流程,显著降低运营成本并提升车主体验。其核心业务价值在于将分散的停车场资源进行集中化、自动化管理,实现空闲车位...

在城市化进程加速的背景下,机动车保有量持续增长,传统停车场管理模式面临严峻挑战。人工记录车辆进出、现金支付收费、纸质凭据管理等落后手段不仅效率低下,还容易因信息不透明引发纠纷。为解决这些痛点,基于JSP+Servlet技术栈的智慧停车管理平台应运而生,实现了停车场运营的全面数字化升级。

该系统采用经典的三层架构设计,前端使用JSP动态页面技术结合HTML/CSS/JavaScript进行用户界面渲染,中间层通过Servlet控制器处理业务逻辑,后端采用MySQL数据库进行数据持久化存储。这种分层架构确保了系统的高内聚低耦合特性,便于后续功能扩展和维护升级。

数据库架构设计与核心表分析

系统数据库包含6张核心表,每张表都经过精心设计以满足复杂的业务需求。其中停车位表、用户表和停车记录表的设计尤为关键,体现了系统的核心业务逻辑。

停车位表(parking_space)设计:

CREATE TABLE parking_space (
    space_id INT PRIMARY KEY AUTO_INCREMENT,
    space_number VARCHAR(20) NOT NULL UNIQUE,
    space_type ENUM('standard', 'vip', 'disabled') DEFAULT 'standard',
    current_status ENUM('available', 'occupied', 'reserved', 'maintenance') DEFAULT 'available',
    zone VARCHAR(50),
    hourly_rate DECIMAL(8,2) NOT NULL,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_updated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

该表设计采用枚举类型规范车位状态和类型,通过last_updated字段的自动更新机制确保状态实时性。分区设计(zone字段)支持大型停车场的区域化管理,为车位导航功能奠定基础。

用户表(user)的账户安全设计:

CREATE TABLE user (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    salt VARCHAR(50) NOT NULL,
    full_name VARCHAR(100) NOT NULL,
    phone VARCHAR(20),
    email VARCHAR(100),
    user_type ENUM('admin', 'regular', 'vip') DEFAULT 'regular',
    account_balance DECIMAL(10,2) DEFAULT 0.00,
    registration_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_login DATETIME,
    is_active BOOLEAN DEFAULT TRUE
);

用户表采用密码加盐哈希存储技术,有效保障账户安全。账户余额字段支持预付费模式,用户类型枚举实现差异化服务,为会员制度提供数据支撑。

停车记录表(parking_record)的事务完整性设计:

CREATE TABLE parking_record (
    record_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    space_id INT NOT NULL,
    license_plate VARCHAR(15) NOT NULL,
    entry_time DATETIME NOT NULL,
    exit_time DATETIME,
    total_duration INT,
    total_amount DECIMAL(10,2),
    payment_status ENUM('pending', 'paid', 'cancelled') DEFAULT 'pending',
    payment_method ENUM('cash', 'card', 'mobile'),
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(user_id),
    FOREIGN KEY (space_id) REFERENCES parking_space(space_id)
);

该表通过外键约束确保数据引用完整性,时间戳记录支持计费计算,支付状态机设计保证业务流程的正确性。

核心业务功能实现解析

用户身份认证与会话管理

系统采用基于Session的认证机制,用户登录后服务器端创建会话并存储用户状态。LoginServlet负责处理认证逻辑:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String userType = request.getParameter("userType");
        
        UserDAO userDAO = new UserDAO();
        User user = userDAO.authenticate(username, password, userType);
        
        if (user != null) {
            HttpSession session = request.getSession();
            session.setAttribute("currentUser", user);
            session.setMaxInactiveInterval(30 * 60); // 30分钟超时
            
            if ("admin".equals(userType)) {
                response.sendRedirect("admin/dashboard.jsp");
            } else {
                response.sendRedirect("user/dashboard.jsp");
            }
        } else {
            request.setAttribute("errorMessage", "用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

用户登录界面

认证过程采用预处理语句防止SQL注入,会话超时设置平衡安全性与用户体验。不同角色登录后跳转至对应的功能面板,实现权限隔离。

停车位状态实时监控与分配

车位管理模块通过ParkingSpaceServlet处理车位查询和状态更新:

@WebServlet("/parkingSpace")
public class ParkingSpaceServlet extends HttpServlet {
    private ParkingSpaceDAO spaceDAO = new ParkingSpaceDAO();
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String action = request.getParameter("action");
        
        if ("getAvailableSpaces".equals(action)) {
            List<ParkingSpace> availableSpaces = spaceDAO.getAvailableSpaces();
            request.setAttribute("spaces", availableSpaces);
            request.getRequestDispatcher("parking/spaceStatus.jsp").forward(request, response);
        }
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String spaceId = request.getParameter("spaceId");
        String newStatus = request.getParameter("status");
        
        boolean success = spaceDAO.updateSpaceStatus(Integer.parseInt(spaceId), newStatus);
        
        JsonObject jsonResponse = new JsonObject();
        jsonResponse.addProperty("success", success);
        response.setContentType("application/json");
        response.getWriter().write(jsonResponse.toString());
    }
}

停车位管理界面

前端通过Ajax定时轮询车位状态变化,管理员可实时查看车位占用情况。DAO层采用连接池技术优化数据库访问性能:

public class ParkingSpaceDAO {
    private DataSource dataSource;
    
    public ParkingSpaceDAO() {
        this.dataSource = DatabaseConnection.getDataSource();
    }
    
    public List<ParkingSpace> getAvailableSpaces() {
        List<ParkingSpace> spaces = new ArrayList<>();
        String sql = "SELECT * FROM parking_space WHERE current_status = 'available'";
        
        try (Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {
            
            while (rs.next()) {
                ParkingSpace space = mapResultSetToSpace(rs);
                spaces.add(space);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return spaces;
    }
    
    private ParkingSpace mapResultSetToSpace(ResultSet rs) throws SQLException {
        ParkingSpace space = new ParkingSpace();
        space.setSpaceId(rs.getInt("space_id"));
        space.setSpaceNumber(rs.getString("space_number"));
        space.setSpaceType(rs.getString("space_type"));
        space.setCurrentStatus(rs.getString("current_status"));
        space.setHourlyRate(rs.getBigDecimal("hourly_rate"));
        return space;
    }
}

停车计费与支付处理

计费模块采用策略模式支持不同的计价规则,PaymentServlet处理支付逻辑:

@WebServlet("/payment")
public class PaymentServlet extends HttpServlet {
    private PaymentService paymentService = new PaymentService();
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        int recordId = Integer.parseInt(request.getParameter("recordId"));
        String paymentMethod = request.getParameter("paymentMethod");
        
        try {
            PaymentResult result = paymentService.processPayment(recordId, paymentMethod);
            
            if (result.isSuccess()) {
                request.setAttribute("paymentInfo", result.getPaymentInfo());
                request.getRequestDispatcher("payment/success.jsp").forward(request, response);
            } else {
                request.setAttribute("error", result.getErrorMessage());
                request.getRequestDispatcher("payment/failed.jsp").forward(request, response);
            }
        } catch (PaymentException e) {
            throw new ServletException("支付处理失败", e);
        }
    }
}

停车支付管理

支付服务类封装了复杂的事务处理逻辑,确保资金扣款和订单状态更新的原子性:

public class PaymentService {
    public PaymentResult processPayment(int recordId, String paymentMethod) throws PaymentException {
        Connection conn = null;
        PaymentResult result = new PaymentResult();
        
        try {
            conn = DatabaseConnection.getConnection();
            conn.setAutoCommit(false);
            
            // 获取停车记录和计算费用
            ParkingRecord record = parkingRecordDAO.getRecordById(recordId, conn);
            BigDecimal amount = calculateAmount(record);
            
            // 扣款操作
            boolean debitSuccess = accountService.debitAccount(record.getUserId(), amount, conn);
            if (!debitSuccess) {
                conn.rollback();
                result.setSuccess(false);
                result.setErrorMessage("余额不足");
                return result;
            }
            
            // 更新订单状态
            boolean updateSuccess = parkingRecordDAO.updatePaymentStatus(recordId, "paid", paymentMethod, conn);
            if (!updateSuccess) {
                conn.rollback();
                result.setSuccess(false);
                result.setErrorMessage("订单状态更新失败");
                return result;
            }
            
            conn.commit();
            result.setSuccess(true);
            result.setPaymentInfo(generatePaymentInfo(record, amount));
            
        } catch (SQLException e) {
            try {
                if (conn != null) conn.rollback();
            } catch (SQLException ex) {
                throw new PaymentException("事务回滚失败", ex);
            }
            throw new PaymentException("支付处理异常", e);
        } finally {
            DatabaseConnection.closeConnection(conn);
        }
        
        return result;
    }
}

用户账户与车辆信息管理

用户个人中心支持多车辆管理和账户余额查询:

@WebServlet("/vehicle")
public class VehicleServlet extends HttpServlet {
    private VehicleDAO vehicleDAO = new VehicleDAO();
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("currentUser");
        
        List<Vehicle> vehicles = vehicleDAO.getVehiclesByUserId(user.getUserId());
        request.setAttribute("vehicles", vehicles);
        request.getRequestDispatcher("user/vehicleManagement.jsp").forward(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String action = request.getParameter("action");
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("currentUser");
        
        if ("add".equals(action)) {
            Vehicle vehicle = extractVehicleFromRequest(request);
            vehicle.setUserId(user.getUserId());
            vehicleDAO.addVehicle(vehicle);
        } else if ("delete".equals(action)) {
            String vehicleId = request.getParameter("vehicleId");
            vehicleDAO.deleteVehicle(Integer.parseInt(vehicleId), user.getUserId());
        }
        
        response.sendRedirect("vehicle?action=list");
    }
}

车辆信息管理

实体模型设计与业务逻辑封装

系统采用面向对象设计,核心实体类封装了丰富的业务行为:

public class ParkingSpace {
    private int spaceId;
    private String spaceNumber;
    private String spaceType;
    private String currentStatus;
    private BigDecimal hourlyRate;
    private String zone;
    
    // 计算停车费用
    public BigDecimal calculateParkingFee(Date entryTime, Date exitTime) {
        long durationMinutes = (exitTime.getTime() - entryTime.getTime()) / (1000 * 60);
        long hours = (durationMinutes + 59) / 60; // 向上取整
        
        // VIP车位折扣计算
        if ("vip".equals(this.spaceType)) {
            return hourlyRate.multiply(BigDecimal.valueOf(hours))
                           .multiply(BigDecimal.valueOf(0.8)); // 8折优惠
        }
        
        return hourlyRate.multiply(BigDecimal.valueOf(hours));
    }
    
    // 检查车位是否可用
    public boolean isAvailable() {
        return "available".equals(this.currentStatus);
    }
    
    // 省略getter/setter方法
}

public class User {
    private int userId;
    private String username;
    private String userType;
    private BigDecimal accountBalance;
    
    // 账户充值
    public boolean recharge(BigDecimal amount) {
        if (amount.compareTo(BigDecimal.ZERO) > 0) {
            this.accountBalance = this.accountBalance.add(amount);
            return true;
        }
        return false;
    }
    
    // 检查余额是否足够支付
    public boolean hasSufficientBalance(BigDecimal amount) {
        return this.accountBalance.compareTo(amount) >= 0;
    }
}

系统优化与功能扩展方向

  1. 智能车位推荐算法:基于用户历史停车偏好和实时车位数据,开发个性化推荐系统。可通过协同过滤算法分析用户行为模式,优先推荐相似用户偏好的车位区域。

  2. 无感支付集成:对接车牌识别技术和第三方支付平台,实现车辆离场时自动扣费。技术实现需要增加车牌识别摄像头接口和支付API集成模块。

  3. 大数据分析平台:构建停车数据仓库,分析高峰期流量、车位周转率等指标,为停车场运营决策提供数据支持。可采用ELK栈实现数据可视化。

  4. 预约停车功能:开发车位预约系统,支持用户提前预定车位。需要新增预约表结构并实现超时自动取消机制,防止资源占用。

  5. 移动端应用开发:基于React Native或Flutter开发跨平台移动应用,提供更便捷的用户体验。需要设计RESTful API接口供移动端调用。

智慧停车管理平台通过精细化的数据库设计、严谨的业务逻辑封装和友好的用户界面,为停车场运营提供了完整的数字化解决方案。系统架构具有良好的扩展性,为未来功能升级奠定了坚实基础。随着物联网和人工智能技术的发展,该系统可进一步演进为更加智能化的停车生态系统。

本文关键词
JSPServlet智能停车场管理系统源码解析数据库设计

上下篇

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