Python实现停车场管理系统

Python实现简易停车场管理系统

  • 一、需求
  • 二、代码
    • 2.1 初始化模块__init__.py
    • 2.2 主程序模块main.py
    • 2.3 停车管理模块ParkingManagementSystem.py
    • 2.4 车元素模块Car.py
  • 三、运行测试
    • 3.1 浏览所有信息
    • 3.2 查询车辆信息
      • 3.2.1 按车牌号查找
      • 3.2.2 按车类型查找
      • 3.2.3 按使用日期查找
      • 3.2.4 按经手人查找
      • 3.2.5 查询历史记录
    • 3.3 入场车辆录入
    • 3.4 出场车辆删除
    • 3.5 退出管理系统

一、需求

  1. 为一个车位数量固定的停车场,设计一个管理系统;
  2. 停车信息包括:编号、车牌号(若存在)、类型、车位编号、使用日期、入场时间、单价、费用、经手人
  3. 停车信息存储在数据文件中,程序至少实现功能:浏览、查询、入场、出场、导出、计费、系统菜单
  4. 按面向对象程序设计方法进行类的定义:选择合适的数据存储结构,并定义相应的数据元素类,选择合理的操作方法定义相应的算法实现类

二、代码

本系统包含4部分(4个py文件,剩余为测试数据文件),组成放在一个文件夹组成一个模块,如下图。
Python实现停车场管理系统_第1张图片

2.1 初始化模块__init__.py

"""
__init__.py 模块的作用:在导入包的时候自动执行这里的代码,进行初始化工作
"""
# 允许被 from package_name import * 导入的模块
__all__ = ['ParkingManagementSystem', 'Car']

2.2 主程序模块main.py

# coding = utf-8

from ParkingManagementSystem import *
from Car import *


def main():
    # 创建停车信息管理系统对象
    p = ParkingManagementSystem()
    # 创建一个停车对象
    car = Car()
    while True:
        print("")
        print("******************* 欢迎进入:停车场信息管理系统 *******************")
        print("------------------------- 1.浏览所有信息 ------------------------")
        print("------------------------- 2.查询车辆信息 ------------------------")
        print("------------------------- 3.入场车辆录入 ------------------------")
        print("------------------------- 4.出场车辆删除 ------------------------")
        print("------------------------- 5.退出管理系统 ------------------------")
        try:
            # 接收输入指令
            cmd = int(input("请输入指令数字:"))
            # 1.浏览所有信息
            if cmd == 1:
                p.show_all_information()
            # 2.查询车辆信息
            elif cmd == 2:
                while True:
                    print("------ 1.按车牌号查找 ------")
                    print("------ 2.按车类型查找 ------")
                    print("------ 3.按使用日期查找 -----")
                    print("------ 4.按经手人查找 ------")
                    print("------ 5.查询历史记录 ------")
                    print("------ 6.返回上级菜单 ------")
                    query = int(input("请输入指令数字:"))
                    # 1.按车牌号查找
                    if query == 1:
                        query_results = p.query_by_car_number()
                        # 判定查询结果是否为空(False),是则不保存
                        if query_results:
                            decide = input("是否需要保存查询结果(输入:yes/no):")
                            if decide == "yes":
                                p.save_query_results_to_file(query_results)
                    # 2.按车类型查找
                    elif query == 2:
                        query_results = p.query_by_car_type()
                        # 判定查询结果是否为空(False),是则不保存
                        if query_results:
                            decide = input("是否需要保存查询结果(输入:yes/no):")
                            if decide == "yes":

                                p.save_query_results_to_file(query_results)
                    # 3.按使用日期查找
                    elif query == 3:
                        query_results = p.query_by_date()
                        # 判定查询结果是否为空(False),是则不保存
                        if query_results:
                            decide = input("是否需要保存查询结果(输入:yes/no):")
                            if decide == "yes":
                                p.save_query_results_to_file(query_results)
                    # 4.按经手人查找
                    elif query == 4:
                        query_results = p.query_by_handler()
                        # 判定查询结果是否为空(False),是则不保存
                        if query_results:
                            decide = input("是否需要保存查询结果(输入:yes/no):")
                            if decide == "yes":
                                p.save_query_results_to_file(query_results)
                    # 5.查询历史记录
                    elif query == 5:
                        p.query_history_results()
                    else:
                        break
            # 3.录入车辆信息
            elif cmd == 3:
                # 接收停车车辆信息
                parking_info = car.get_parking_info()
                p.parking(parking_info)
            # 4.删除车辆信息
            elif cmd == 4:
                p.driving_out()
            # 5.退出管理系统
            else:
                # 保存停车信息的最大编号 id
                car.save_id_to_file()
                print("感谢使用停车场管理系统,再见!")
                break
        except Exception as result:
            # 保存停车信息的最大编号 id
            car.save_id_to_file()
            # 保存停车信息
            p.save_to_file()
            print("感谢使用停车场管理系统,再见!")
            break


if __name__ == "__main__":
    main()

2.3 停车管理模块ParkingManagementSystem.py

# coding = utf-8
# 模块中的__all__属性:可以规定 模块中 from module_name import * 只能够导入的一些类、变量、函数名
__all__ = ['ParkingManagementSystem']
import time


class ParkingManagementSystem(object):
    """算法实现类:停车场信息管理系统"""

    def __init__(self):
        """对停车信息进行初始化"""
        # 测试时使用
        print("ParkingManagementSystem的__init__函数被调用")

        # 车位编号存放列表
        self.car_stall = []
        self.truck_stall = []
        # 所有停车信息存放列表
        self.total_info = []

        # 读取停车场数据
        try:
            with open("parking_data.txt", "r") as file:
                for line in file.readlines():
                    # 将字符串转化为字典,遇到空行时跳过,防止eval()函数转化空行或者空字符时报错
                    try:
                        info_dict = eval(line)
                        self.total_info.append(info_dict)
                        if info_dict["car_type"] == "car":
                            self.car_stall.append(info_dict["p_number"])
                        else:
                            self.truck_stall.append(info_dict["p_number"])
                    except Exception as result:
                        continue
        except Exception as result:
            print("停车信息数据文件不存在!")
        # 测试时使用
        # print(self.car_stall)
        # print(self.truck_stall)
        # print(self.total_info)

    def parking(self, parking_info):
        """入场停车:传入停车信息,在空的车位中增加车辆信息,更新数据文件"""
        # 判断传入停车信息是否为 None
        if parking_info is None:
            return
        else:
            # 传入停车信息,将新的停车信息存入到列表
            self.total_info.append(parking_info)
            # 测试时使用
            print(self.total_info)
            # 将数据更新到文件中
            self.save_to_file()

    def show_all_information(self):
        """输出所有停车场信息,按车位使用情况分类,同一分类中按编号升序排序"""
        # 初始化刷新数据
        self.__init__()
        # 对car类型的车辆所在车位编号进行排序
        self.car_stall.sort()
        # print(self.car_stall)
        # 按car类型显示停车信息
        print("")
        # 查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历car类型车位编号,按该编号顺序显示停车信息
        for i in self.car_stall:
            for info_dict in self.total_info:
                if info_dict['p_number'] == i:
                    print("  %s       %s        %s     %s       %s     %s" %
                          (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"],
                           info_dict["handler"], info_dict["price"], info_dict["entrance_time"]))
        print("")
        # # 对truck类型的车辆所在车位编号进行排序
        self.truck_stall.sort()
        # print(self.truck_stall)
        # 按truck类型显示停车信息,查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历truck类型车位编号,按该编号顺序显示停车信息
        for i in self.truck_stall:
            for info_dict in self.total_info:
                if info_dict['p_number'] == i:
                    # print(info_dict)
                    print("  %s     %s      %s     %s       %s     %s" %
                          (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"],
                           info_dict["handler"], info_dict["price"], info_dict["entrance_time"]))

    def query_by_car_number(self):
        """按车牌号查找停车信息"""
        # 接收车牌编号
        car_number = input("请输入车牌号(示例:京A88888):")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["car_number"] == car_number:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息!")
            return False

    def query_by_car_type(self):
        """按车类型查找停车信息"""
        # 接受车类型
        car_type = input("请输入车类型(car 或 truck):")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["car_type"] == car_type:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息!")
            return False

    def query_by_date(self):
        """按使用日期查找停车信息"""
        # 接收查询日期
        date = input("请输入查询日期(格式参考:1998-06-06):")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["date"] == date:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息!")
            return False

    def query_by_handler(self):
        """按经手人查找停车信息"""
        # 接收经手人姓名
        handler = input("请输入经手人姓名:")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print("car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["handler"] == handler:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息!")
            return False

    def query_history_results(self):
        """查询停车场历史记录"""
        # 查询输入格式化
        print("id  car_type  p_number  car_number   handler   price    cost     entrance_time            exit_time")
        try:
            # 读取历史记录数据,如有则显示
            with open("history_data.txt", "r") as file:
                for line in file.readlines():
                    # 将字符串转化为字典,遇到空行时跳过,防止eval()函数转化空行或者空字符时报错
                    try:
                        info_dict = eval(line)
                        if info_dict["car_type"] == "car":
                            # 格式化输出
                            print("%s   %s        %s        %s     %s       %s      %s    %s       %s" %
                                  (info_dict["id"], info_dict["car_type"], info_dict["p_number"], info_dict["car_number"],
                                   info_dict["handler"], info_dict["price"], info_dict["cost"],
                                   info_dict["entrance_time"], info_dict["exit_time"]))
                        else:
                            # 格式化输出
                            print("%s  %s      %s       %s     %s       %s      %s    %s       %s" %
                                  (info_dict["id"], info_dict["car_type"], info_dict["p_number"],
                                   info_dict["car_number"],
                                   info_dict["handler"], info_dict["price"], info_dict["cost"],
                                   info_dict["entrance_time"], info_dict["exit_time"]))
                    except Exception as result:
                        continue
        except Exception as result:
            print("暂未发现历史记录!")

    def driving_out(self):
        """出场:删除对应车位的车辆信息,更新数据文件"""
        # 接收出场时间
        exit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 接收车牌号
        car_number = input("请输入出场车辆车牌号(示例:京A88888):")
        # 遍历总停车信息列表,找到该条数据并将其移除列表
        for info_dict in self.total_info:
            if info_dict["car_number"] == car_number:
                # 将出场时间更新到该条数据中
                info_dict["exit_time"] = exit_time
                # 对出场车辆计费
                cost = self.charging(info_dict)
                # 将消费金额更新到该条数据中
                info_dict["cost"] = cost
                # 将该车位编号从列表中移除
                if info_dict["car_type"] == "car":
                    self.car_stall.remove(info_dict["p_number"])
                elif info_dict["car_type"] == "truck":
                    self.truck_stall.remove(info_dict["p_number"])
                # 将该条停车信息从总的停车信息列表中删除
                self.total_info.remove(info_dict)
                # 将数据更新到文件中
                self.save_to_file()
                # 将已出场的停车数据保存到文件
                self.save_history_to_file(info_dict)
                print("车辆出场成功!")
                break
        else:
            print("未找到符合要求的车辆,请确认后输入!")

    def charging(self, info_dict):
        """计费: 传入停车信息,按小时计费"""
        # 接收车辆停车信息
        # 将时间由字符串格式转化为数字格式,以秒为单位
        exit_time = time.mktime(time.strptime(info_dict["exit_time"], "%Y-%m-%d %H:%M:%S"))
        entrance_time = time.mktime(time.strptime(info_dict["entrance_time"], "%Y-%m-%d %H:%M:%S"))
        # 计算停车时间,单位转化为小时
        parking_time = (exit_time - entrance_time)/3600
        # 计算消费金额
        cost = round(info_dict["price"] * parking_time, 0)
        print("停车时间为:%.2f 小时, 停车费为:%d 元" % (parking_time, cost))
        # 返回停车消费金额
        return cost

    def save_to_file(self):
        """将停车数据保存到文件"""
        # 打开数据文件,保存数据
        with open("parking_data.txt", "w") as file:
            for info_dict in self.total_info:
                # 将字典转化为字符串保存
                file.write(str(info_dict))
                file.write("\n")

    def save_history_to_file(self, info_dict):
        """将已完成出场停车数据保存到文件"""
        # 打开数据文件,保存数据
        with open("history_data.txt", "a") as file:
            # 将字典转化为字符串保存
            file.write(str(info_dict))
            file.write("\n")

    def save_query_results_to_file(self, query_results):
        """将查询结果保存到指定数据文件"""
        # 接收输入文件名
        file_name = input("请输入要保存数据的文件名(格式:xxx.txt ):")
        with open(file_name, "a") as file:
            # 将数据转化为字符串保存
            file.write(str(query_results))
            file.write("\n")
        print("查询结果保存成功,文件名为:%s" % file_name)

    def print_func(self, info_dict, query_results):
        """格式化打印输出查询结果"""
        if info_dict["car_type"] == "car":
            # print(info_dict)
            print("  %s       %s        %s     %s       %s     %s" %
                  (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"],
                   info_dict["handler"], info_dict["price"], info_dict["entrance_time"]))
            query_results.append(info_dict)
        elif info_dict["car_type"] == "truck":
            print("  %s     %s      %s     %s       %s     %s" %
                  (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"],
                   info_dict["handler"], info_dict["price"], info_dict["entrance_time"]))
            query_results.append(info_dict)

2.4 车元素模块Car.py

# coding = utf-8
# 模块中的__all__属性:可以规定 模块中 from module_name import * 只能够导入的一些类、变量、函数名
__all__ = ['Car']
import time
from ParkingManagementSystem import *


class Car(ParkingManagementSystem):
    """数据元素类:定义一个关于车的类"""

    def __init__(self):
        """对车的属性进行初始化"""
        # 测试时使用
        print("Car 中__init__调用成功!")
        # 设定初始出场时间和消费金额为空
        self.exit_time = None
        self.cost = None
        # 初始编号 id 为 1
        self.id = 1
        # 读取文件中编号
        try:
            with open("count_id.txt", "r") as file:
                self.id = int(file.read())
        except Exception as result:
            pass
        # 测试时使用
        print(self.id)

    def get_parking_info(self):
        """获取车辆停车信息"""
        # 调用父类中的属性
        ParkingManagementSystem.__init__(self)
        car_type = input("请输入车类型(car 或 truck):")
        # 判断车位是否已满,如已满则提示客户去其他停车场,如未满则分配一个车位给客户
        if car_type == "car":
            # 如车位已满,提醒客户去其他停车场,car类型的车位设定为100个
            if len(self.car_stall) >= 100:
                print("小汽车车位已满,请去其他停车场。")
                return
            # 如还有车位,则分配一个车位给客户
            else:
                # 不同车型不同价位
                price = 10
                # 车位编号为:1-100
                for i in range(100):
                    # 分配空着的车位编号
                    if i + 1 not in self.car_stall:
                        p_number = i + 1
                        self.car_stall.append(p_number)
                        print(self.car_stall)
                        break
        elif car_type == "truck":
            # 如车位已满,提醒客户去其他停车场,truck类型的车位设定为50个
            if len(self.truck_stall) >= 50:
                print("货车车位已满,请去其他停车场。")
                return
            # 如还有车位,则分配一个车位给客户
            else:
                # 不同车型不同价位
                price = 20
                # 车位编号为:101-150
                for i in range(100, 150):
                    # 分配空着的车位编号
                    if i + 1 not in self.truck_stall:
                        p_number = i + 1
                        self.truck_stall.append(p_number)
                        print(self.truck_stall)
                        break
        else:
            print("本停车场没有适合该车型的停车位,请重新输入!")
            return
        # 接收车位编号
        car_number = input("请输入车牌号(示例:京A88888):")
        # 接收经手人姓名
        handler = input("请输入经手人姓名:")
        # 接收入场时间
        entrance_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 接收使用日期
        date = time.strftime("%Y-%m-%d", time.localtime())
        # 编号 id 自动增长
        self.id += 1
        # 保存该条停车信息到字典
        parking_info = {
     
            "id": self.id,
            "car_type": car_type,
            "car_number": car_number,
            "handler": handler,
            "p_number": p_number,
            "date": date,
            "entrance_time": entrance_time,
            "exit_time": self.exit_time,
            "price": price,
            "cost": self.cost
        }
        print(parking_info)
        # 返回车辆停车信息
        return parking_info

    def save_id_to_file(self):
        """保存停车信息的最大编号 id ,作为下次运行id增长的基础"""
        with open("count_id.txt", "w") as file:
            file.write(str(self.id))

三、运行测试

3.1 浏览所有信息

Python实现停车场管理系统_第2张图片

3.2 查询车辆信息

3.2.1 按车牌号查找

Python实现停车场管理系统_第3张图片

3.2.2 按车类型查找

Python实现停车场管理系统_第4张图片

3.2.3 按使用日期查找

Python实现停车场管理系统_第5张图片

3.2.4 按经手人查找

Python实现停车场管理系统_第6张图片

3.2.5 查询历史记录

Python实现停车场管理系统_第7张图片

3.3 入场车辆录入

Python实现停车场管理系统_第8张图片

3.4 出场车辆删除

Python实现停车场管理系统_第9张图片

3.5 退出管理系统

Python实现停车场管理系统_第10张图片

你可能感兴趣的:(python,python)