You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
8.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import tkinter as tk
from tkinter import messagebox, simpledialog
from datetime import datetime
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="root",
password="root",
database="sys"
)
class ParkingLotManager:
def __init__(self):
self.conn = mysql.connector.connect(
host="localhost",
user="root",
password="root",
database="sys"
)
self.cursor = self.conn.cursor()
# 初始化时从数据库加载定价规则
self.load_pricing_rules_from_db()
self.parked_vehicles = {} # 本地缓存,用于快速查询
def load_parked_vehicles_from_db(self):
"""从数据库加载已停车辆"""
self.cursor.execute("SELECT license_plate, vehicle_type, entry_time FROM parked_vehicles")
parked_data = self.cursor.fetchall()
for plate, vehicle_type, entry_time in parked_data:
self.parked_vehicles[plate] = {
'vehicle': Vehicle(plate, vehicle_type),
'entry_time': datetime.strptime(entry_time, "%Y-%m-%d %H:%M:%S")
}
# 添加一个新方法用于初始化App时加载数据
def initialize_data_on_login(self):
self.load_parked_vehicles_from_db()
# 在ParkingSystemApp的__init__方法中调用加载数据的方法
def open_main_system(parking_manager):
main_system_window = tk.Toplevel(login_window)
main_system_window.title("停车场管理系统 - 主功能")
# 在创建ParkingSystemApp实例前先初始化数据
parking_manager.initialize_data_on_login()
app = ParkingSystemApp(main_system_window, parking_manager)
main_system_window.protocol("WM_DELETE_WINDOW", lambda: [main_system_window.destroy(), login_window.destroy()])
def __init__(self, master, parking_manager):
# ...其他初始化代码...
parking_manager.load_parked_vehicles_from_db()
self.update_ui_vehicles()
def park_vehicle(self, vehicle):
# 除了现有逻辑,还需要在数据库中记录入场时间
sql = "INSERT INTO parked_vehicles (license_plate, vehicle_type, entry_time) VALUES (%s, %s, %s)"
val = (vehicle.get_license_plate(), vehicle.get_vehicle_type(), datetime.now())
self.cursor.execute(sql, val)
self.conn.commit()
self.parked_vehicles[vehicle.get_license_plate()] = {'vehicle': vehicle, 'entry_time': datetime.now()}
def unpark_vehicle(self, license_plate):
# 除了现有逻辑,更新数据库中的出场时间和费用
vehicle_info = self.parked_vehicles.get(license_plate)
if vehicle_info:
exit_time = datetime.now()
hours_parked = (exit_time - vehicle_info['entry_time']).total_seconds() / 3600
vehicle_type = vehicle_info['vehicle'].get_vehicle_type()
fee = self.pricing_rules[vehicle_type].calculate_fee(hours_parked)
sql_update = "UPDATE parked_vehicles SET exit_time=%s, total_fee=%s WHERE license_plate=%s"
val = (exit_time, fee, license_plate)
self.cursor.execute(sql_update, val)
self.conn.commit()
del self.parked_vehicles[license_plate]
return fee
else:
raise ValueError("Vehicle not found in the system.")
class PricingRule:
def __init__(self, vehicle_type, hourly_rate, max_daily_rate=None):
self.vehicle_type = vehicle_type
self.hourly_rate = hourly_rate
self.max_daily_rate = max_daily_rate or float('inf')
def calculate_fee(self, hours_parked):
fee = hours_parked * self.hourly_rate
if self.max_daily_rate and fee > self.max_daily_rate:
return self.max_daily_rate
return fee
class Vehicle:
def __init__(self, license_plate, vehicle_type):
self.license_plate = license_plate
self.vehicle_type = vehicle_type
def get_license_plate(self):
return self.license_plate
def get_vehicle_type(self):
return self.vehicle_type
class ParkingLotManager:
def __init__(self):
self.pricing_rules = {}
self.parked_vehicles = {}
def add_pricing_rule(self, vehicle_type, hourly_rate, max_daily_rate=None):
self.pricing_rules[vehicle_type] = PricingRule(vehicle_type, hourly_rate, max_daily_rate)
def park_vehicle(self, vehicle):
self.parked_vehicles[vehicle.get_license_plate()] = {'vehicle': vehicle, 'entry_time': datetime.now()}
def unpark_vehicle(self, license_plate):
entry_time = self.parked_vehicles[license_plate]['entry_time']
parked_hours = (datetime.now() - entry_time).total_seconds() / 3600
vehicle_type = self.parked_vehicles[license_plate]['vehicle'].get_vehicle_type()
if vehicle_type in self.pricing_rules:
fee = self.pricing_rules[vehicle_type].calculate_fee(parked_hours)
del self.parked_vehicles[license_plate]
return fee
else:
raise ValueError("No pricing rule for this vehicle type.")
class ParkingSystemApp:
def __init__(self, master, parking_manager):
self.master = master
self.parking_manager = parking_manager
master.title("停车场管理系统")
self.vehicle_listbox = tk.Listbox(master, width=50)
self.vehicle_listbox.pack(pady=10)
self.search_entry = tk.Entry(master)
self.search_entry.pack(pady=5)
tk.Button(master, text="查询车辆", command=self.search_vehicle).pack(side=tk.LEFT, padx=5)
tk.Button(master, text="录入入场", command=self.add_vehicle).pack(side=tk.LEFT, padx=5)
tk.Button(master, text="删除出场", command=self.remove_vehicle).pack(side=tk.LEFT, padx=5)
tk.Button(master, text="退出系统", command=self.quit_app).pack(side=tk.RIGHT, padx=5)
# 示例数据,实际应用中应从数据库读取
self.vehicles = ["ABC123", "XYZ789", "CDE456"]
self.update_ui_vehicles()
def update_ui_vehicles(self):
self.vehicle_listbox.delete(0, tk.END)
for plate in self.parking_manager.parked_vehicles.keys():
self.vehicle_listbox.insert(tk.END, plate)
def search_vehicle(self):
query = self.search_entry.get().strip()
if query:
self.vehicle_listbox.delete(0, tk.END)
for plate in self.parking_manager.parked_vehicles.keys():
if query.lower() in plate.lower():
self.vehicle_listbox.insert(tk.END, plate)
def add_vehicle(self):
new_vehicle = simpledialog.askstring("录入车辆", "请输入车牌号:")
if new_vehicle and new_vehicle not in self.vehicles:
car = Vehicle(new_vehicle, "car")
parking_manager.park_vehicle(car) # 假设park_vehicle方法已更新数据库
self.update_ui_vehicles() # 添加车辆后立即刷新UI
def remove_vehicle(self):
selected = self.vehicle_listbox.curselection()
if selected:
plate = self.vehicle_listbox.get(selected[0])
fee = parking_manager.unpark_vehicle(plate)
messagebox.showinfo("停车费用", f"车辆 {plate} 的停车费用为:{fee}")
self.update_ui_vehicles() # 移除车辆后刷新UI
def quit_app(self):
self.master.destroy()
def login_success(username_entry, password_entry, parking_manager):
expected_username = "1"
expected_password = "1" # 这里设置具体的密码
entered_username = username_entry.get().strip()
entered_password = password_entry.get().strip()
if entered_username == expected_username and entered_password == expected_password:
login_window.withdraw()
open_main_system(parking_manager)
else:
messagebox.showerror("登录失败", "用户名或密码错误,请重试。")
def open_main_system(parking_manager):
main_system_window = tk.Toplevel(login_window)
main_system_window.title("停车场管理系统 - 主功能")
app = ParkingSystemApp(main_system_window, parking_manager)
main_system_window.protocol("WM_DELETE_WINDOW", lambda: [main_system_window.destroy(), login_window.destroy()])
# 初始化停车场管理器
parking_manager = ParkingLotManager()
parking_manager.add_pricing_rule("car", 2, 20) # 小型车每小时2元每日最高20元
# 登录界面
login_window = tk.Tk()
login_window.title("停车场管理系统 - 登录")
label_username = tk.Label(login_window, text="用户名:")
label_username.pack()
entry_username = tk.Entry(login_window)
entry_username.pack()
label_password = tk.Label(login_window, text="密码:")
label_password.pack()
entry_password = tk.Entry(login_window, show="*")
entry_password.pack()
button_login = tk.Button(login_window, text="登录", command=lambda: login_success(entry_username, entry_password, parking_manager))
button_login.pack(pady=10)
login_window.mainloop()