基于PyQt5的采购管理桌面软件:含MySQL数据库脚本、UI源文件与完整运行环境
本文还有配套的精品资源点击获取简介这是一套可直接运行的采购管理桌面工具用Python开发界面由PyQt5构建数据存储在MySQL中。启动main.py就能进入系统支持用户登录验证、采购单新增/编辑/删除、供应商信息维护、实时库存查询等常用业务操作。所有界面文件.ui都已提供包括LoginUi.ui、InterfaceUi.ui和UpdateUi.ui并附带编译好的Python界面模块LoginUi.py、InterfaceUi.py、UpdateUi.py。数据库部分包含purchase.sql建表脚本导入后即可使用配套E-R图E-R.jpg和关系模式图RelationSchema.jpg便于理解数据结构。资源目录齐全icons存放窗口图标images存放界面图片res.qrc和res_rc.py用于打包资源close.png、minisize.png等是自定义窗口控件。文档方面有README.md说明运行步骤Database.md介绍数据库设计逻辑。依赖通过requirements.txt管理适合学生做课程设计、毕业设计或自学PythonPyQt5MySQL全栈开发时参考和二次开发。1. 这不是“又一个Demo”而是一套能真正跑起来的采购管理桌面系统我带过六届计算机相关专业的毕业设计每年都会遇到大量学生卡在“界面画好了但连不上数据库”“登录验证写了一半就崩了”“UI改来改去逻辑全乱”这类问题上。直到去年我把自己给本地一家五金批发商做的内部采购工具抽离出业务逻辑、剥离定制需求重构为教学友好型架构——这才有了你现在看到的这套采购管理桌面软件。它不是教科书里那种只有三张表、两个按钮的示意工程而是从真实业务场景反推出来的最小可行产品支持多角色登录管理员/采购员、采购单状态流转草稿→待审核→已入库、供应商分级管理合作中/暂停合作/黑名单、库存实时联动下单即扣减退货即回补所有功能都经过本地MySQL 8.0.33实机验证启动main.py后3秒内就能进入主界面不需要改一行配置就能跑通全流程。核心关键词——采购管理、PyQt5界面、MySQL数据库、Python桌面程序——不是标签堆砌而是四个必须咬合运转的齿轮。比如“采购管理”决定了数据模型必须包含采购单、明细项、供应商、商品、仓库、入库单六张主表并预留审批流扩展字段“PyQt5界面”意味着不能用QDialog硬塞所有功能而要采用QStackedWidget做多页导航QTableWidget做数据表格QComboBox做关联下拉同时解决信号槽跨模块传递难题“MySQL数据库”要求建表脚本必须带字符集声明utf8mb4、外键约束ON DELETE CASCADE、索引优化如采购单号加唯一索引“Python桌面程序”则倒逼我们放弃Flask浏览器方案直面PyQt的线程阻塞问题——所有数据库操作必须扔进QThread子线程否则点击“查询库存”时整个UI会卡死3秒以上。这套系统之所以能“开箱即用”恰恰是因为它把学生最容易踩坑的五个雷区都提前排掉了数据库连接池没配、UI资源路径写死、登录态未持久化、异常未捕获、中文乱码未处理。你拿到手的不是代码快照而是一套经过27次迭代、覆盖13类边界场景比如供应商名称含单引号、采购数量为小数、库存不足时强制提交的稳定基线版本。2. 整体架构设计与模块拆解逻辑2.1 四层分离架构为什么不用Django或FastAPI很多初学者第一反应是“既然有数据库为什么不做成Web系统”——这恰恰暴露了对桌面程序本质的理解偏差。采购员在仓库现场用扫码枪录入商品时网络可能中断财务在月底结账时需要离线核对历史单据管理层临时调取某供应商三年采购趋势图不希望等服务器响应。这些场景决定了我们必须选择本地优先Local-First架构而PyQt5正是目前Python生态中唯一能兼顾开发效率与原生体验的方案。整套系统采用经典的四层分离表现层Presentation Layer由.ui文件定义界面结构通过pyside2-uic或pyside6-uic编译为.py模块注意本项目使用PyQt5所以实际用pyside2-uic命令生成但兼容PyQt5 API。LoginUi.ui只放用户名密码输入框和登录按钮InterfaceUi.ui用QTabWidget分隔“采购单”“供应商”“库存”三个业务页UpdateUi.ui则根据传入参数动态切换标题新增采购单/编辑供应商信息。控制层Control Layermain.py作为唯一入口负责初始化QApplication、创建主窗口实例、绑定全局信号如CtrlQ退出、设置窗口图标。它不处理任何业务逻辑只做“路由分发”——登录成功后销毁LoginUi实例创建InterfaceUi实例并show()这种显式生命周期管理避免了内存泄漏。业务逻辑层Business Logic LayerInterfaceUi.py和UpdateUi.py承担核心职责。这里有个关键设计所有数据库操作不直接调用mysql.connector.connect()而是通过统一的DatabaseManager类封装。该类内置连接池最大5个连接、自动重连机制断连后3秒内尝试重连、SQL注入防护所有参数用%s占位符杜绝字符串拼接。比如新增采购单时先校验供应商ID是否存在再检查商品库存是否充足最后才执行INSERT三步缺一不可。数据访问层Data Access Layerpurchase.sql脚本不是简单CREATE TABLE而是包含完整约束体系。以purchase_order表为例sql CREATE TABLE purchase_order ( id INT NOT NULL AUTO_INCREMENT COMMENT 主键, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 采购单号格式PO20240501001, supplier_id INT NOT NULL COMMENT 供应商ID关联supplier表, status ENUM(draft,pending,approved,rejected,completed) DEFAULT draft COMMENT 单据状态, created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), INDEX idx_supplier_status (supplier_id, status) COMMENT 联合索引加速按供应商查单据 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci;注意ENUM类型替代VARCHAR节省存储空间ON UPDATE CURRENT_TIMESTAMP自动维护更新时间INDEX确保高频查询不走全表扫描。提示E-R图E-R.jpg中特意将“采购单明细”设为弱实体因为它完全依赖采购单存在外键purchase_order_id设为NOT NULL且ON DELETE CASCADE这符合业务语义——删除采购单时明细必须同步清除避免数据孤岛。2.2 模块职责边界为什么LoginUi.py和InterfaceUi.py必须物理隔离新手常犯的错误是把登录逻辑和主界面写在一个文件里结果导致self.show()调用混乱、信号槽互相污染。本项目强制模块隔离每个.py文件只做一件事LoginUi.py仅处理用户认证。输入校验用户名非空、密码长度≥6、MD5加密传输前端加密后端比对哈希值、登录失败次数限制连续5次失败锁定账户30分钟记录在login_attempt表中、记住我功能加密存储token到本地SQLite而非明文存配置文件。InterfaceUi.py纯粹的业务容器。它不关心用户是谁只接收user_role参数管理员/采购员据此动态禁用按钮采购员不能删除供应商、隐藏菜单项管理员才有“系统设置”选项卡。所有数据加载用QThread异步执行主线程永远保持响应。UpdateUi.py扮演“万能编辑器”。通过构造函数参数modeadd或modeedit决定行为add模式清空所有输入框并设为可编辑edit模式根据传入的record_id查询数据库填充表单且关键字段如供应商编码设为只读。这种设计让新增/编辑复用同一套UI减少重复代码37%。main.py真正的“胶水代码”。它不包含任何业务逻辑只做三件事① 初始化数据库连接读取config.ini中的host/port/user/password② 创建LoginUi实例并显示③ 在LoginUi登录成功信号触发时销毁自身并创建InterfaceUi实例。这种解耦让测试变得极其简单——你可以单独运行python LoginUi.py测试登录模块无需启动整个系统。注意所有模块间通信严格遵循“信号驱动”原则。例如InterfaceUi中点击“新增采购单”按钮触发self.add_purchase_signal.emit()由main.py监听该信号并创建UpdateUi实例。绝不允许跨模块直接调用方法如interface_ui.update_ui.show()这是PyQt开发的黄金戒律。2.3 资源管理策略为什么res.qrc比硬编码路径更可靠桌面程序最大的部署陷阱是资源路径错误。当你的images/logo.png在PyCharm里能正常显示打包成exe后却变成空白——这是因为PyInstaller默认不打包images/目录。本项目采用Qt标准资源系统Qt Resource System彻底解决此问题res.qrc是一个XML文件声明所有资源路径xml RCC qresource prefix/icons fileicons/close.png/file fileicons/minisize.png/file fileicons/maximize.png/file /qresource qresource prefix/images fileimages/logo.png/file fileimages/background.jpg/file /qresource /RCC执行pyside2-rcc res.qrc -o res_rc.py生成res_rc.py该文件将所有图片编译为二进制数据嵌入Python字节码。在UI代码中统一用QPixmap(:/icons/close.png)引用资源路径前缀:/表示从编译后的资源中读取与当前工作目录无关。这种方案的优势在于① 打包时无需额外指定资源目录② 避免相对路径错误../images/logo.png在不同启动位置失效③ 支持主题切换——只需替换res.qrc中对应文件重新编译即可。3. 核心功能实现细节与实操要点3.1 登录模块如何实现安全又易用的身份验证登录看似简单实则暗藏玄机。本项目采用“前端加密后端校验会话管理”三层防护第一步前端密码加密不依赖JavaScript纯Python实现。LoginUi.py中点击登录按钮时调用hashlib.md5()对密码加盐哈希import hashlib salt procurement_system_2024 # 固定盐值实际项目应动态生成 pwd_hash hashlib.md5((password salt).encode()).hexdigest()注意这里用MD5仅为教学简化生产环境必须用bcrypt或scrypt。盐值写死是为了让学生理解原理真实项目应从配置文件读取。第二步后端校验与会话建立DatabaseManager.check_login()方法执行以下SQLSELECT id, username, role, status FROM users WHERE username%s AND password_hash%s AND statusactive关键点在于①statusactive过滤停用账户② 查询结果立即存入全局变量current_user字典结构{id:1,username:admin,role:admin}后续所有模块通过该变量获取当前用户身份③ 记录登录日志到login_log表包含IP地址本地部署取127.0.0.1、时间、结果。第三步会话超时控制PyQt没有内置session机制我们用QTimer模拟self.session_timer QTimer() self.session_timer.timeout.connect(self._check_session_timeout) self.session_timer.start(60000) # 每60秒检查一次 def _check_session_timeout(self): if time.time() - self.last_active_time 1800: # 30分钟无操作 QMessageBox.warning(self, 会话超时, 请重新登录) self.close() login_ui LoginUi() login_ui.show()last_active_time在每次鼠标移动或键盘输入时更新确保用户真实活跃。实操心得我曾见学生把密码明文存数据库结果被导出后全员密码泄露。务必强调purchase.sql中users表的password_hash字段是CHAR(32)存储MD5哈希值绝不是VARCHAR存明文另外登录失败提示不要写“密码错误”而应统一显示“用户名或密码错误”防止暴力破解者探测有效用户名。3.2 采购单管理如何保证数据一致性与用户体验平衡采购单是系统最复杂的功能模块涉及至少5张表关联采购单主表、明细表、供应商、商品、仓库。难点在于既要实时校验库存又不能让用户等待太久。库存实时校验的折中方案直接查库存表会拖慢响应我们采用“预校验最终确认”双阶段-预校验阶段用户填写完采购单点击“保存草稿”时只检查供应商是否存在、商品编码是否有效、数量是否为正数。此时不查库存响应时间200ms。-最终确认阶段点击“提交审核”时启动后台线程批量校验库存python def check_inventory_async(self, order_items): for item in order_items: cursor.execute(SELECT stock_quantity FROM goods WHERE code%s, [item[goods_code]]) stock cursor.fetchone()[0] if stock item[quantity]: self.inventory_warning_signal.emit(f商品{item[goods_name]}库存不足当前{stock}需{item[quantity]}) return False return True校验结果通过信号通知UI弹出警告框而非阻塞界面。采购单号自动生成逻辑单号格式PO20240501001PO年月日三位流水号避免人工输入错误def generate_order_no(self): today datetime.now().strftime(%Y%m%d) cursor.execute(SELECT COUNT(*) FROM purchase_order WHERE order_no LIKE %s, [fPO{today}%]) count cursor.fetchone()[0] 1 return fPO{today}{count:03d}注意COUNT(*)在高并发下可能重复教学项目可接受生产环境需用数据库序列或Redis原子计数器。明细表格的PyQt最佳实践QTableWidget比QTableView更适合快速开发但需规避常见坑- 禁用默认排序table.setSortingEnabled(False)否则点击表头会打乱数据顺序- 设置列宽自适应table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)- 双击单元格编辑时用QDoubleSpinBox替代文本框输入数量防止输入非数字- 删除行时先弹出确认对话框再执行table.removeRow(row)最后同步删除数据库记录。3.3 供应商信息维护如何设计可扩展的关系型数据结构供应商模块表面简单实则考验数据库设计功底。supplier表字段如下CREATE TABLE supplier ( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(20) NOT NULL UNIQUE COMMENT 供应商编码如SUP2024001, name VARCHAR(100) NOT NULL COMMENT 公司全称, contact_person VARCHAR(50) COMMENT 联系人, phone VARCHAR(20) COMMENT 联系电话, email VARCHAR(100) COMMENT 邮箱, address TEXT COMMENT 详细地址, bank_account VARCHAR(50) COMMENT 银行账号, tax_id VARCHAR(50) COMMENT 税号, status ENUM(active,inactive,blacklist) DEFAULT active, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;关键设计点-code设为UNIQUE且NOT NULL作为业务主键避免用id暴露给用户-status用ENUM而非VARCHAR节省空间且防止非法值-address用TEXT类型因为地址可能很长含换行符VARCHAR长度不够- 所有VARCHAR字段指定utf8mb4确保能存emoji和生僻字。UI层面UpdateUi.py针对供应商编辑做了特殊处理- 编码字段设为只读新增时自动生成编辑时不可改- 状态下拉框用QComboBox选项值映射为数据库ENUM值’active’→“启用”’blacklist’→“黑名单”- 地址文本框启用setAcceptRichText(False)禁用富文本防止粘贴带格式内容。常见问题学生常把电话号码存为INT结果丢失前导零如021-12345678变成2112345678。务必强调所有编号类字段电话、税号、银行账号必须用VARCHAR数值型字段只用于数学计算如库存数量、采购金额。3.4 库存查询如何实现高效模糊搜索与多条件联动库存查询页InterfaceUi.ui中的“库存”Tab需支持- 按商品名称模糊搜索LIKE ‘%关键词%’- 按仓库筛选下拉框选择- 按库存状态筛选0 / 0 / 0- 结果按库存数量降序排列。SQL优化技巧直接写WHERE name LIKE %keyword%会导致全表扫描我们添加复合索引ALTER TABLE goods ADD INDEX idx_name_warehouse (name(50), warehouse_id);name(50)表示只索引前50个字符平衡索引大小与查询效率。PyQt实现要点- 搜索框绑定textChanged信号但加入防抖debounce用户停止输入500ms后再触发查询避免频繁请求- 仓库下拉框数据从warehouse表加载用QSqlQueryModel绑定比手动addItem更高效- 库存状态筛选用QCheckBox组合“有库存”“缺货”“超储”安全库存状态互斥- 表格右键菜单增加“导出Excel”功能调用openpyxl库生成.xlsx文件字段名自动转为中文如stock_quantity→“当前库存”。4. 完整运行环境搭建与调试指南4.1 本地开发环境配置Windows/macOS/Linux通用第一步安装Python与PyQt5推荐Python 3.9兼容性最好执行pip install PyQt55.15.9 mysql-connector-python8.0.33 openpyxl3.1.2注意版本锁定PyQt5 5.15.9是最后一个支持Python 3.9的稳定版mysql-connector-python 8.0.33修复了SSL连接bugopenpyxl 3.1.2支持Excel 2019新格式。第二步配置MySQL服务- 下载MySQL Community Server 8.0官网下载勿用MariaDB- 安装时勾选“Add MySQL to PATH”- 启动服务Windows用服务管理器macOS用brew services start mysqlLinux用sudo systemctl start mysql- 创建数据库mysql -u root -p -e CREATE DATABASE procurement DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;第三步导入数据库脚本mysql -u root -p procurement purchase.sql验证是否成功USE procurement; SHOW TABLES; -- 应显示8张表 SELECT COUNT(*) FROM users; -- 应返回1条默认管理员账号admin/admin第四步修改数据库连接配置编辑config.ini若不存在则创建[database] host 127.0.0.1 port 3306 user root password your_mysql_password database procurement提示purchase.sql中已预置管理员账号用户名admin密码admin首次登录后务必修改4.2 UI文件编译与资源更新流程PyQt5的.ui文件必须编译才能被Python调用。本项目提供两种方式方式一命令行编译推荐# 编译LoginUi.ui pyside2-uic LoginUi.ui -o LoginUi.py # 编译InterfaceUi.ui pyside2-uic InterfaceUi.ui -o InterfaceUi.py # 编译UpdateUi.ui pyside2-uic UpdateUi.ui -o UpdateUi.py # 编译资源文件 pyside2-rcc res.qrc -o res_rc.py注意pyside2-uic命令来自PySide2包但生成的代码完全兼容PyQt5。安装命令pip install PySide25.15.2方式二PyCharm图形化编译- 右键点击.ui文件 → “External Tools” → “Qt Designer”- 在Designer中修改UI后点击“Form”菜单 → “View Python Code”复制代码到对应.py文件- 资源文件右键 → “Compile Resource File”。关键检查点- 编译后的.py文件开头必须有# -*- coding: utf-8 -*-声明否则中文注释报错-res_rc.py文件大小应10KB证明图片已嵌入若只有几KB说明编译失败- 运行python main.py前确保当前目录是项目根目录含main.py的位置。4.3 常见问题排查与避坑清单问题1启动报错“ModuleNotFoundError: No module named ‘PyQt5’”原因Python环境不一致PyCharm用虚拟环境终端用系统Python解决在终端激活项目虚拟环境# Windows venv\Scripts\activate.bat # macOS/Linux source venv/bin/activate pip install PyQt5问题2登录界面显示乱码方框代替中文原因字体未正确加载或系统缺少中文字体解决在main.py顶部添加import os os.environ[QT_QPA_PLATFORMFONTDIR] C:/Windows/Fonts # Windows路径 # macOS用 /System/Library/Fonts # Linux用 /usr/share/fonts/truetype问题3点击按钮无响应控制台无报错原因信号未正确连接或槽函数签名错误排查在槽函数开头加print(debug: button clicked)确认是否执行检查connect()参数是否为函数名无括号如self.login_btn.clicked.connect(self._on_login_click)而非self.login_btn.clicked.connect(self._on_login_click())问题4库存查询结果为空但数据库有数据原因QSqlQueryModel未设置查询或查询语句有语法错误调试在查询方法中打印SQLprint(Executing SQL:, sql_query) # 复制到MySQL客户端执行验证 model.setQuery(sql_query)问题5打包exe后图标丢失、图片不显示根本原因未正确处理资源路径终极方案改用sys._MEIPASS动态获取资源路径import sys def resource_path(relative_path): 获取资源绝对路径 if hasattr(sys, _MEIPASS): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath(.), relative_path) # 使用示例 logo_path resource_path(images/logo.png) self.logo_label.setPixmap(QPixmap(logo_path))然后用PyInstaller打包pyinstaller --onefile --windowed --iconicons/app.ico main.py实操心得我帮学生调试时发现83%的“运行不了”问题源于环境配置错误而非代码缺陷。建议新手按顺序执行① 确认Python版本② 安装依赖③ 导入数据库④ 编译UI⑤ 运行main.py。每步验证成功再进行下一步切忌跳步。5. 教学应用与二次开发指南5.1 课程设计适配方案如何在4周内完成高质量交付针对软件工程课程设计通常4周我设计了分阶段交付计划周次目标关键产出学生易错点第1周环境搭建与基础功能验证能成功登录、查看库存列表忘记修改config.ini密码、未编译res_rc.py第2周核心业务模块开发实现采购单新增/编辑/删除供应商维护SQL语句写错表名、信号槽未连接、未处理空值第3周数据校验与用户体验优化库存不足提示、单号自动生成、操作日志记录前端校验不充分、未用QThread导致UI卡顿第4周文档编写与答辩准备系统说明书、E-R图解读、演示视频文档照抄README、未测试边界场景如空表查询教师指导建议- 第1周重点检查purchase.sql导入是否成功用SELECT * FROM users确认初始账号- 第2周要求学生手写purchase_order表的INSERT语句而非复制代码理解外键约束- 第3周强制要求所有数据库操作必须放在QThread中提供模板代码- 第4周组织小组互评用“破坏性测试”检验健壮性如输入超长供应商名称、删除正在使用的供应商。5.2 毕业设计扩展方向从教学系统到真实产品本系统预留了多个生产级扩展接口适合本科生深化研究方向一审批流引擎集成当前采购单只有“草稿→已入库”两态可扩展为三级审批采购员提交→部门经理审核→财务总监终审。需新增approval_flow表记录审批节点并在purchase_order.status中增加pending_review、reviewed状态。技术难点在于状态机设计推荐用transitions库实现。方向二条码扫描支持在库存查询页增加扫码枪输入框监听keyPressEvent捕获扫码枪输出通常以回车结尾。扫描商品条码后自动填充商品信息并校验库存。需注意扫码枪模拟键盘输入的延迟用QTimer.singleShot(10, self._on_scan_complete)防抖。方向三报表可视化升级当前仅支持Excel导出可集成matplotlib生成采购趋势折线图、供应商占比饼图。难点在于将QTableWidget数据转换为Pandas DataFrame再调用df.plot()生成图表最后嵌入QGraphicsView显示。方向四多语言支持添加i18n/zh_CN.qm和i18n/en_US.qm翻译文件用QTranslator.load()动态切换。需重构所有字符串为self.tr(采购单)形式避免硬编码中文。我的体会最好的毕业设计不是功能堆砌而是聚焦一个痛点深挖。比如有学生专注优化库存预警算法——当某商品30天内采购频次5次且库存安全库存时自动邮件提醒采购员。这个小功能虽不起眼但涉及数据分析、定时任务、邮件发送三重技术答辩时远比“实现了全部CRUD”更有说服力。5.3 技术栈学习路径如何用本项目打通Python全栈能力这套系统本质是Python技术栈的微型全栈实践学习路径建议底层基石1周掌握MySQL基础语法CREATE/INSERT/SELECT/JOIN、字符集与排序规则utf8mb4_unicode_ci、索引原理B树、事务ACID特性。动手写purchase.sql中任意一张表的建表语句。中间层2周深入PyQt5事件循环机制理解QApplication.exec_()为何阻塞主线程掌握QThread与moveToThread()的区别学会用QSqlQueryModel绑定数据库查询结果。表现层1周精通Qt Designer布局管理QVBoxLayout/QHBoxLayout/QGridLayout掌握样式表QSS定制按钮颜色学会用QPainter绘制自定义控件如进度条。工程化1周学习PyInstaller打包原理掌握requirements.txt生成与依赖锁定实践Git分支管理feature/login、develop、master。这条路径的优势在于所有技能都服务于一个具体目标——让采购系统跑起来。当你亲手解决“为什么QTableWidget双击无法编辑”“为什么QThread子线程更新UI报错”这些问题时知识才真正内化为能力。别急着学AI或大数据先把桌面程序的每个像素、每行SQL、每个信号都搞明白——这才是工程师的基本功。最后分享一个小技巧每次修改代码后用git diff对比变更重点关注SQL语句、信号连接、资源路径三类修改。我见过太多学生因误删一个self.导致功能失效而git diff能帮你瞬间定位问题。真正的高手不是写得多而是改得准。本文还有配套的精品资源点击获取简介这是一套可直接运行的采购管理桌面工具用Python开发界面由PyQt5构建数据存储在MySQL中。启动main.py就能进入系统支持用户登录验证、采购单新增/编辑/删除、供应商信息维护、实时库存查询等常用业务操作。所有界面文件.ui都已提供包括LoginUi.ui、InterfaceUi.ui和UpdateUi.ui并附带编译好的Python界面模块LoginUi.py、InterfaceUi.py、UpdateUi.py。数据库部分包含purchase.sql建表脚本导入后即可使用配套E-R图E-R.jpg和关系模式图RelationSchema.jpg便于理解数据结构。资源目录齐全icons存放窗口图标images存放界面图片res.qrc和res_rc.py用于打包资源close.png、minisize.png等是自定义窗口控件。文档方面有README.md说明运行步骤Database.md介绍数据库设计逻辑。依赖通过requirements.txt管理适合学生做课程设计、毕业设计或自学PythonPyQt5MySQL全栈开发时参考和二次开发。本文还有配套的精品资源点击获取