基于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.rhkb.cn/news/25079.html

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

相关文章

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网&#xff0c;找到安装指令 5. 验证pytorch是否安装成功 四、…

内存管理+模板基础知识

在前面的博客中&#xff0c;我们已经基本学习完了类和对象有关知识&#xff0c;在这篇博客中&#xff0c;我们将要学习C/C内存管理与模板的一些基础知识。 目录 一、C/C内存管理 1.1 C/C内存分布 1.2 C内存管理方式 1.2.1 new/delete操作内置类型 1.2.2 new和delete操作自…

新建菜单项的创建之CmpGetValueListFromCache函数分析

第一部分&#xff1a; PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…

《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决?

--- 使用DLL修复工具&#xff08;懒人专用&#xff09; https://file-xfqdx-cdn.fanqiesoft.cn/package/XFQDXTool_21121_tg.exe 逐步说明&#xff1a; 步骤1&#xff1a;重新安装《无畏契约》 - 操作指南&#xff1a; - 打开“控制面板” → “程序和功能”。 - 在列表…

蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗

ANS-BT101M是安朔科技推出的蓝牙接近开关模块&#xff0c;低功耗ble5.1&#xff0c;采用UART通信接口&#xff0c;实现手机自动无感连接&#xff0c;无需APP&#xff0c;人靠近车门自动开锁&#xff0c;支持苹果、安卓、鸿蒙系统&#xff0c;也可以通过手机手动开锁或上锁&…

Ubuntu 22.04 安装Nvidia驱动加速deepseek

一键安装22.04 nvidia 驱动 nvidia 官网下载驱动我的环境是NVIDIA RTX A5000nvidia 文档参考没有安装驱动之前确认自己的型号 lspci | grep -i vga &#xff08;如数字2231&#xff09; 参考docker 支持nvidia &#xff0c;注释了需要的取消注释即可 42行-92行一定要重启服务器…

数据结构——双链表

1. 双向带头循环链表 1. 双链表的功能 1. 初始化 2. 销毁 3. 打印 4. 检查链表是否为空 5. 尾插 6. 尾删 7. 头插 8. 头删 9. 在目标节点之后插入数据 10. 删除目标节点 11. 查找 2. 双链表的定义 结构体需要包含三个成员&#xff0c;一个成员存储数据&#xff0c;一个成员存储…

微服务2025/2/15

微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 微服务是一种架构。 微服务是一种架构。 微服务是一种架构。 以前自己做项目最常用的架构是单体架构。单体项目不适合开发大型项目。 学习微服务技术来解…

Locust性能压测工具使用指南

Locust是一款用Python编写的开源性能测试工具&#xff0c;主要用于对网站或其他系统进行负载测试和性能测试&#xff0c;以下是关于它的详细介绍&#xff1a; 特点 高可扩展性&#xff1a;能够轻松模拟大量用户并发访问&#xff0c;通过简单增加节点&#xff0c;可以在短时间…

DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能

2025 年 2 月 21 日至 23 日&#xff0c;上海徐汇西岸&#xff0c;2025 全球开发者先锋大会以 “模塑全球&#xff0c;无限可能” 的主题&#xff0c;围绕云计算、机器人、元宇宙等多元领域&#xff0c;探讨前沿技术创新、应用场景拓展和产业生态赋能&#xff0c;各类专业论坛、…

Linux 环境“从零”部署 MongoDB 6.0:mongosh 安装与数据操作全攻略

前提 完成linux平台部署MongoDB【部署教程】且完成mongosh的安装 由于本人使用的是6.0版本的MongoDB&#xff0c;新版本 MongoDB&#xff08;尤其是 6.0 及以上版本&#xff09;已经不再默认捆绑传统的 mongo shell&#xff0c;而改用新的 MongoDB Shell&#xff08;mongosh&am…

SQL注入之二次注入

1、概述 二次注入是指已存储&#xff08;数据库、文件&#xff09;的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。 二次注入是sql注入的一种&#xff0c;但是比普通sql注入利用更加困难&#xff0c;利用门槛更高。普通注入数据直接进入到 SQL 查询中&#xff0c;而…

AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障

在卫星导航领域&#xff0c;北斗系统作为我国自主研发的全球卫星导航系统&#xff0c;正以其独特的短报文通信功能引发全球范围内的广泛关注。这一突破性技术不仅使北斗系统在全球四大导航系统中独树一帜&#xff0c;具备了双向通信能力&#xff0c;更通过遨游通讯推出的AORO M…

xss-lab

xss XSS全称跨站脚本(Cross Site Scripting)&#xff0c;为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面中执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能&#x…

服务器为什么会禁止 Ping?服务器禁止 Ping 的好处

在网络管理和服务器运维中&#xff0c;经常会遇到服务器禁止 Ping 的情况。为了确保网络安全和减少不必要的风险&#xff0c;管理员可能会选择禁止 Ping 命令&#xff0c;即禁止服务器响应 ICMP 请求。尽管 Ping 命令是网络诊断中常用的工具&#xff0c;但禁止 Ping 也有其合理…

课程2. 用PyTorch训练神经网络与梯度下降

课程2. 用PyTorch训练神经网络与梯度下降 Pytorchtorch.TensorPytorch 上的神经网络用于余弦函数逼近的全连接神经网络 训练神经网络 梯度下降最小化一个变量的函数最小化多个变量的函数使用梯度下降训练神经网络在 Pytorch 中训练神经网络从 nn.Module 类继承 将计算传输到显卡…

IP-----动态路由OSPF(2)

这只是IP的其中一块内容&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为动态路由OSPF &#xff0c;可通过以下路径查看IP-----动态路由OSPF-CSDN博客,欢迎指正 注意&#xff01;&#xff01;&#xff01;本部分内容较多所以分成了两部分在上一章 5.动态路…

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中&#xff0c;使用蓝牙电话拦截手机通话的声音&#xff0c;并对数据加工&#xff0c;这个功能出来也有一段时间了。前段时间有试用的用户咨询说&#xff1a;有没有办法在手机上&#xff…

深入剖析:自定义实现C语言中的atoi函数

在C语言的标准库中&#xff0c; atoi 函数是一个非常实用的工具&#xff0c;它能够将字符串形式的数字转换为对应的整数。然而&#xff0c;当我们深入探究其实现原理时&#xff0c;会发现其中蕴含着许多有趣的编程技巧和细节。本文将详细讲解如何自定义实现一个类似 atoi 功能的…

PyTorch 源码学习:GPU 内存管理之它山之石——TensorFlow BFC 算法

TensorFlow 和 PyTorch 都是常用的深度学习框架&#xff0c;各自有一套独特但又相似的 GPU 内存管理机制&#xff08;BFC 算法&#xff09;。它山之石可以攻玉。了解 TensorFlow 的 BFC 算法有助于学习 PyTorch 管理 GPU 内存的精妙之处。本文重点关注 TensorFlow BFC 算法的核…