基于Python+MySQL编写的(WinForm)图书管理系统
一、项目需求分析
1.1 项目介绍
项目背景
图书馆管理系统是一些单位不可缺少的部分,书籍是人类不可缺少的精神食粮,尤其对于学校来说,尤其重要。所以图书馆管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理图书、期刊、试卷合订本等,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书资源信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书馆管理的效率,也是学校的科学化、正规化管理的必经之路。
项目简介
本项目是图书管理信息系统,使得学院的图书信息管理工作能够系统化,规范化,自动化,从而达到提高学院图书管理效率的目的。我们的系统主要是有学生和管理员进行使用,二人登录系统的角色不同,因而部分功能也不一样。我们的前台部分主要是使用pyqt5来进行设计和布局,使用pycharm中的Qt Designer进行绘制,然后使用pyqt5和qss文件来编写窗口的样式;我们的后台逻辑和数据的处理是使用python结合mysql数据库以及线程的使用来进行处理,最后得到我们的NCU图书管理系统的1.0版本。
1.2 功能需求
我们对图书管理系统进行分析,我们认为我们需要给用户进行书籍推荐和系统公告的展示,同时需要维护借阅信息和图书信息,同时应该提供给用户和管理员之间的交流,便于系统的升级和维护。然而本系统对于管理员和普通用户的使用,功能应该是不同的,于是我们对于不同角色的功能需求分析如下:
普通用户:
- 注册、登录系统
- 查看系统推荐书籍、查看系统公告
- 借书、还书、续借、查找书籍
- 发送消息给管理员
- 系统帮助与关于
管理员:
- 注册、登录系统
- 设置系统推荐书目、发布公告
- 添加书籍、编辑已有书籍、删除书籍、查找书籍、催用户还书
- 筛选未回复消息、回复普通用户的消息、删除消息
- 系统帮助与关于
二、项目分析与设计
2.1 本项目需解决的关键技术问题
- Qt Designer的使用
- Qt 绘制的窗口的美化,即qss文件的编写使得页面美观
- 使用爬虫爬取豆瓣图书时爬虫与反爬虫之间的斗争
- 交互时信号与槽的连接
- 交互时,mysql数据库的操作
- 线程的使用,使得当小窗口对数据库操作之后,主线程能够监听到这种变化,及时更新界面的信息
- 程序健壮性的体现,使用正则表达式对一些输入进行限制,以及一些常见的提示信息
2.2 项目流程

2.3 功能模块
本项目主要分为注册登录、主页、借阅信息、图书管理、反馈交流、关于等模块。

三、项目设计与实现
3.1 项目设计
登录页面:
设计意图和主要功能是验证登录者身份,运用了md5加密、数据库查询。
数据库查询(可以看到将密码加密后与数据库中对比):

页面展示:

注册页面:
设计意图:便于用户注册账号与返回登录,同时输入密码后要再确认一遍密码。
主要功能:注册账号,也是通过数据库连接实现。
页面展示:

借阅信息:
设计意图:最上面是登录用户及角色、登出按钮,接着是搜索框可供管理员搜索筛选数据,下面则是数据表,数据表中右键点击会显示菜单(管理员有“催还”、“删除”;用户有“续借”、“还书”),同时状态有“已还”、“未还”、“逾期”3种,分别呈现不同的颜色。
主要功能:显示借阅信息、管理员催还、用户续借与还书等。
关键知识点:信号与槽、线程、数据库查询、正则表达式匹配等。
页面展示:

点击“删除”:
出现提示框,提示用户是否进行删除操作。

用户视角下:
点击“续借”:
可以延长应还日期。

点击“还书”:
跳出提示框,提示用户是否继续。

反馈交流:
设计意图:具备搜索框搜索某用户发出的消息,还可直接点击“筛选未回复”按钮筛选出未回复的消息,下方是数据表,管理员可以删除、回复;用户只能看见自己的消息,可以删除。
关键知识点:信号与槽、线程、数据库查询、正则表达式匹配等
主要功能:用户与管理员之间的消息交互、消息展示查询等

点击“回复”:
出现回复窗口,可在此编辑信息:

用户视角可以直接发送消息给管理员:

3.2 项目实现
本项目从文件结构上划分为如下模块:

Ui中是使用Qt Designer设计的页面,使用插件转化为python代码,util中是一些工具类如数据库连接帮助类、爬虫、通用工具类等。
而view中则是连接视图与数据的中间层,不仅可以根据数据设置视图的页面显示,同时又通过视图来与用户进行交互,得到反馈去通过数据库帮助类操作数据库。
1.整体使用信号与槽的机制,启动程序后,进入事件处理的主循环,每个页面的组件通过信号控制执行某些操作。如下:

当信号发出时,将执行对应的函数。
2.对于众多数据库的表来说,几乎每个表都需要一个不重复的主键,因此使用主机ID、序列号、和当前时间来生成UUID、可保证其唯一性。

3.使用正则表达式匹配器绑定到控件上,这样可以在用户输入阶段进行限制,而不必在输入后再对文本进行判断再执行别的操作。下面是封装的控件匹配器:

这是使用:
![]()
从功能结构上则划分为借阅信息、反馈交流、登陆注册(我负责的模块)。
在这几个模块中,都伴随着数据库连接,且都是封装在函数中进行,再通过线程执行:
4.数据库操作
新建线程


该函数获取了数据库的数据,再调用别的函数对数据进行处理整合,完成后会发出信号通知主线程,这时会调用函数将其显示在页面上。
5.UI的初始化
对于设计好的UI文件,我们建立同名文件,定义该窗口类,将该UI文件设置为本类的UI,再针对其UI文件内的控件进行初始化、美化、功能实现等。

6.菜单的添加:
在TableWidget中还可以添加右键点击出现的菜单,如下:

当点击了该菜单中的菜单项时,会触发相应的动作,执行对应的操作,一般是数据库操作。如下:

有时候会需要从一个页面跳转到另一个页面,比如从登录跳转到注册或者主页面,可以直接New,当需要在两窗口间传递函数时,通过构造函数的参数传递或者单向传递直接赋值皆可。

如果需要保留原来的窗口,则需要有原来窗口的对象:


由于模块之间结构相似,只在具体的操作行为上有所不同,以上所述已经覆盖主要模块的工作原理和实现代码。
四、个人小结
本次项目小巧精致,简洁方便,是对我学习Python的一次很好的锻炼,一开始看了些目标检测相关的内容,但后来发现仍然无法胜任,因此还是选择了信息管理系统这个选题。但只使用控制台显示过于简陋,因此和队友商量用来PyQt5,正好之前也接触过Qt,稍微复习一下倒是很好上手。
开发中体会到Git版本控制功能的强大与方便,但我在配置两人协作的过程中仍然遇到很多困难,比如我已加入协作者,也配置了SSH Key,但队友却无法直接Push她的代码,这让我只得作罢,投入到代码编写中。
在代码编写中,我与队友经常一起相互交流,这敲定了我们UI文件的布局与数据库表的设计,在分工后各自编写相应的功能。我倒没有遇到过多的困难,可以说近乎一气呵成地写完了,但在后来发现一些小错误,又一一耐心修正。
我想感叹的是,Python确实非常方便,代码量相比其他语言会少许多,而它能做的事也很多,没有给这个图书管理系统加上更多的功能,是一种遗憾。它再进一步优化,可以增加用户之间的交流、管理员对用户账号的操作,用户对所借书籍发表的评论等等,甚至可以加上刷脸登录。总之,它的进步空间还很大,而我们的学习之路也还很长。
相关文章:
基于Python+MySQL编写的(WinForm)图书管理系统
一、项目需求分析 1.1 项目介绍 项目背景 图书馆管理系统是一些单位不可缺少的部分,书籍是人类不可缺少的精神食粮,尤其对于学校来说,尤其重要。所以图书馆管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管…...
[贪心算法] 摆动序列
1.解析 这里我们的贪心体现在,这里我们只需要找到每一个拐点位置的数字即可, 证明: 当我们在A点时,我们下一步的选择有四种 A到D这个线段内的数字(不包括D)选择D点D到F的点F之后的点 对于A到D来说…...
WPF未来展望:紧跟技术发展趋势,探索新的可能性
WPF未来展望:紧跟技术发展趋势,探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…...
低空经济腾飞:无人机送货、空中通勤,未来已来
近年来,低空经济逐渐成为社会关注的焦点。从无人机送货到“空中的士”,再到飞行培训的火热进行,低空经济正迎来前所未有的发展机遇。随着技术进步和政策支持,这一曾经看似遥远的未来场景,正逐步变为现实。 低空经济如何…...
http proxy的原理是什么
Http代理的原理 代理服务器会自动提取请求数据包中的HTTP请求数据发送给服务端,并将服务端的HTTP响应数据转发给发送请求的客户端,HTTP代理服务器使用的端口通常是8080。 对于Web客户端来说,代理扮演的服务器角色,接收请求&…...
Redis--补充类型
目录 一、引言 二、补充类型 1.streams 2.geospatial 3.hyperloglog 4.bitmap 5.bitfields 三、总结 一、引言 在简单学习了redis中的5个数据类型(string,list,hash,set,zset)之后,本篇文…...
关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南
以下是关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南,以问答格式呈现,并将涉及命令操作的部分使用代码块按执行顺序和步骤形式展示: Q1:如何修改 Ollama 及其模型的默认路径&…...
QT编译器mingw与msvc区别及环境配置
一.QT编译器mingw与msvc主要区别 二.QT开发环境配置 1. MinGW 配置 安装步骤: 通过 Qt 官方安装器 安装时勾选 MinGW 组件(如 Qt 6.7.0 MinGW 64-bit)。 确保系统环境变量包含 MinGW 的 bin 目录(如 C:\Qt\Tools\mingw1120_64…...
【css酷炫效果】纯CSS实现进度条加载动画
【css酷炫效果】纯CSS实现进度条加载动画 缘创作背景html结构css样式完整代码基础版进阶版 效果图 通过CSS渐变与背景位移动画,无需JavaScript即可创建流体动态进度条。 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u…...
Feedback-Guided Autonomous Driving
Feedback-Guided Autonomous Driving idea 问题设定:基于 CARLA 的目标驱动导航任务,通过知识蒸馏,利用特权智能体的丰富监督信息训练学生传感器运动策略函数 基于 LLM 的端到端驱动模型:采用 LLaVA 架构并添加航点预测头&#…...
图解AUTOSAR_CP_WatchdogDriver
AUTOSAR WatchdogDriver模块详解 AUTOSAR MCAL层看门狗驱动模块详细解析 目录 1. 模块概述2. 架构位置 2.1. 组件架构 3. 主要功能4. API接口5. 配置参数 5.1. 配置模型 6. 错误代码7. 状态管理 7.1. 状态机 8. 处理流程 8.1. 活动流程 9. 操作序列 9.1. 典型操作序列 10. 硬件…...
大数据学习(65)- Hue详解
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Maven 的核心包
由于前端项目不是核心,阅读 nexus-public 源代码似乎绕远路了。nexus-oss 社区版主要就是集成 maven 的上传包、认证、包解析、包存储这几个核心功能,前端实现重新可以使用新的现代前端工具来提高生产力。故重新疏理一下 maven 的核心机制,即…...
C语言学习笔记(第三部份)
说明:由于所有内容放在一个md文件中会非常卡顿,本文件将接续C_1.md文件的第三部分 整型存储和大小端 引例: int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…...
C语言经典代码题
1.输入一个4位数:输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个4位数:");scanf("%d",&a);printf("个位:%d\n"…...
深入理解蒸馏、Function Call、React、Prompt 与 Agent
AI基础概念与实操 一、什么是蒸馏二、如何理解Function Call、React、Prompt与Agent(一)Function Call与Agent(二)Agent中的React概念(三)Prompt与Agent的关联 实操演练function callprompt 一、什么是蒸馏…...
CVPR2025自动驾驶端到端前沿论文汇总
自动驾驶 文章目录 自动驾驶前言自动驾驶的轨迹预测论文端到端自动驾驶论文 前言 汇总CVPR2025自动驾驶前沿论文 自动驾驶的轨迹预测论文 Leveraging SD Map to Augment HD Map-based Trajectory PredictionModeSeq: Taming Sparse Multimodal Motion Prediction with Seque…...
Qt6.8实现麦克风音频输入音频采集保存wav文件
一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件,使用QAudioInput来录音,并使用QFile来保存数据到WAV文件。 开发环境:QT6.8 本文用极简代码实现,核心代码只需不到100行。 二.代码实现...
记录一个SQL自动执行的html页面
在实际工作场景中,需要运用到大量SQL语句更新业务逻辑,对程序员本身,写好的sql语句执行没有多大问题(图1),但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面(图2࿰…...
分布式唯一ID
微服务 分布式唯一主键ID生成方案_微服务主键生成-CSDN博客 uid-generator-spring-boot-starter 教程-CSDN博客 https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md GitCode - 全球开发者的开源社区,开源代码托管平台...
在图像/视频中裁剪出人脸区域
1. 在图像中裁剪人脸区域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…...
LuaJIT 学习(5)—— string.buffer 库
文章目录 Using the String Buffer LibraryBuffer ObjectsBuffer Method Overview Buffer Creation and Managementlocal buf buffer.new([size [,options]]) local buf buffer.new([options])buf buf:reset()buf buf:free() Buffer Writersbuf buf:put([str|num|obj] [,……...
qt介绍图表 charts 一
qt chartsj基于Q的Graphics View框架,其核心组件是QChartView和QChart.QChartView是一个显示图表的独立部件,基类为QGraphicsView.QChar类管理图表的序列,图例和轴示意图。 绘制一个cos和sin曲线图,效果如下 实现代码 #include…...
Transformer:GPT背后的造脑工程全解析(含手搓过程)
Transformer:GPT背后的"造脑工程"全解析(含手搓过程) Transformer 是人工智能领域的革命性架构,通过自注意力机制让模型像人类一样"全局理解"上下文关系。它摒弃传统循环结构,采用并行计算实现高…...
S32K144入门笔记(十):TRGMUX的初始化
目录 1. 概述 2. 代码配置 1. 概述 书接上回,TRGMUX本质上是一个多路选择开关,根据用户手册中的描述,它可以实现多个输入的选择输出,本篇文章将验证如何通过配置工具来生成初始化配置代码。 2. 代码配置 笔者通过配置TRGMUX实现…...
有了大模型为何还需要Agent智能体
一、什么是Agent? Agent(智能体) 是一种能感知环境、自主决策、执行动作的智能实体,当它与大语言模型(如通义千问QWen、GPT)结合时,形成一种**“增强型AI系统”**。其核心架构如下:…...
DNS主从服务器
1.1环境准备 作用系统IP主机名web 服务器redhat9.5192.168.33.8webDNS 主服务器redhat9.5192.168.33.18dns1DNS 从服务器redhat9.5192.168.33.28dns2客户端redhat9.5192.168.33.7client 1.2修改主机名和IP地址 web服务器 [rootweb-8 ~]# hostnamectl hostname web [rootweb-8…...
Flume详解——介绍、部署与使用
1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源(如日志文件、消息队列等)传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点: 可扩展࿱…...
一个简单的 **猜数字游戏** 的 C 语言例程
一个简单的 猜数字游戏 的 C 语言例程,代码包含详细注释,适合学习和练习基础语法: #include <stdio.h> #include <stdlib.h> #include <time.h> // 用于生成随机数种子int main() {int target, guess, attempts 0;srand…...
解决diffusers加载stablediffusion模型,输入prompt总是报错token数超出clip最大长度限制
1. StableDiffusion1.5 在加载huggingface中的扩散模型时,输入prompt总是会被报错超过clip的最大长度限制。 解决方案:使用compel库 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…...
