news 2026/9/25 14:24:18

Python+PyQt5+MySQL酒店管理系统课设实战:源码、数据库脚本与报告全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+PyQt5+MySQL酒店管理系统课设实战:源码、数据库脚本与报告全解析

简介:这份资源是面向高校数据库课程设计场景的酒店管理系统完整项目,适合正在准备数据库课设、需要GUI编程实战案例的计算机相关专业学生参考。项目采用Python结合PyQt5构建桌面界面,后端以MySQL存储数据,覆盖员工管理、客房管理、客户管理三大核心模块,包含权限分级、入住登记、预约退房、房间检索修改等完整业务流程,可直接运行验证。压缩包共61个文件,约8.28MB,其中18个py源码文件承载主程序与各功能模块,8个ui文件对应Qt Designer界面设计,另有sql建库脚本、xml配置、pdf课程设计报告与系统设计文档,以及E-R图、功能结构图等辅助素材,结构清晰便于二次开发。目前已有209人学习下载,读者可获得一套可直接运行的课设源码、配套数据库脚本与完整设计报告,快速理解酒店管理系统的功能划分与实现思路,为课程设计答辩与后续项目开发提供参考。

1. 从一份能直接跑起来的酒店管理系统课设说起

如果你正在做数据库应用课程设计,大概率会遇到一个尴尬局面:E-R 图画得挺漂亮,SQL 建表语句也背得滚瓜烂熟,但一到"把界面和数据库连起来"就卡住了。老师要的是能演示、能录入、能查询的完整系统,而你手里只有一堆散装知识点。这份基于 Python + PyQt5 + MySQL 的酒店管理系统,恰好就是冲着这个痛点来的——它把源码、数据库脚本、课程设计报告、E-R 图、功能结构图全部打包在一起,解压后配好环境就能运行。

它解决的不是"教你 Python 语法"这种问题,而是"给你一个结构完整、功能闭环、报告齐全的参考实现"。适合三类人:一是课设时间紧、需要快速搭出可演示系统的同学;二是想学 PyQt5 桌面端 GUI 编程,但苦于没有完整项目练手的开发者;三是需要一份数据库设计报告模板作为写作参考的人。系统覆盖员工管理、客房管理、客户管理三大模块,权限分级、入住退房、预约取消这些业务逻辑都有对应实现,不是那种只有增删改查的空壳。

2. 拆开压缩包:目录结构与技术栈选型

2.1 文件清单里藏着什么

解压Hotel-information-management-system-main.zip之后,先别急着运行,花两分钟把目录结构看清楚,后面排错会省很多事。核心文件分布大致是这样:

文件/目录作用是否必须
Main.py程序入口,启动登录界面必须
LoginUI.ui/MainUI.uiQt Designer 设计的界面文件必须
room.py/staff.py/report.py各业务模块逻辑代码必须
ModifyPwd.py修改密码功能必须
hotelManagement.sql数据库建表与初始数据脚本必须
E-R_diagram.jpg数据库 E-R 图报告用
Functional_structure_diagram.png功能结构图报告用
《数据库应用》系统设计报告.pdf课程设计报告参考用
课程设计《数据库应用》内容要求.pdf课设要求文档参考用
references参考资料目录可选
.ideaPyCharm 项目配置可删

这里有个细节值得注意:.ui文件和对应的.py文件是分开的。.ui是 Qt Designer 的可视化设计文件,.py是转换后的 Python 代码。很多人拿到这类项目直接改.ui,结果运行没变化,因为程序加载的是.py。常见做法是用pyuic5把.ui转成.py再运行,转换命令后面会讲。

2.2 为什么是 PyQt5 而不是 Tkinter

课设做 GUI,Python 生态里最常被拿来比较的就是 Tkinter 和 PyQt5。Tkinter 是标准库自带,不用装,但控件样式偏老旧,做出来的界面一眼就是"学生作业"。PyQt5 是 Qt 的 Python 绑定,控件丰富、支持样式表、能拖拽设计,做出来的东西更接近真实商业软件。

这份项目选 PyQt5 是有道理的:酒店管理系统涉及大量表格展示(客房列表、员工列表、入住记录),PyQt5 的QTableWidget和QTableView配合模型视图架构,处理起来比 Tkinter 的Treeview顺手得多。而且 Qt Designer 可以可视化拖控件,对不熟悉手写界面代码的人来说,门槛低不少。

代价是环境配置多一步。PyQt5 不是标准库,需要 pip 安装,而且版本和 Python 版本有对应关系。这是后面避坑章节要重点说的。

2.3 MySQL 作为后端存储的合理性

课设要求里明确写了"数据库应用",所以后端选 MySQL 几乎是默认答案。这个项目的数据库设计有几个点值得看:

  • 员工表带权限字段,1 级权限才能做增删改,这是典型的基于角色的访问控制简化版
  • 客房表关联入住状态,退房和入住要同步更新房间状态
  • 客户表记录入住历史,为后续数据分析留了字段

hotelManagement.sql这个脚本里包含了建库、建表、插入初始数据的完整语句。导入之后不用手动录数据就能看到效果,这对演示来说很关键。

提示:导入 SQL 之前先确认 MySQL 服务已启动,否则会报error 2002 (hy000): can't connect to local MySQL server through socket,这个错误后面避坑章节会展开。

3. 环境搭建与数据库导入:从零到能登录

3.1 Python 与 PyQt5 的版本匹配

先说版本。这个项目没有在 README 里写死版本号,但根据 PyQt5 的兼容性,Python 3.7 到 3.10 之间最稳。Python 3.11 之后部分 PyQt5 版本会出现sip模块编译问题,新手容易在这里翻车。

安装 PyQt5 的命令很直接:

# 安装 PyQt5 核心库和 Qt Designer 工具 pip install PyQt5 PyQt5-tools # 如果下载慢,可以指定国内镜像源 pip install PyQt5 PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple

PyQt5是运行时库,程序跑起来靠它。PyQt5-tools里带了designer.exe和pyuic5转换工具,如果你需要改界面就得装。只运行不改界面的话,PyQt5-tools可以不装。

装完之后验证一下:

python -c "from PyQt5.QtWidgets import QApplication; print('PyQt5 OK')"

能打印出PyQt5 OK就说明装好了。如果报ModuleNotFoundError,多半是 pip 装到了别的 Python 环境里,检查一下pip -V和python -V指向的是不是同一个解释器。

3.2 MySQL 建库与 SQL 脚本导入

MySQL 这边,推荐用 5.7 或 8.0 版本。8.0 的默认认证插件是caching_sha2_password,老版本的 PyMySQL 连接会报错,需要额外处理。如果你用的是 8.0,要么改用户认证方式,要么升级连接库。

导入 SQL 脚本有两种方式,命令行和图形化工具都行:

# 方式一:命令行导入 mysql -u root -p < hotelManagement.sql # 方式二:先登录再导入 mysql -u root -p # 进入 mysql 后执行 source /path/to/hotelManagement.sql;

导入完成后验证一下:

-- 查看数据库是否创建成功 SHOW DATABASES LIKE 'hotel%'; -- 切换到对应数据库,查看表结构 USE hotel_management; SHOW TABLES;

如果SHOW TABLES能列出员工表、客房表、客户表等,说明导入成功。这里要注意,SQL 脚本里的数据库名可能和你想的不一样,导入前先打开脚本看一眼CREATE DATABASE那行。

3.3 连接配置与首次运行

数据库连上了,还得让 Python 代码知道怎么连。项目里连接 MySQL 的配置通常在某个.py文件的头部,找pymysql.connect()或者mysql.connector.connect()这样的调用。常见写法是:

import pymysql # 数据库连接配置,根据自己环境修改 conn = pymysql.connect( host='localhost', # 数据库地址,本机就是 localhost port=3306, # MySQL 默认端口 user='root', # 用户名 password='your_password', # 改成你自己的密码 database='hotel_management', # 数据库名,和 SQL 脚本里一致 charset='utf8mb4' # 字符集,防止中文乱码 )

charset='utf8mb4'这个参数别省,酒店系统里客户姓名、备注这些字段有中文,用utf8在某些场景下会出问题。port默认 3306,如果你装 MySQL 时改过端口,这里要同步改。

配置改完,运行Main.py:

python Main.py

正常情况下会弹出登录窗口。如果窗口一闪而过,多半是数据库连接失败抛了异常,用命令行运行能看到报错信息,别双击运行。

4. 核心功能模块的代码逻辑与参数说明

4.1 登录与权限分级怎么实现的

登录模块的逻辑不复杂,但权限分级这块值得看一下。系统里员工有权限字段,1 级权限才能做增删改,其他级别只能查询。实现思路大致是:登录时根据用户名和密码查员工表,把权限字段取出来存到全局变量或主窗口属性里,后续各模块根据这个值决定按钮是否可用。

# 登录验证的典型逻辑 def login_check(username, password): cursor = conn.cursor() # 参数化查询,防止 SQL 注入 sql = "SELECT staff_id, staff_name, permission_level FROM staff WHERE username=%s AND password=%s" cursor.execute(sql, (username, password)) result = cursor.fetchone() if result: # result[2] 是权限等级,存起来供后续判断 return {'id': result[0], 'name': result[1], 'level': result[2]} return None

这里用%s占位符而不是字符串拼接,是防止 SQL 注入的基本操作。虽然课设场景下安全要求不高,但养成参数化查询的习惯没坏处。fetchone()只取一条,因为用户名应该是唯一的。

权限判断在主界面加载时做:

# 根据权限等级控制按钮状态 if current_user['level'] != 1: self.ui.btn_add_staff.setEnabled(False) self.ui.btn_delete_staff.setEnabled(False)

setEnabled(False)让按钮变灰不可点,比点击后弹窗提示"无权限"体验好一些。当然这只是界面层面的限制,严格来说后端也应该再校验一次,课设做到界面层基本够用。

4.2 客房管理与入住退房的状态流转

客房管理是这个系统的核心业务。房间有状态字段,比如"空闲""已入住""已预约",入住和退房要同步更新这个状态。查询可用客房、办理入住、退房这三步是连贯的。

查询满足条件的客房:

# 按房型和状态查询客房 def query_rooms(room_type=None, status='空闲'): cursor = conn.cursor() if room_type: sql = "SELECT room_id, room_number, room_type, price FROM room WHERE room_type=%s AND status=%s" cursor.execute(sql, (room_type, status)) else: sql = "SELECT room_id, room_number, room_type, price FROM room WHERE status=%s" cursor.execute(sql, (status,)) return cursor.fetchall()

status默认传"空闲",这样前台查出来的都是能直接办理入住的房间。room_type可选,不传就查所有类型。

办理入住时,要同时做两件事:往入住记录表插一条数据,更新房间状态。

# 办理入住,事务保证两步操作要么都成功要么都回滚 def check_in(room_id, customer_id, check_in_time): cursor = conn.cursor() try: # 第一步:插入入住记录 sql1 = "INSERT INTO check_in_record (room_id, customer_id, check_in_time) VALUES (%s, %s, %s)" cursor.execute(sql1, (room_id, customer_id, check_in_time)) # 第二步:更新房间状态 sql2 = "UPDATE room SET status='已入住' WHERE room_id=%s" cursor.execute(sql2, (room_id,)) conn.commit() # 两步都成功才提交 except Exception as e: conn.rollback() # 任何一步失败就回滚 raise e

commit()和rollback()是事务的关键。如果插入记录成功但更新状态失败,没有回滚的话就会出现"房间显示空闲但实际有人住"的脏数据。课设里老师不一定查这个,但这是数据库应用的基本功。

退房逻辑类似,把入住记录标记为已退房,房间状态改回空闲。预约功能则是多一个预约表,取消预约时删掉记录即可。

4.3 员工与客户管理的增删改查细节

员工管理有个设计点:查询和修改集成在同一页面,查到就能改。实现上通常是查询按钮触发后把结果填到输入框,修改按钮再读输入框的值去更新。

# 查询员工并回填到表单 def search_staff(staff_id): cursor = conn.cursor() sql = "SELECT staff_id, staff_name, id_card, phone, permission_level FROM staff WHERE staff_id=%s" cursor.execute(sql, (staff_id,)) row = cursor.fetchone() if row: # 把查询结果填到界面输入框 self.ui.input_name.setText(row[1]) self.ui.input_idcard.setText(row[2]) self.ui.input_phone.setText(row[3]) self.ui.input_level.setText(str(row[4])) return row

删除员工要求提供编号、姓名和身份证号三项,这是为了防止误删。实现时三个条件都要匹配才执行删除:

# 三重校验后删除 def delete_staff(staff_id, name, id_card): cursor = conn.cursor() sql = "DELETE FROM staff WHERE staff_id=%s AND staff_name=%s AND id_card=%s" cursor.execute(sql, (staff_id, name, id_card)) conn.commit() # rowcount 为 0 说明三项没同时匹配上 return cursor.rowcount > 0

cursor.rowcount返回受影响行数,为 0 就说明没删掉,可以据此给用户提示。客户管理类似,重点是入住记录的关联查询,为后续数据分析留数据。

5. 避坑与常见问题排查

5.1 PyQt5 安装报错或导入失败

现象:pip install PyQt5卡住不动,或者装完import PyQt5报DLL load failed。

原因:一是网络问题导致下载中断,二是 Python 版本和 PyQt5 版本不匹配,三是 Windows 上缺少 VC++ 运行库。

解决:换国内镜像源重装,指定版本pip install PyQt5==5.15.4,Windows 上装一下 VC++ Redistributable。如果还不行,用 conda 装conda install pyqt通常更省心。

5.2 MySQL 连接报 2002 或 1045 错误

现象:运行程序报error 2002 (hy000): can't connect to local MySQL server或者Access denied for user 'root'@'localhost'。

原因:2002 是 MySQL 服务没启动,或者 socket 路径不对。1045 是密码错误或用户权限问题。

解决:2002 先检查服务,Windows 在服务管理器里启动 MySQL,Linux 用systemctl start mysql。1045 确认密码,必要时用ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';重置。8.0 版本还要注意认证插件问题,可以改成mysql_native_password。

5.3 中文乱码问题

现象:界面显示正常,但数据库里存的中文变成问号或乱码。

原因:数据库、表、连接三处的字符集不一致。

解决:建库时用CHARACTER SET utf8mb4,连接时加charset='utf8mb4',Python 文件本身保存为 UTF-8 编码。三处统一基本就不会乱码了。

5.4 .ui 文件改了但界面没变化

现象:用 Qt Designer 改了LoginUI.ui,运行程序还是老样子。

原因:程序加载的是转换后的.py文件,不是.ui文件。

解决:改完.ui后重新转换:

# 把 ui 文件转成 py 文件 pyuic5 -o LoginUI.py LoginUI.ui

转换后再运行。如果项目里.py和.ui同名,注意别搞混了加载的是哪个。

5.5 程序双击运行闪退

现象:双击Main.py窗口一闪就没了。

原因:代码抛了异常,但双击运行时看不到报错。

解决:用命令行运行python Main.py,报错信息会打印在终端里。常见的是数据库连不上、缺少依赖库、路径问题。看到具体报错再对症处理。

6. 进阶玩法:把课设改成能写进简历的项目

课设跑通只是起点。如果你想让这个项目在面试或简历里更有分量,有几个方向可以动手。

第一个方向是加数据可视化。系统里已经记录了入住历史,用matplotlib或pyqtgraph嵌到 PyQt5 界面里,做一个入住率趋势图或房型占比饼图。PyQt5 支持把 matplotlib 的 Figure 嵌到 QWidget 里,网上有现成的FigureCanvasQTAgg用法。这一步做完,项目就从"增删改查"升级成了"有数据分析能力"。

第二个方向是补全预约和退房的边界逻辑。现在的预约功能相对简单,可以加上"预约到期未入住自动释放房间"的逻辑,用定时任务或者每次查询时顺带检查。退房时也可以加一个费用结算,根据入住时长和房价算总价。这些业务逻辑是面试时能聊的点。

第三个方向是代码结构重构。现在各模块的数据库连接可能是分散的,可以抽一个db_helper.py统一管理连接和游标,用上下文管理器保证连接释放。这样代码更规范,也方便后续换数据库。

验证改动是否生效,我一般会走一遍完整流程:登录 → 查房 → 入住 → 退房 → 查记录,每一步都确认数据库里的数据跟着变了。只看界面不查库,容易漏掉状态不同步的问题。

# 用上下文管理器管理数据库连接的示例 from contextlib import contextmanager @contextmanager def get_cursor(): conn = pymysql.connect(host='localhost', user='root', password='your_password', database='hotel_management', charset='utf8mb4') cursor = conn.cursor() try: yield cursor conn.commit() except Exception: conn.rollback() raise finally: cursor.close() conn.close() # 使用时就简洁很多 with get_cursor() as cur: cur.execute("SELECT * FROM room WHERE status='空闲'") rooms = cur.fetchall()

这样写的好处是连接一定会被关闭,异常时自动回滚,不用在每个函数里重复写try...finally。从那以后我每次改这类课设项目,都强制先把数据库连接层抽出来再动业务代码,不然改到后面连接泄漏、事务混乱,排查起来就是黑匣子。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 14:18:00

每日算法练习Day01:二分查找边界、归并排序分治与贪心找零实战

工作几年之后&#xff0c;我发现自己写业务代码越来越顺手&#xff0c;但一碰到需要“绕弯”的问题就开始卡壳。有时候明明知道该用哪个数据结构&#xff0c;却说不清为什么&#xff1b;刷题看题解能看懂&#xff0c;关上答案自己写却总是差一步。于是我做了一个决定——开一个…

作者头像 李华
网站建设 2026/9/25 14:17:57

虚拟机克隆避坑指南:从完整克隆到链接克隆的实操与收尾

虚拟机克隆这件事&#xff0c;看起来只是右键点一下"克隆"、下一步下一步就完事&#xff0c;但我见过太多人在这上面翻车——克隆出来的机器网卡起不来、IP 冲突把整个网段搞瘫、磁盘 UUID 撞车导致系统挂载错分区&#xff0c;甚至有人克隆完直接拿去别的电脑上跑&am…

作者头像 李华
网站建设 2026/9/25 14:17:54

SQL Server学生成绩管理系统实战:建库、建表、存储过程与避坑指南

简介&#xff1a;本资源是一份完整的数据库课程设计实践成果&#xff0c;面向计算机专业本科生及数据库初学者&#xff0c;聚焦学生课程成绩管理系统的全流程设计与实现。报告以SQL Server为数据库平台&#xff0c;系统覆盖功能需求分析、E-R概念建模、关系模式逻辑设计、索引与…

作者头像 李华
网站建设 2026/9/25 14:13:02

从大学生物联网竞赛看无线技术落地:Nordic方案选型与低功耗组网实战

1. 从一场大学生竞赛看无线技术如何真正落地全国大学生物联网设计竞赛这类赛事&#xff0c;圈外人看是学生拿板子搭Demo&#xff0c;圈内人看的是另一回事——它其实是无线技术从实验室走向真实场景的一次集中预演。2026年这届竞赛落幕之后&#xff0c;我翻了不少参赛队伍的方案…

作者头像 李华
网站建设 2026/9/25 14:11:37

Atlas 300V部署YOLO实战:从环境搭建到推理调优全攻略

第一次拿到Atlas 300V 24G这块卡的时候&#xff0c;我第一反应是&#xff1a;这货到底算不算“运算加速卡”&#xff1f;长得跟普通显卡很像&#xff0c;往服务器PCIe槽里一插&#xff0c;npu-smi info扫出来的是昇腾芯片而不是NVIDIA&#xff0c;散热风扇一转&#xff0c;说实…

作者头像 李华