拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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课设做 GUIPython 生态里最常被拿来比较的就是 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): cant 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/simplePyQt5是运行时库程序跑起来靠它。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( hostlocalhost, # 数据库地址本机就是 localhost port3306, # MySQL 默认端口 userroot, # 用户名 passwordyour_password, # 改成你自己的密码 databasehotel_management, # 数据库名和 SQL 脚本里一致 charsetutf8mb4 # 字符集防止中文乱码 )charsetutf8mb4这个参数别省酒店系统里客户姓名、备注这些字段有中文用utf8在某些场景下会出问题。port默认 3306如果你装 MySQL 时改过端口这里要同步改。配置改完运行Main.pypython 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_typeNone, 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 ecommit()和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 0cursor.rowcount返回受影响行数为 0 就说明没删掉可以据此给用户提示。客户管理类似重点是入住记录的关联查询为后续数据分析留数据。5. 避坑与常见问题排查5.1 PyQt5 安装报错或导入失败现象pip install PyQt5卡住不动或者装完import PyQt5报DLL load failed。原因一是网络问题导致下载中断二是 Python 版本和 PyQt5 版本不匹配三是 Windows 上缺少 VC 运行库。解决换国内镜像源重装指定版本pip install PyQt55.15.4Windows 上装一下 VC Redistributable。如果还不行用 conda 装conda install pyqt通常更省心。5.2 MySQL 连接报 2002 或 1045 错误现象运行程序报error 2002 (hy000): cant connect to local MySQL server或者Access denied for user rootlocalhost。原因2002 是 MySQL 服务没启动或者 socket 路径不对。1045 是密码错误或用户权限问题。解决2002 先检查服务Windows 在服务管理器里启动 MySQLLinux 用systemctl start mysql。1045 确认密码必要时用ALTER USER rootlocalhost IDENTIFIED BY new_password;重置。8.0 版本还要注意认证插件问题可以改成mysql_native_password。5.3 中文乱码问题现象界面显示正常但数据库里存的中文变成问号或乱码。原因数据库、表、连接三处的字符集不一致。解决建库时用CHARACTER SET utf8mb4连接时加charsetutf8mb4Python 文件本身保存为 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(hostlocalhost, userroot, passwordyour_password, databasehotel_management, charsetutf8mb4) 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。从那以后我每次改这类课设项目都强制先把数据库连接层抽出来再动业务代码不然改到后面连接泄漏、事务混乱排查起来就是黑匣子。希望帮到你。本文还有配套的精品资源点击获取
返回列表