import tkinter as tk from tkinter import ttk, messagebox, filedialog import pymysql import csv # 全局变量 conn = None username = None # 数据库连接函数 def get_connection(user, password): try: connection = pymysql.connect( host="localhost", # 数据库主机地址 user='root', # 数据库用户名 password='lgs2018231', # 数据库密码 database="hotelmanagementsystem", # 数据库名称 port=3306, # MySQL 的默认端口 charset='utf8mb4' # 确保支持中文和特殊字符 ) print("数据库连接成功!") return connection except pymysql.MySQLError as e: messagebox.showerror("连接失败", f"数据库连接失败: {e}") return None # 登录验证 def authenticate_user(login_window, user_entry, password_entry): global conn, username username = user_entry.get() password = password_entry.get() conn = get_connection(username, password) if conn: messagebox.showinfo("登录成功", f"欢迎 {username}!") login_window.destroy() main_window() else: messagebox.showerror("登录失败", "用户名或密码错误!") """前台查询顾客信息""" def query_customer_info(): def submit_query(): customer_name = name_entry.get().strip() try: cursor = conn.cursor() query = """ SELECT * FROM Customer WHERE Name LIKE %s; """ cursor.execute(query, (f"%{customer_name}%",)) results = cursor.fetchall() display_results("顾客信息", ["CustomerID", "Name", "Gender", "Age", "ContactInfo", "Address", "IDCardNumber"], results) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 查询窗口 query_window = tk.Toplevel() query_window.title("查询顾客信息") tk.Label(query_window, text="顾客姓名:").grid(row=0, column=0) name_entry = tk.Entry(query_window) name_entry.grid(row=0, column=1) submit_button = tk.Button(query_window, text="查询", command=submit_query) submit_button.grid(row=1, column=0, columnspan=2) # 查询顾客预订信息视图 def query_customer_reservation_view(): try: cursor = conn.cursor() query = "SELECT * FROM CustomerReservationView;" cursor.execute(query) results = cursor.fetchall() # 显示查询结果 display_results("顾客预订信息", ["CustomerID", "CustomerName", "ContactInfo", "RoomNumber", "RoomType", "CheckInDate", "CheckOutDate", "ReservationStatus"], results) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 查询入住详细信息视图 def query_stay_details_view(): try: cursor = conn.cursor() query = "SELECT * FROM StayDetailsView;" cursor.execute(query) results = cursor.fetchall() # 显示查询结果 display_results("入住详细信息", ["StayID", "CustomerName", "RoomNumber", "RoomType", "PaymentAmount", "PaymentMethod", "AdditionalServices"], results) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 查询房间状态视图 def query_room_status_view(): try: # 执行查询房间状态视图 cursor = conn.cursor() query = "SELECT * FROM RoomStatusView;" # 假设视图名为 RoomStatusView cursor.execute(query) results = cursor.fetchall() # 显示查询结果 display_results( "房间状态", ["RoomID", "RoomNumber", "RoomType", "RoomStatus"], results ) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 修改房间状态 def update_room_status(): def submit_room_status(): room_number = room_number_entry.get() new_status = room_status_entry.get() try: cursor = conn.cursor() query = "CALL UpdateRoomStatus(%s, %s);" cursor.execute(query, (room_number, new_status)) conn.commit() messagebox.showinfo("成功", f"房间 {room_number} 状态已更新为 {new_status}。") room_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"修改失败: {e}") # 修改房间状态窗口 room_window = tk.Toplevel() room_window.title("修改房间状态") tk.Label(room_window, text="房间号:").grid(row=0, column=0) room_number_entry = tk.Entry(room_window) room_number_entry.grid(row=0, column=1) tk.Label(room_window, text="新状态 (Available/Occupied):").grid(row=1, column=0) room_status_entry = tk.Entry(room_window) room_status_entry.grid(row=1, column=1) submit_button = tk.Button(room_window, text="提交", command=submit_room_status) submit_button.grid(row=2, column=0, columnspan=2) # 更新预订状态 def update_reservation_status(): def submit_reservation_status(): reservation_id = reservation_id_entry.get() new_status = reservation_status_entry.get() try: cursor = conn.cursor() query = "UPDATE Reservation SET Status = %s WHERE ReservationID = %s;" cursor.execute(query, (new_status, reservation_id)) conn.commit() messagebox.showinfo("成功", f"预订编号 {reservation_id} 状态已更新为 {new_status}。") reservation_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"修改失败: {e}") # 更新预订状态窗口 reservation_window = tk.Toplevel() reservation_window.title("更新预订状态") tk.Label(reservation_window, text="预订编号:").grid(row=0, column=0) reservation_id_entry = tk.Entry(reservation_window) reservation_id_entry.grid(row=0, column=1) tk.Label(reservation_window, text="新状态 (Confirmed/Pending/CheckedIn):").grid(row=1, column=0) reservation_status_entry = tk.Entry(reservation_window) reservation_status_entry.grid(row=1, column=1) submit_button = tk.Button(reservation_window, text="提交", command=submit_reservation_status) submit_button.grid(row=2, column=0, columnspan=2) # 新增员工 def add_employee(): def submit_employee(): name = name_entry.get() gender = gender_entry.get() age = int(age_entry.get()) contact_info = contact_entry.get() position = position_entry.get() hire_date = hire_date_entry.get() salary = float(salary_entry.get()) try: cursor = conn.cursor() query = """ INSERT INTO Employee (Name, Gender, Age, ContactInfo, Position, HireDate, Salary) VALUES (%s, %s, %s, %s, %s, %s, %s); """ cursor.execute(query, (name, gender, age, contact_info, position, hire_date, salary)) conn.commit() messagebox.showinfo("成功", f"员工 {name} 已添加。") employee_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"添加失败: {e}") # 新增员工窗口 employee_window = tk.Toplevel() employee_window.title("新增员工") tk.Label(employee_window, text="姓名:").grid(row=0, column=0) name_entry = tk.Entry(employee_window) name_entry.grid(row=0, column=1) tk.Label(employee_window, text="性别 (Male/Female):").grid(row=1, column=0) gender_entry = tk.Entry(employee_window) gender_entry.grid(row=1, column=1) tk.Label(employee_window, text="年龄:").grid(row=2, column=0) age_entry = tk.Entry(employee_window) age_entry.grid(row=2, column=1) tk.Label(employee_window, text="联系方式:").grid(row=3, column=0) contact_entry = tk.Entry(employee_window) contact_entry.grid(row=3, column=1) tk.Label(employee_window, text="职位:").grid(row=4, column=0) position_entry = tk.Entry(employee_window) position_entry.grid(row=4, column=1) tk.Label(employee_window, text="入职日期 (YYYY-MM-DD):").grid(row=5, column=0) hire_date_entry = tk.Entry(employee_window) hire_date_entry.grid(row=5, column=1) tk.Label(employee_window, text="工资:").grid(row=6, column=0) salary_entry = tk.Entry(employee_window) salary_entry.grid(row=6, column=1) submit_button = tk.Button(employee_window, text="提交", command=submit_employee) submit_button.grid(row=7, column=0, columnspan=2) # 删除员工 def delete_employee(): def submit_delete_employee(): employee_id = employee_id_entry.get() try: cursor = conn.cursor() query = "DELETE FROM Employee WHERE EmployeeID = %s;" cursor.execute(query, (employee_id,)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"员工编号 {employee_id} 已删除。") else: messagebox.showwarning("失败", f"员工编号 {employee_id} 不存在。") delete_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"删除失败: {e}") # 删除员工窗口 delete_window = tk.Toplevel() delete_window.title("删除员工") tk.Label(delete_window, text="员工编号:").grid(row=0, column=0) employee_id_entry = tk.Entry(delete_window) employee_id_entry.grid(row=0, column=1) submit_button = tk.Button(delete_window, text="提交", command=submit_delete_employee) submit_button.grid(row=1, column=0, columnspan=2) # 修改员工排班信息 def update_employee_shift(): def submit_shift_update(): shift_id = shift_id_entry.get() employee_id = employee_id_entry.get() shift_date = shift_date_entry.get() shift_start_time = shift_start_time_entry.get() shift_end_time = shift_end_time_entry.get() try: cursor = conn.cursor() query = """ UPDATE Shift SET EmployeeID = %s, ShiftDate = %s, ShiftStartTime = %s, ShiftEndTime = %s WHERE ShiftID = %s; """ cursor.execute(query, (employee_id, shift_date, shift_start_time, shift_end_time, shift_id)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"排班编号 {shift_id} 的信息已更新。") else: messagebox.showwarning("失败", f"排班编号 {shift_id} 不存在。") shift_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"更新失败: {e}") # 修改排班窗口 shift_window = tk.Toplevel() shift_window.title("修改员工排班信息") tk.Label(shift_window, text="排班编号 (ShiftID):").grid(row=0, column=0) shift_id_entry = tk.Entry(shift_window) shift_id_entry.grid(row=0, column=1) tk.Label(shift_window, text="员工编号 (EmployeeID):").grid(row=1, column=0) employee_id_entry = tk.Entry(shift_window) employee_id_entry.grid(row=1, column=1) tk.Label(shift_window, text="排班日期 (YYYY-MM-DD):").grid(row=2, column=0) shift_date_entry = tk.Entry(shift_window) shift_date_entry.grid(row=2, column=1) tk.Label(shift_window, text="开始时间 (HH:MM:SS):").grid(row=3, column=0) shift_start_time_entry = tk.Entry(shift_window) shift_start_time_entry.grid(row=3, column=1) tk.Label(shift_window, text="结束时间 (HH:MM:SS):").grid(row=4, column=0) shift_end_time_entry = tk.Entry(shift_window) shift_end_time_entry.grid(row=4, column=1) submit_button = tk.Button(shift_window, text="提交", command=submit_shift_update) submit_button.grid(row=5, column=0, columnspan=2) # 修改房型信息 def update_room_type(): def submit_room_type_update(): room_type_id = room_type_id_entry.get() new_name = type_name_entry.get() new_description = description_entry.get() new_base_price = base_price_entry.get() try: cursor = conn.cursor() query = """ UPDATE RoomType SET TypeName = %s, Description = %s, BasePrice = %s WHERE RoomTypeID = %s; """ cursor.execute(query, (new_name, new_description, new_base_price, room_type_id)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"房型编号 {room_type_id} 的信息已更新。") else: messagebox.showwarning("失败", f"房型编号 {room_type_id} 不存在。") room_type_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"更新失败: {e}") # 修改房型信息窗口 room_type_window = tk.Toplevel() room_type_window.title("修改房型信息") tk.Label(room_type_window, text="房型编号 (RoomTypeID):").grid(row=0, column=0) room_type_id_entry = tk.Entry(room_type_window) room_type_id_entry.grid(row=0, column=1) tk.Label(room_type_window, text="房型名称 (TypeName):").grid(row=1, column=0) type_name_entry = tk.Entry(room_type_window) type_name_entry.grid(row=1, column=1) tk.Label(room_type_window, text="房型描述 (Description):").grid(row=2, column=0) description_entry = tk.Entry(room_type_window) description_entry.grid(row=2, column=1) tk.Label(room_type_window, text="房型价格 (BasePrice):").grid(row=3, column=0) base_price_entry = tk.Entry(room_type_window) base_price_entry.grid(row=3, column=1) submit_button = tk.Button(room_type_window, text="提交", command=submit_room_type_update) submit_button.grid(row=4, column=0, columnspan=2) # 修改顾客信息(新增、修改、删除) def manage_customer_info(): def add_customer(): """新增顾客信息""" name = name_entry.get() gender = gender_entry.get() age = int(age_entry.get()) contact_info = contact_entry.get() address = address_entry.get() id_card_number = id_entry.get() try: cursor = conn.cursor() query = """ INSERT INTO Customer (Name, Gender, Age, ContactInfo, Address, IDCardNumber) VALUES (%s, %s, %s, %s, %s, %s); """ cursor.execute(query, (name, gender, age, contact_info, address, id_card_number)) conn.commit() messagebox.showinfo("成功", f"顾客 {name} 信息已新增。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"新增失败: {e}") def update_customer(): """修改顾客信息""" customer_id = customer_id_entry.get() name = name_entry.get() gender = gender_entry.get() age = int(age_entry.get()) contact_info = contact_entry.get() address = address_entry.get() id_card_number = id_entry.get() try: cursor = conn.cursor() query = """ UPDATE Customer SET Name = %s, Gender = %s, Age = %s, ContactInfo = %s, Address = %s, IDCardNumber = %s WHERE CustomerID = %s; """ cursor.execute(query, (name, gender, age, contact_info, address, id_card_number, customer_id)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"顾客编号 {customer_id} 的信息已更新。") else: messagebox.showwarning("失败", f"顾客编号 {customer_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"更新失败: {e}") def delete_customer(): """删除顾客信息""" customer_id = customer_id_entry.get() try: cursor = conn.cursor() query = "DELETE FROM Customer WHERE CustomerID = %s;" cursor.execute(query, (customer_id,)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"顾客编号 {customer_id} 已删除。") else: messagebox.showwarning("失败", f"顾客编号 {customer_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"删除失败: {e}") # 管理顾客信息窗口 customer_window = tk.Toplevel() customer_window.title("管理顾客信息") # 顾客编号(仅用于修改和删除) tk.Label(customer_window, text="顾客编号 (CustomerID):").grid(row=0, column=0) customer_id_entry = tk.Entry(customer_window) customer_id_entry.grid(row=0, column=1) # 通用字段 tk.Label(customer_window, text="姓名 (Name):").grid(row=1, column=0) name_entry = tk.Entry(customer_window) name_entry.grid(row=1, column=1) tk.Label(customer_window, text="性别 (Gender: Male/Female):").grid(row=2, column=0) gender_entry = tk.Entry(customer_window) gender_entry.grid(row=2, column=1) tk.Label(customer_window, text="年龄 (Age):").grid(row=3, column=0) age_entry = tk.Entry(customer_window) age_entry.grid(row=3, column=1) tk.Label(customer_window, text="联系方式 (ContactInfo):").grid(row=4, column=0) contact_entry = tk.Entry(customer_window) contact_entry.grid(row=4, column=1) tk.Label(customer_window, text="地址 (Address):").grid(row=5, column=0) address_entry = tk.Entry(customer_window) address_entry.grid(row=5, column=1) tk.Label(customer_window, text="身份证号 (IDCardNumber):").grid(row=6, column=0) id_entry = tk.Entry(customer_window) id_entry.grid(row=6, column=1) # 操作按钮 tk.Button(customer_window, text="新增顾客", command=add_customer).grid(row=7, column=0, pady=5) tk.Button(customer_window, text="修改顾客", command=update_customer).grid(row=7, column=1, pady=5) tk.Button(customer_window, text="删除顾客", command=delete_customer).grid(row=8, column=0, columnspan=2, pady=5) # 管理服务信息(新增、修改、删除) def manage_service_info(): def add_service(): """新增服务信息""" service_name = service_name_entry.get().strip() description = service_description_entry.get().strip() price = service_price_entry.get().strip() # 验证输入 if not service_name: messagebox.showerror("错误", "服务名称不能为空!") return if not price.replace('.', '', 1).isdigit() or float(price) < 0: messagebox.showerror("错误", "价格必须是非负数!") return price = float(price) # 插入服务信息到数据库 try: cursor = conn.cursor() query = """ INSERT INTO Service (ServiceName, Description, Price) VALUES (%s, %s, %s); """ cursor.execute(query, (service_name, description, price)) conn.commit() messagebox.showinfo("成功", f"服务 {service_name} 已新增。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"新增失败: {e}") def update_service(): """修改服务信息""" service_id = service_id_entry.get().strip() service_name = service_name_entry.get().strip() description = service_description_entry.get().strip() price = service_price_entry.get().strip() # 验证输入 if not service_id.isdigit(): messagebox.showerror("错误", "服务编号必须是数字!") return if not service_name: messagebox.showerror("错误", "服务名称不能为空!") return if not price.replace('.', '', 1).isdigit() or float(price) < 0: messagebox.showerror("错误", "价格必须是非负数!") return service_id = int(service_id) price = float(price) # 更新服务信息到数据库 try: cursor = conn.cursor() query = """ UPDATE Service SET ServiceName = %s, Description = %s, Price = %s WHERE ServiceID = %s; """ cursor.execute(query, (service_name, description, price, service_id)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"服务编号 {service_id} 的信息已更新。") else: messagebox.showwarning("失败", f"服务编号 {service_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"更新失败: {e}") def delete_service(): """删除服务信息""" service_id = service_id_entry.get().strip() # 验证输入 if not service_id.isdigit(): messagebox.showerror("错误", "服务编号必须是数字!") return service_id = int(service_id) # 删除服务信息 try: cursor = conn.cursor() query = "DELETE FROM Service WHERE ServiceID = %s;" cursor.execute(query, (service_id,)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"服务编号 {service_id} 已删除。") else: messagebox.showwarning("失败", f"服务编号 {service_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"删除失败: {e}") # 创建管理服务信息的窗口 service_window = tk.Toplevel() service_window.title("管理服务信息") # 界面布局 tk.Label(service_window, text="服务编号 (ServiceID):").grid(row=0, column=0) service_id_entry = tk.Entry(service_window) service_id_entry.grid(row=0, column=1) tk.Label(service_window, text="服务名称 (ServiceName):").grid(row=1, column=0) service_name_entry = tk.Entry(service_window) service_name_entry.grid(row=1, column=1) tk.Label(service_window, text="服务描述 (Description):").grid(row=2, column=0) service_description_entry = tk.Entry(service_window) service_description_entry.grid(row=2, column=1) tk.Label(service_window, text="服务价格 (Price):").grid(row=3, column=0) service_price_entry = tk.Entry(service_window) service_price_entry.grid(row=3, column=1) # 按钮 tk.Button(service_window, text="新增服务", command=add_service).grid(row=4, column=0, pady=5) tk.Button(service_window, text="修改服务", command=update_service).grid(row=4, column=1, pady=5) tk.Button(service_window, text="删除服务", command=delete_service).grid(row=5, column=0, columnspan=2, pady=5) # 管理员工绩效信息(新增、修改、删除) def manage_employee_performance(): def add_performance(): """新增员工绩效记录""" employee_id = employee_id_entry.get().strip() evaluation_date = evaluation_date_entry.get().strip() score = score_entry.get().strip() comments = comments_entry.get().strip() # 验证输入 if not employee_id.isdigit(): messagebox.showerror("错误", "员工编号必须是数字!") return if not score.isdigit() or int(score) < 0 or int(score) > 100: messagebox.showerror("错误", "评分必须是 0 到 100 的整数!") return if not evaluation_date: messagebox.showerror("错误", "评估日期不能为空!") return employee_id = int(employee_id) score = int(score) # 插入绩效记录到数据库 try: cursor = conn.cursor() query = """ INSERT INTO Performance (EmployeeID, EvaluationDate, Score, Comments) VALUES (%s, %s, %s, %s); """ cursor.execute(query, (employee_id, evaluation_date, score, comments)) conn.commit() messagebox.showinfo("成功", f"员工编号 {employee_id} 的绩效记录已新增。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"新增失败: {e}") def update_performance(): """修改员工绩效记录""" performance_id = performance_id_entry.get().strip() employee_id = employee_id_entry.get().strip() evaluation_date = evaluation_date_entry.get().strip() score = score_entry.get().strip() comments = comments_entry.get().strip() # 验证输入 if not performance_id.isdigit(): messagebox.showerror("错误", "绩效编号必须是数字!") return if not employee_id.isdigit(): messagebox.showerror("错误", "员工编号必须是数字!") return if not score.isdigit() or int(score) < 0 or int(score) > 100: messagebox.showerror("错误", "评分必须是 0 到 100 的整数!") return if not evaluation_date: messagebox.showerror("错误", "评估日期不能为空!") return performance_id = int(performance_id) employee_id = int(employee_id) score = int(score) # 更新绩效记录到数据库 try: cursor = conn.cursor() query = """ UPDATE Performance SET EmployeeID = %s, EvaluationDate = %s, Score = %s, Comments = %s WHERE PerformanceID = %s; """ cursor.execute(query, (employee_id, evaluation_date, score, comments, performance_id)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"绩效编号 {performance_id} 的信息已更新。") else: messagebox.showwarning("失败", f"绩效编号 {performance_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"更新失败: {e}") def delete_performance(): """删除员工绩效记录""" performance_id = performance_id_entry.get().strip() # 验证输入 if not performance_id.isdigit(): messagebox.showerror("错误", "绩效编号必须是数字!") return performance_id = int(performance_id) # 删除绩效记录 try: cursor = conn.cursor() query = "DELETE FROM Performance WHERE PerformanceID = %s;" cursor.execute(query, (performance_id,)) conn.commit() if cursor.rowcount > 0: messagebox.showinfo("成功", f"绩效编号 {performance_id} 已删除。") else: messagebox.showwarning("失败", f"绩效编号 {performance_id} 不存在。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"删除失败: {e}") # 创建管理绩效信息的窗口 performance_window = tk.Toplevel() performance_window.title("管理员工绩效信息") # 界面布局 tk.Label(performance_window, text="绩效编号 (PerformanceID):").grid(row=0, column=0) performance_id_entry = tk.Entry(performance_window) performance_id_entry.grid(row=0, column=1) tk.Label(performance_window, text="员工编号 (EmployeeID):").grid(row=1, column=0) employee_id_entry = tk.Entry(performance_window) employee_id_entry.grid(row=1, column=1) tk.Label(performance_window, text="评估日期 (YYYY-MM-DD):").grid(row=2, column=0) evaluation_date_entry = tk.Entry(performance_window) evaluation_date_entry.grid(row=2, column=1) tk.Label(performance_window, text="评分 (Score: 0-100):").grid(row=3, column=0) score_entry = tk.Entry(performance_window) score_entry.grid(row=3, column=1) tk.Label(performance_window, text="评语 (Comments):").grid(row=4, column=0) comments_entry = tk.Entry(performance_window) comments_entry.grid(row=4, column=1) # 按钮 tk.Button(performance_window, text="新增绩效记录", command=add_performance).grid(row=5, column=0, pady=5) tk.Button(performance_window, text="修改绩效记录", command=update_performance).grid(row=5, column=1, pady=5) tk.Button(performance_window, text="删除绩效记录", command=delete_performance).grid(row=6, column=0, columnspan=2, pady=5) def check_in_guest(): """前台办理入住""" def submit_check_in(): reservation_id = reservation_id_entry.get().strip() actual_check_in_date = check_in_date_entry.get().strip() try: cursor = conn.cursor() query = """ UPDATE Reservation SET Status = 'CheckedIn', CheckInDate = %s WHERE ReservationID = %s; """ cursor.execute(query, (actual_check_in_date, reservation_id)) conn.commit() messagebox.showinfo("成功", f"预订编号 {reservation_id} 已办理入住。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"办理失败: {e}") # 办理入住窗口 check_in_window = tk.Toplevel() check_in_window.title("办理入住") tk.Label(check_in_window, text="预订编号 (ReservationID):").grid(row=0, column=0) reservation_id_entry = tk.Entry(check_in_window) reservation_id_entry.grid(row=0, column=1) tk.Label(check_in_window, text="入住日期 (YYYY-MM-DD):").grid(row=1, column=0) check_in_date_entry = tk.Entry(check_in_window) check_in_date_entry.grid(row=1, column=1) submit_button = tk.Button(check_in_window, text="提交", command=submit_check_in) submit_button.grid(row=2, column=0, columnspan=2) # 增加付款信息 def add_payment_info(): def submit_payment(): """提交付款信息到数据库""" stay_id = stay_id_entry.get().strip() amount = amount_entry.get().strip() payment_method = payment_method_entry.get().strip() payment_date = payment_date_entry.get().strip() # 验证输入 if not stay_id.isdigit(): messagebox.showerror("错误", "入住编号 (StayID) 必须是数字!") return if not amount.replace('.', '', 1).isdigit() or float(amount) <= 0: messagebox.showerror("错误", "付款金额必须是正数!") return if not payment_method: messagebox.showerror("错误", "付款方式不能为空!") return if not payment_date: messagebox.showerror("错误", "付款日期不能为空!") return stay_id = int(stay_id) amount = float(amount) # 插入付款信息到数据库 try: cursor = conn.cursor() query = """ INSERT INTO Payment (StayID, Amount, PaymentMethod, PaymentDate) VALUES (%s, %s, %s, %s); """ cursor.execute(query, (stay_id, amount, payment_method, payment_date)) conn.commit() messagebox.showinfo("成功", f"入住编号 {stay_id} 的付款信息已新增。") except pymysql.MySQLError as e: messagebox.showerror("失败", f"新增失败: {e}") # 创建付款信息窗口 payment_window = tk.Toplevel() payment_window.title("新增付款信息") # 界面布局 tk.Label(payment_window, text="入住编号 (StayID):").grid(row=0, column=0) stay_id_entry = tk.Entry(payment_window) stay_id_entry.grid(row=0, column=1) tk.Label(payment_window, text="付款金额 (Amount):").grid(row=1, column=0) amount_entry = tk.Entry(payment_window) amount_entry.grid(row=1, column=1) tk.Label(payment_window, text="付款方式 (PaymentMethod):").grid(row=2, column=0) payment_method_entry = tk.Entry(payment_window) payment_method_entry.grid(row=2, column=1) tk.Label(payment_window, text="付款日期 (YYYY-MM-DD):").grid(row=3, column=0) payment_date_entry = tk.Entry(payment_window) payment_date_entry.grid(row=3, column=1) # 提交按钮 tk.Button(payment_window, text="提交付款信息", command=submit_payment).grid(row=4, column=0, columnspan=2, pady=10) def query_employee_info(): """查询员工信息""" def submit_query(): employee_id = employee_id_entry.get().strip() name = name_entry.get().strip() position = position_entry.get().strip() # 构建查询条件 query_conditions = [] query_values = [] if employee_id: if not employee_id.isdigit(): messagebox.showerror("错误", "员工编号 (EmployeeID) 必须是数字!") return query_conditions.append("EmployeeID = %s") query_values.append(int(employee_id)) if name: query_conditions.append("Name LIKE %s") query_values.append(f"%{name}%") if position: query_conditions.append("Position LIKE %s") query_values.append(f"%{position}%") if not query_conditions: messagebox.showerror("错误", "请至少填写一个查询条件!") return query = "SELECT * FROM Employee WHERE " + " AND ".join(query_conditions) # 执行查询 try: cursor = conn.cursor() cursor.execute(query, query_values) results = cursor.fetchall() display_results( "员工信息查询结果", ["EmployeeID", "Name", "Gender", "Age", "ContactInfo", "Position", "HireDate", "Salary"], results ) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 创建查询窗口 query_window = tk.Toplevel() query_window.title("查询员工信息") # 界面布局 tk.Label(query_window, text="员工编号 (EmployeeID):").grid(row=0, column=0) employee_id_entry = tk.Entry(query_window) employee_id_entry.grid(row=0, column=1) tk.Label(query_window, text="员工姓名 (Name):").grid(row=1, column=0) name_entry = tk.Entry(query_window) name_entry.grid(row=1, column=1) tk.Label(query_window, text="职位 (Position):").grid(row=2, column=0) position_entry = tk.Entry(query_window) position_entry.grid(row=2, column=1) tk.Button(query_window, text="查询", command=submit_query).grid(row=3, column=0, columnspan=2, pady=10) def check_out_guest(): """办理退房""" def submit_check_out(): stay_id = stay_id_entry.get().strip() actual_check_out_date = check_out_date_entry.get().strip() # 验证输入 if not stay_id.isdigit(): messagebox.showerror("错误", "入住编号 (StayID) 必须是数字!") return if not actual_check_out_date: messagebox.showerror("错误", "退房日期不能为空!") return stay_id = int(stay_id) try: # 更新入住记录的退房日期 cursor = conn.cursor() query = """ UPDATE Stay SET CheckOutDate = %s WHERE StayID = %s; """ cursor.execute(query, (actual_check_out_date, stay_id)) # 查询入住记录以获取房间编号 query = """ SELECT RoomID FROM Stay WHERE StayID = %s; """ cursor.execute(query, (stay_id,)) result = cursor.fetchone() if not result: messagebox.showerror("错误", f"入住编号 {stay_id} 不存在!") return room_id = result[0] # 更新房间状态为“空闲” query = """ UPDATE Room SET Status = 'Available' WHERE RoomID = %s; """ cursor.execute(query, (room_id,)) conn.commit() messagebox.showinfo("成功", f"退房成功!入住编号 {stay_id} 的记录已更新,房间编号 {room_id} 已设为空闲。") check_out_window.destroy() except pymysql.MySQLError as e: messagebox.showerror("失败", f"退房失败: {e}") # 创建退房窗口 check_out_window = tk.Toplevel() check_out_window.title("办理退房") # 界面布局 tk.Label(check_out_window, text="入住编号 (StayID):").grid(row=0, column=0) stay_id_entry = tk.Entry(check_out_window) stay_id_entry.grid(row=0, column=1) tk.Label(check_out_window, text="实际退房日期 (YYYY-MM-DD):").grid(row=1, column=0) check_out_date_entry = tk.Entry(check_out_window) check_out_date_entry.grid(row=1, column=1) submit_button = tk.Button(check_out_window, text="提交退房信息", command=submit_check_out) submit_button.grid(row=2, column=0, columnspan=2, pady=10) def query_payment_info(): """查询付款信息""" def submit_query(): stay_id = stay_id_entry.get().strip() payment_date = payment_date_entry.get().strip() # 构建查询条件 query_conditions = [] query_values = [] if stay_id: if not stay_id.isdigit(): messagebox.showerror("错误", "入住编号 (StayID) 必须是数字!") return query_conditions.append("StayID = %s") query_values.append(int(stay_id)) if payment_date: query_conditions.append("PaymentDate = %s") query_values.append(payment_date) if not query_conditions: messagebox.showerror("错误", "请至少填写一个查询条件!") return query = "SELECT * FROM Payment WHERE " + " AND ".join(query_conditions) # 执行查询 try: cursor = conn.cursor() cursor.execute(query, query_values) results = cursor.fetchall() display_results( "付款信息查询结果", ["PaymentID", "StayID", "Amount", "PaymentMethod", "PaymentDate"], results ) except pymysql.MySQLError as e: messagebox.showerror("查询失败", f"查询失败: {e}") # 创建查询窗口 query_window = tk.Toplevel() query_window.title("查询付款信息") # 界面布局 tk.Label(query_window, text="入住编号 (StayID):").grid(row=0, column=0) stay_id_entry = tk.Entry(query_window) stay_id_entry.grid(row=0, column=1) tk.Label(query_window, text="付款日期 (YYYY-MM-DD):").grid(row=1, column=0) payment_date_entry = tk.Entry(query_window) payment_date_entry.grid(row=1, column=1) tk.Button(query_window, text="查询", command=submit_query).grid(row=2, column=0, columnspan=2, pady=10) # 导出查询结果到 CSV def export_to_csv(title, columns, results): filepath = filedialog.asksaveasfilename(defaultextension=".csv", filetypes=[("CSV files", "*.csv")]) if filepath: try: with open(filepath, mode="w", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow(columns) writer.writerows(results) messagebox.showinfo("导出成功", f"{title} 已成功导出到 {filepath}") except Exception as e: messagebox.showerror("导出失败", f"导出失败: {e}") # 显示查询结果 def display_results(title, columns, results): result_window = tk.Toplevel() result_window.title(title) tree = ttk.Treeview(result_window, columns=columns, show="headings") for col in columns: tree.heading(col, text=col) tree.column(col, width=150) for row in results: tree.insert("", "end", values=row) tree.pack(fill="both", expand=True) export_button = tk.Button(result_window, text="导出到 CSV", command=lambda: export_to_csv(title, columns, results)) export_button.pack() # 主界面 def main_window(): window = tk.Tk() window.title("酒店管理系统") if username == "admin_user": tk.Button(window, text="管理服务信息", command=manage_service_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="管理顾客信息", command=manage_customer_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="管理员工绩效信息", command=manage_employee_performance).pack(fill="x", padx=20, pady=10) tk.Button(window, text="新增员工", command=add_employee).pack(fill="x", padx=20, pady=10) tk.Button(window, text="删除员工", command=delete_employee).pack(fill="x", padx=20, pady=10) tk.Button(window, text="修改员工排班信息", command=update_employee_shift).pack(fill="x", padx=20, pady=10) tk.Button(window, text="修改房型信息", command=update_room_type).pack(fill="x", padx=20, pady=10) tk.Button(window, text="修改房间状态", command=update_room_status).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询顾客信息", command=query_customer_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询顾客预订信息视图", command=query_customer_reservation_view).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询房间状态信息视图", command=query_room_status_view).pack(fill="x", padx=20,pady=10) tk.Button(window, text="退出", command=lambda: close_connection(window)).pack(fill="x", padx=20, pady=10) elif username == "receptionist_user": tk.Button(window, text="管理顾客信息", command=manage_customer_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="修改房间状态", command=update_room_status).pack(fill="x", padx=20, pady=10) tk.Button(window, text="更新预订状态", command=update_reservation_status).pack(fill="x", padx=20, pady=10) tk.Button(window, text="办理入住", command=check_in_guest).pack(fill="x", padx=20, pady=10) tk.Button(window, text="办理退房", command=check_out_guest).pack(fill="x", padx=20, pady=10) tk.Button(window, text="新增付款项目", command=add_payment_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询付款信息", command=query_payment_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询顾客信息", command=query_customer_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询顾客预订信息视图", command=query_customer_reservation_view).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询房间状态信息视图", command=query_room_status_view).pack(fill="x", padx=20, pady=10) tk.Button(window, text="退出", command=lambda: close_connection(window)).pack(fill="x", padx=20, pady=10) elif username == "auditor_user": tk.Button(window, text="查询顾客信息", command=query_customer_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询付款信息", command=query_payment_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询员工信息", command=query_employee_info).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询入住详细信息视图", command=query_stay_details_view).pack(fill="x", padx=20, pady=10) tk.Button(window, text="查询房间状态信息视图", command=query_room_status_view).pack(fill="x", padx=20, pady=10) tk.Button(window, text="退出", command=lambda: close_connection(window)).pack(fill="x", padx=20, pady=10) window.mainloop() # 安全断开数据库连接 def close_connection(window): if conn: conn.close() window.destroy() print("数据库连接已关闭!") # 登录界面 def login_window(): window = tk.Tk() window.title("登录") tk.Label(window, text="用户名:").grid(row=0, column=0) user_entry = tk.Entry(window) user_entry.grid(row=0, column=1) tk.Label(window, text="密码:").grid(row=1, column=0) password_entry = tk.Entry(window, show="*") password_entry.grid(row=1, column=1) login_button = tk.Button(window, text="登录", command=lambda: authenticate_user(window, user_entry, password_entry)) login_button.grid(row=2, column=0, columnspan=2) window.mainloop() if __name__ == "__main__": login_window()