基于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.pswp.cn/diannao/70944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70944.shtml
英文地址,請注明出處:http://en.pswp.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安裝&…