基于Javase的停车场收费管理系统

基于Javase的停车场收费管理系统

停车场管理系统开发文档

  1. 项目概述
    1.1 项目背景
    随着现代化城市的不断发展,车辆数量不断增加,停车难问题也日益突出。为了更好地管理停车场资
    源,提升停车效率,需要一个基于Java SE的停车场管理系统,来实现对车辆的有序管理和停车场的动态监控。
    1.2 项目目标
    停车场管理系统旨在提供停车位的分配、车辆进出场记录、停车费用计算等功能,提升停车场管理的效率和用户体验。
  2. 系统需求
    2.1 功能需求
    用户端
    车辆进场登记:记录车辆进场时间、车牌号及分配停车位。
    车辆出场登记:记录车辆出场时间、计算停车费用。
    停车位管理:实时查看停车位的空闲和占用情况。
    费用结算:按照停车时长计算停车费用,并支持不同的收费标准。
    报表生成:生成每日的停车场运营报表,记录车辆出场管理端生成验证码进行登录:
    当进入管理端时需要生成验证码并且输入,成功进入后台,输入机会只有三次
    在场车辆:查看当前停车场在场车辆
    离场车辆:查看当前停车场已经立场的车辆
    营业额统计:查看总营业额
    用户反馈:可以查看用户的反馈信息
    2.2 非功能需求
    易用性:系统界面简单易用,方便管理员操作。
    扩展性:系统应具备良好的扩展能力,能够根据需求添加新的功能模块。
  3. 详细设计
    4.1 车辆进出流程
  4. 车辆入场流程:
    当车辆到达停车场时,管理员在系统中输入车牌号,系统自动分配一个空闲的停车位并记录进
    场时间。
    若无空闲停车位,系统提示停车场已满。
    当输入车牌号时,需要辨别车牌号是否有效
  5. 车辆出场流程:
    当车辆离开时,管理员在系统中查找该车辆的停车记录,系统计算停车时长并依据收费标准计
    算停车费用。
    系统释放该停车位,将车辆记录标记为已出场。
    4.2 停车费用计算
    系统支持按小时、按分钟等方式计算费用,假设每小时收费10元,收费公式如下:
  6. 技术选型
    开发语言:Java SE
  7. 测试方案
    车辆进出场功能
    停车费用计算功能
    停车位分配功能
    6.3 用户测试
    模拟管理员的日常操作,测试系统界面的易用性、功能的完整性和系统性能

项目源码

创建汽车类Car

abstract class Car {// 车牌号private String CarNum;// 车辆类型private String CarType;// 车辆品牌private String CarBrand;// 车辆型号private String CarModel;// 入场时间private long CarInTime;// 出场时间private long CarOutTime;public Car(String carNum, String carType, String carBrand, String carModel, long carInTime, long carOutTime) {CarNum = carNum;CarType = carType;CarBrand = carBrand;CarModel = carModel;CarInTime = carInTime;CarOutTime = carOutTime;}public String getCarNum() {return CarNum;}public void setCarNum(String carNum) {CarNum = carNum;}public String getCarType() {return CarType;}public void setCarType(String carType) {CarType = carType;}public String getCarBrand() {return CarBrand;}public void setCarBrand(String carBrand) {CarBrand = carBrand;}public String getCarModel() {return CarModel;}public void setCarModel(String carModel) {CarModel = carModel;}public long getCarInTime() {return CarInTime;}public void setCarInTime(long carInTime) {CarInTime = carInTime;}public long getCarOutTime() {return CarOutTime;}public void setCarOutTime(long carOutTime) {CarOutTime = carOutTime;}// 抽象方法,由子类实现计算停车费用public abstract double calculateParkingFee();
}

创建轿车子类Sedan

// 轿车类,继承自Car类
class Sedan extends Car {public Sedan(String carNum, String carType, String carBrand, String carModel, long carInTime, long carOutTime) {super(carNum, carType, carBrand, carModel, carInTime, carOutTime);}@Overridepublic double calculateParkingFee() {long duration = (getCarOutTime() - getCarInTime()) / 1000 / 60;if (duration <= 30) {return 2.5;} else if (duration <= 60) {return 5;} else {return 5 * (duration / 60) + (duration % 60 <= 30? 2.5 : 5);}}
}

创建客车子类Bus

// 客车类,继承自Car类
class Bus extends Car {public Bus(String carNum, String carType, String carBrand, String carModel, long carInTime, long carOutTime) {super(carNum, carType, carBrand, carModel, carInTime, carOutTime);}@Overridepublic double calculateParkingFee() {long duration = (getCarOutTime() - getCarInTime()) / 1000 / 60;if (duration <= 30) {return 5;} else if (duration <= 60) {return 10;} else {return 10 * (duration / 60) + (duration % 60 <= 30? 5: 10);}}
}

创建停车场管理类ParkingLotManager

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;// 停车场管理类
class ParkingLotManager {// 已停车车辆列表private List<Car> parkedCars;// 总车位数private int totalSlots;// 剩余车位数private int availableSlots;// 用户评价列表public List<String> feedbackList;// 用于存储离场车辆private List<Car> departedCars;public ParkingLotManager(int totalSlots) {this.parkedCars = new ArrayList<>();this.totalSlots = totalSlots;this.availableSlots = totalSlots;this.feedbackList = new ArrayList<>();// 初始化离场车辆列表this.departedCars = new ArrayList<>();}// 车辆进场方法public void parkCar() {if (availableSlots <= 0) {System.out.println("停车场已满");return;}Scanner scanner = new Scanner(System.in);System.out.println("1.轿车 \t\t2.客车");System.out.println("请选择你的车辆类型");int carTypeChoice = scanner.nextInt();String carType = null;if (carTypeChoice == 1) {carType = "轿车";} else if (carTypeChoice == 2) {carType = "客车";}System.out.println("请输入车牌号");String carNum = scanner.next();//这行代码获取当前时间的时间戳,单位为毫秒。它用于记录车辆进入停车场的精确时间,后续可用于计算停车费用long inTime = System.currentTimeMillis();Car car;if ("轿车".equals(carType)) {car = new Sedan(carNum, carType, null, null, inTime, 0);} else {car = new Bus(carNum, carType, null, null, inTime, 0);}parkedCars.add(car);availableSlots--;System.out.println("以下为您的停车信息,请核实");System.out.println("***************************************");System.out.println("车辆类型\t车牌号\t入场时间");System.out.println(car.getCarType() + "\t\t" + car.getCarNum() + "\t\t" + new java.util.Date(car.getCarInTime()));System.out.println("***************************************");}// 车辆离场方法public void unparkCar() {Scanner scanner = new Scanner(System.in);System.out.println("请输入车牌号");String carNum = scanner.next();boolean found = false;for (Car car : parkedCars) {if (car.getCarNum().equals(carNum)) {found = true;System.out.println("请输入离场时间,请按正确的格式输入(yyyy-MM-dd/HH:mm:ss)");String outTimeStr = scanner.next();try {//这段代码的功能是将用户输入的离场时间字符串解析为时间戳,并设置到车辆对象中long outTime = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss").parse(outTimeStr).getTime();car.setCarOutTime(outTime);double fee = car.calculateParkingFee();System.out.println("正在为您打印小票,请稍后...");System.out.println("车牌号为" + car.getCarNum() + "的车辆停车时长为" + calculateDuration(car.getCarInTime(), car.getCarOutTime()));System.out.println("************乾坤停车场管理系统小票***********");System.out.println("车辆类型:" + car.getCarType());System.out.println("车牌号:" + car.getCarNum());System.out.println("车辆入场时间:" + new java.util.Date(car.getCarInTime()));System.out.println("车辆离场时间:" + new java.util.Date(car.getCarOutTime()));System.out.println("祝您一路顺风");System.out.println("*********************");System.out.println("您应缴费" + fee + "¥");parkedCars.remove(car);departedCars.add(car);availableSlots++;System.out.println("请留下您对此系统的评价或反馈");String feedList = scanner.next();feedbackList.add(feedList);} catch (Exception e) {System.out.println("输入的离场时间格式错误");}break;}}if (!found) {System.out.println("输入错误,停车场无此车");}}// 计算停车时长方法private String calculateDuration(long inTime, long outTime) {long diff = outTime - inTime;long diffSeconds = diff / 1000 % 60;long diffMinutes = diff / (1000 * 60) % 60;long diffHours = diff / (1000 * 60 * 60) % 24;long diffDays = diff / (1000 * 60 * 60 * 24);return diffDays + "天" + diffHours + "小时" + diffMinutes + "分钟" + diffSeconds + "秒";}// 查看剩余车位方法public void checkAvailableSlots() {System.out.println("此停车场剩余" + availableSlots + "个停车位");}// 获取在场车辆信息public void getPresentCarsInfo() {if (parkedCars.isEmpty()) {System.out.println("当前停车场内没有车辆。");return;}System.out.println("当前在场车辆信息:");System.out.println("车辆类型\t车牌号\t入场时间");for (Car car : parkedCars) {System.out.println(car.getCarType() + "\t" + car.getCarNum() + "\t" + new java.util.Date(car.getCarInTime()));}}// 获取离场车辆信息public void getDepartedCarsInfo() {if (departedCars.isEmpty()) {System.out.println("目前没有车辆离场。");return;}System.out.println("离场车辆信息:");System.out.println("车辆类型\t车牌号\t入场时间\t离场时间");for (Car car : departedCars) {System.out.println(car.getCarType() + "\t" + car.getCarNum() + "\t" + new java.util.Date(car.getCarInTime()) + "\t" + new java.util.Date(car.getCarOutTime()));}}// 统计营业额public double calculateTurnover() {double totalFee = 0;for (Car car : departedCars) {if (car.getCarOutTime() != 0) {totalFee += car.calculateParkingFee();}}return totalFee;}
}

测试类Text

import java.io.*;
import java.util.Random;
import java.util.Scanner;public class Text {// 管理员登录信息
//    private static final String ADMIN_USERNAME = "admin";
//    private static final String ADMIN_PASSWORD = "123456";public static void main(String[] args) {// 初始化停车场,假设总车位100个ParkingLotManager manager = new ParkingLotManager(100);try (Scanner scanner = new Scanner(System.in)) {while (true) {System.out.println("************欢迎进入乾坤停车场管理系统***********");System.out.println("请选择入口:");System.out.println("1. 用户停车入口\t\t2.系统管理员入口");int choice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区switch (choice) {case 1:userMenu(manager, scanner);break;case 2:adminMenu(manager, scanner);break;default:System.out.println("输入错误,请重新选择");}}}}// 用户停车入口的菜单private static void userMenu(ParkingLotManager manager, Scanner scanner) {while (true) {System.out.print("1. 记录车辆信息");System.out.print("\t2. 车辆离场结算");System.out.print("\t3. 车位数量");System.out.println("\t4. 退出用户菜单");System.out.println("请用户选择执行的操作");int choice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区switch (choice) {case 1:manager.parkCar();break;case 2:manager.unparkCar();break;case 3:manager.checkAvailableSlots();break;case 4:if (confirmExit(scanner)) {System.out.println("已退出用户菜单");return;}break;}}}// 确认是否退出的方法private static boolean confirmExit(Scanner scanner) {System.out.println("您确定要退出吗?  1.残忍拒绝 2.我再想想");int confirmChoice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区return confirmChoice == 1;}// 管理员菜单private static void adminMenu(ParkingLotManager manager, Scanner scanner) {while (true) {System.out.println("1. 获取生成验证码  2. 退出管理");int choice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区switch (choice) {case 1:generateAndVerifyCode(manager, scanner);break;case 2:System.out.println("已退出管理");return;default:System.out.println("输入错误,请重新选择");}}}// 生成验证码并进行密钥验证private static void generateAndVerifyCode(ParkingLotManager manager, Scanner scanner) {System.out.println("为了系统和个人隐私安全,请咨询系统总部要密钥");String verificationCode = generateVerificationCode();System.out.println("验证码已生成,正在发送到系统总部......");System.out.println("验证码已发送到系统总部");// 将验证码写入文件writeVerificationCodeToFile(verificationCode);int attempt = 3;while (attempt > 0) {System.out.println("请输入密钥");String input = scanner.nextLine().trim(); // 使用 nextLine 并去除首尾空格if (input.equals(verificationCode)) {System.out.println("密钥输入正确");// 这里可以添加后续管理员执行的操作,比如查看记录等innerAdminMenu(manager, scanner);return;} else {attempt--;if (attempt > 0) {System.out.println("请重新输入,还有" + attempt + "次机会");} else {System.out.println("机会已用完,返回管理菜单");return; // 尝试次数用完后立即返回}}}}// 生成验证码private static String generateVerificationCode() {Random random = new Random();StringBuilder code = new StringBuilder();for (int i = 0; i < 6; i++) {code.append(random.nextInt(10));}return code.toString();}// 新增方法:将验证码写入文件private static void writeVerificationCodeToFile(String verificationCode) {try (FileWriter writer = new FileWriter("C:\\Users\\H\\Desktop\\密码.txt")) {writer.write(verificationCode);System.out.println("验证码已保存到文件中");} catch (IOException e) {System.err.println("写入验证码到文件时发生错误: " + e.getMessage());}}// 验证码验证通过后的管理菜单private static void innerAdminMenu(ParkingLotManager manager, Scanner scanner) {while (true) {System.out.println("1. 查看在场车辆    2. 查看离场车辆相关信息   3. 统计营业额   4. 查看用户反馈   5. 退出管理员操作菜单   6.退出系统");int choice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区switch (choice) {case 1:manager.getPresentCarsInfo();break;case 2:manager.getDepartedCarsInfo();break;case 3:double turnover = manager.calculateTurnover();System.out.println("当前停车场的营业额为:" + turnover + "¥");break;case 4:if (manager.feedbackList.isEmpty()) {System.out.println("目前没有用户反馈信息。");} else {System.out.println("用户反馈信息如下:");for (String feedback : manager.feedbackList) {System.out.println(feedback);}}break;case 5:System.out.println("已退出管理员操作菜单");return;case 6:if (confirmExit2(scanner)){System.out.println("乾坤管理系统已退出,谢谢使用");System.exit(0);}}}}private static boolean confirmExit2(Scanner scanner) {System.out.println("你好,你确定要退出系统吗?  1.确认 2.取消");int confirmChoice = scanner.nextInt();scanner.nextLine(); // 清除缓冲区return confirmChoice == 1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 应用层协议&#xff0c;用于客户端与服务器之间的数据传输&#xff08;默认端口 80&#xff09;。 HTTP/1.0&#xff1a;早期版本&#xff0c;每个请求需单独建立 TCP 连接&#xff0c;效率低。HTTP/1.1&…

DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…

LabVIEW同步数据采集功能

VI通过使用数据采集&#xff08;DAQ&#xff09;硬件系统&#xff0c;进行多通道同步采集&#xff0c;实时获取模拟信号数据。它利用外部时钟信号触发数据采集&#xff0c;支持连续采样模式&#xff0c;并将采集到的数据实时显示在波形图上&#xff0c;方便用户进行数据监控和分…

SpringDataJPA使用deleteAllInBatch方法逻辑删除失效

概述 在使用Spring Boot JPA时&#xff0c;执行批量删除操作时&#xff0c;遇到逻辑删除失效的问题。具体而言&#xff0c;当使用deleteAllInBatch方法时&#xff0c;数据会被物理删除&#xff0c;而不是进行逻辑删除&#xff1b;但是当使用deleteAll时&#xff0c;逻辑删除操…

【Docker】使用Docker搭建-MySQL数据库服务

零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点&#xff08;DockerHub&#xff09;&#xff0c;而且国内大部分Docker镜像站已全部下线&#xff0c;导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象&#xff0c;这时候就需要进行更换Docker镜像源。 可…

人类驾驶的人脑两种判断模式(反射和预判)-->自动驾驶两种AI模式

一种模式是直觉模式&#xff0c;判断基于条件反射&#xff0c;视觉感知 触发到 直接条件反射&#xff08;从经历中沉淀形成的神经信息闭环&#xff09;&#xff0c;类似现在自动驾驶技术的传统AI模式&#xff1b;另一种是图式推理模式&#xff0c;判断是基于预判&#xff0c;人…

3.17 AI Agent 场景革命:解锁企业级应用的 15 个黄金赛道

AI Agent 场景革命:解锁企业级应用的 15 个黄金赛道 关键词:AI Agent 应用场景, 企业级智能体案例, 多模态 Agent 实现, 工具链自动化, 智能决策系统 1. 企业级 Agent 场景分类图谱 #mermaid-svg-UjUmmToEKigfdlFf {font-family:"trebuchet ms",verdana,arial,san…

Docker基础-常见命令

docker images -查看所有的本地镜像。 docker pull -把远端镜像拉取到本地。 docker rmi -删除镜像。 docker push -推到镜像仓库。 docker run -创建并运行容器&#xff08;自动化&#xff0c;如果发现镜像不存在会先去拉取&#xff0c; 拉取完了以后再去自动创建容器&am…

TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整

2025年春节假期已过&#xff0c;大家都带着慢慢的活力回到了工作岗位。为了让大家在新的一年继续感受到 Tiny Engine 的成长与变化&#xff0c;我们很高兴地宣布&#xff1a;TinyEngine v2.2版本正式发布&#xff01;本次更新带来了重要的功能增强------页面支持嵌套路由&#…

LSTM长短期记忆网络-原理分析

1 简介 概念 LSTM&#xff08;Long Short-Term Memory&#xff09;也称为长短期记忆网络&#xff0c;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用于解决传统RNN的梯度消失问题和长程依赖问题。LSTM通过引入门机制和细胞状态&#xff0c;能够更…

SQL Server 中遇到的常见问题集

SQL Server 中遇到的常见问题集 问题一&#xff1a; 无法创建关系“FK_Research_Teacher”。 ALTER TABLE 语句与 FOREIGN KEY 约束"FK_Research_Teacher"冲突 解决方法&#xff1a; 外键表中的数据主键表中是有的&#xff0c;并且不能删除主外键表中数据 1&…

神经网络中感受野的概念和作用

在神经网络中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是指某个神经单元&#xff08;神经元或者卷积核&#xff09;关注的输入特征区域的大小。它决定了神经网络对输入数据的特定区域的感知能力。 感受野的形成过程 在卷积神经网络中&#xff0c;卷积层是感受…

unreal engine gameplay abiliity 获取ability的cooldown剩余时间

unreal engine gameplay abiliity 获取ability的cooldown 版本 5.4.4 参考 测试代码 if (HasAuthority() && AbilitySystemComponent){TArray<FGameplayAbilitySpecHandle> OutAbilityHandles;AbilitySystemComponent->GetAllAbilities(OutAbilityHandles…

【leetcode hot 100 42】接雨水

错误解法&#xff1a;若height[left]>height[right]则代表有坑 class Solution {public int trap(int[] height) {int left 0;int area 0;while(left<height.length-1){// 找坑int right left1;while(right<height.length-1 && height[left]>height[ri…

Spark map与mapPartitions算子源码级深度解析

Spark map与mapPartitions算子源码级深度解析 一、核心源码结构差异 1. map算子实现逻辑 def map[U: ClassTag](f: T => U): RDD[U] = withScope {val cleanF = sc.clean(f)new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF)) }实现特征: …

【前端进阶】09 编程思维:从事件驱动到数据驱动

事件驱动与数据驱动 GUI与事件事件驱动数据驱动事件驱动和数据驱动的区别 GUI与事件 JavaScript作为浏览器的脚本语言&#xff0c;主要用途是与用户互动、操作DOM&#xff0c;实现页面UI和DOM操作&#xff0c;属于GUI&#xff08;图形用户界面&#xff09;编程 GUI程序注重用…

WPF-3天快速WPF入门并达到企业级水准

嘿&#xff0c;小伙伴们&#xff01;如果你已经有一定的C#开发基础&#xff0c;但想快速掌握WPF开发&#xff0c;达到企业级水准&#xff0c;那接下来的这个三天快速入门计划绝对适合你&#xff01;虽然听起来有点挑战&#xff0c;但别担心&#xff0c;只要跟着这个高强度、结构…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.1单节点安装(Docker与手动部署)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 10分钟快速部署Elasticsearch单节点环境1. 系统环境要求1.1 硬件配置推荐1.2 软件依赖 2. Docker部署方案2.1 部署流程2.2 参数说明2.3 性能优化建议 3. 手动部署方案3.1 安…

小程序中的插槽(Slot)机制及其与 Vue 组件的异同

小程序中的插槽&#xff08;Slot&#xff09;机制及其与 Vue 组件的异同 引言 在小程序开发中&#xff0c;组件化开发是一种重要的设计模式&#xff0c;而插槽&#xff08;Slot&#xff09;机制则是实现组件内容分发的关键。通过插槽&#xff0c;开发者可以更灵活地构建可复用…

vscode下载安装教程(附安装包)vscode图文安装教程最新版

文章目录 一、vscode下载二、vscod安装教程1.启动vscode安装程序&#xff1a;2.应对提示&#xff1a;3.接受协议&#xff1a;4.更改vscode安装路径&#xff1a;5.推进安装vscode&#xff1a;6.创建vscode快捷方式&#xff1a;7.开始安装vscode&#xff1a;8.完成vscode安装&…