【项目实战】基于Python+PyQt5+MySQL的GUI图书借阅管理系统(附完整源码)

1、项目说明
基于python+PyQt5+MySQL的图书借阅管理系统项目实战
项目需要安装pycharm社区版或专业版都可,以及项目所需的所有模块
项目需要安装pymysql、PyQt5及其他一些模块(可在需求文件中查看)
安装命令如下:
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块名称
- 如安装cv2:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql
项目打包为exe文件需要安装pyinstaller
执行命令:pyinstaller -F -w main.py -i logo图片的地址
2、项目主要技术
-
python编程技术
-
pyqt5界面编程
-
mysql数据库技术
3、项目结构
-
util 项目的配置文件
-
images 项目图片存放文件夹
-
user 用户界面与功能实现模块文件夹
-
manage 管理员界面和功能实现模块文件夹
-
login.py 登录界面与功能实现(项目入口)
4、项目主要功能
-
用户登录验证
-
用户借阅、归还图书
-
管理员管理图书
5、部分源码
login.py
"""
项目名称:python图书管理系统
作者:bhml
时间:2023/1/28
代码功能:登录界面与功能实现(初始化界面)
"""
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import qdarkstyle
import pymysql
from PyQt5.QtWidgets import QMainWindow
import register
import detail_mg
import detail_stu
import config
class Ui_MainWindow(QMainWindow):
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.ut = 0
self.setupUi(self)
# 界面设计
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(887, 651)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("images/logo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label1 = QtWidgets.QLabel(self.centralwidget)
self.label1.setStyleSheet('''
color:red;
font-size:36px;
''')
self.label1.setGeometry(QtCore.QRect(200, 20, 600, 100))
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.label1.setFont(font)
self.label1.setObjectName("label1")
self.lineEdit1 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit1.setGeometry(QtCore.QRect(390, 160, 211, 41))
self.lineEdit1.setObjectName("lineEdit1")
self.lineEdit1.setPlaceholderText("请输入用户名")
self.label2 = QtWidgets.QLabel(self.centralwidget)
self.label2.setGeometry(QtCore.QRect(270, 160, 91, 41))
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.label2.setFont(font)
self.label2.setObjectName("label2")
self.lineEdit2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit2.setGeometry(QtCore.QRect(390, 230, 211, 41))
self.lineEdit2.setPlaceholderText("请输入密码")
from PyQt5.Qt import QLineEdit
self.lineEdit2.setEchoMode(QLineEdit.Password)
self.lineEdit2.setObjectName("lineEdit2")
self.label3 = QtWidgets.QLabel(self.centralwidget)
self.label3.setGeometry(QtCore.QRect(270, 230, 91, 41))
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.label3.setFont(font)
self.label3.setObjectName("label3")
self.radioButton1 = QtWidgets.QRadioButton(self.centralwidget)
self.radioButton1.setGeometry(QtCore.QRect(330, 300, 121, 61))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.radioButton1.setFont(font)
self.radioButton1.setObjectName("radioButton1")
self.radioButton1.setChecked(True)
self.radioButton2 = QtWidgets.QRadioButton(self.centralwidget)
self.radioButton2.setGeometry(QtCore.QRect(480, 300, 121, 61))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.radioButton2.setFont(font)
self.radioButton2.setObjectName("radioButton2")
self.radioButton2.setChecked(False)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(400, 390, 111, 41))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 887, 26))
self.menubar.setObjectName("menubar")
self.menuview = QtWidgets.QMenu(self.menubar)
self.menuview.setObjectName("menuview")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action1 = QtWidgets.QAction(MainWindow)
self.action1.setObjectName("action1")
self.action2 = QtWidgets.QAction(MainWindow)
self.action2.setObjectName("action2")
self.action3 = QtWidgets.QAction(MainWindow)
self.action3.setObjectName("action3")
self.action4 = QtWidgets.QAction(MainWindow)
self.action4.setObjectName("action4")
self.menuview.addAction(self.action1)
self.menuview.addAction(self.action2)
self.menuview.addAction(self.action3)
self.menuview.addAction(self.action4)
self.menubar.addAction(self.menuview.menuAction())
# 事件绑定
self.pushButton.clicked.connect(self.login)
self.radioButton1.toggled.connect(self.usertype)
self.radioButton2.toggled.connect(self.usertype)
self.action1.triggered.connect(self.regist_user)
self.action2.triggered.connect(self.flush)
self.action3.triggered.connect(self.flush)
self.action4.triggered.connect(self.quit_sys)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Python图书管理系统-登录"))
self.label1.setText(_translate("MainWindow", "欢迎使用Python图书管理系统"))
self.label2.setText(_translate("MainWindow", "用户名:"))
self.label3.setText(_translate("MainWindow", "密 码:"))
self.radioButton1.setText(_translate("MainWindow", "管理员"))
self.radioButton2.setText(_translate("MainWindow", "普通用户"))
self.pushButton.setText(_translate("MainWindow", "登 录"))
self.menuview.setTitle(_translate("MainWindow", "菜单栏"))
self.action1.setText(_translate("MainWindow", "注册"))
self.action2.setText(_translate("MainWindow", "登录"))
self.action3.setText(_translate("MainWindow", "退出登录"))
self.action4.setText(_translate("MainWindow", "退出系统"))
# 登录操作
def login(self):
from PyQt5.Qt import QMessageBox
user = self.lineEdit1.text()
pwd = self.lineEdit2.text()
self.usertype()
if user == "" or pwd == "":
QMessageBox.warning(self, "警告", "用户名和密码不可为空!", QMessageBox.Yes, QMessageBox.Yes)
return False
try:
self.db = pymysql.connect(host='localhost',
port=3306,
user="root",
password='123456',
database='db_book',
charset='utf8')
except:
QMessageBox.warning(self, '警告', "连接数据库异常", QMessageBox.Yes)
self.db.rollback()
return
# 管理员用户
if self.ut == 1:
sql = 'select * from manager where user_name="%s"' % user
cur = self.db.cursor() # 获取游标
cur.execute(sql) # 执行sql语句
results = cur.fetchall() # 通过fetchall获取数据
if len(results) != 0:
QMessageBox.information(self, '提示', "管理员登录成功!", QMessageBox.Yes)
self.hide()
# 转入主界面
self.libs = detail_mg.Ui_MainWindow()
self.libs.show()
else:
QMessageBox.warning(self, '提示', "您输入的账号或密码有误!", QMessageBox.Yes)
self.lineEdit1.clear()
self.lineEdit2.clear()
return
# 普通用户
else:
sql = 'select * from consumer where user_name="%s"' % user # sql指令语句
cur = self.db.cursor() # 获取游标
cur.execute(sql) # 执行sql语句
results = cur.fetchall() # 通过fetchall获取数据
if len(results) != 0:
config.USER_NAME = user
QMessageBox.information(self, '提示', "用户登录成功!", QMessageBox.Yes)
self.hide()
# 转入主界面
self.libs = detail_stu.Ui_MainWindow()
self.libs.show()
else:
QMessageBox.warning(self, '提示', "您输入的账号或密码有误!", QMessageBox.Yes)
self.lineEdit1.clear()
self.lineEdit1.clear()
return
# 用户类型选择(单选)
def usertype(self):
info = 0
if self.radioButton1.isChecked():
self.radioButton1.setChecked(True)
info = 1
else:
self.radioButton1.setChecked(False)
info = 0
if self.radioButton2.isChecked():
self.radioButton2.setChecked(True)
info = 0
else:
self.radioButton2.setChecked(False)
info = 1
self.ut = info
# 用户注册
def regist_user(self):
# 主界面的隐藏
self.hide()
# 注册界面打开
self.regist = register.Ui_MainWindow()
self.regist.show()
# 刷新(清空输入框)
def flush(self):
self.lineEdit1.clear()
self.lineEdit2.clear()
# 默认选择
if self.ut == 0:
self.radioButton1.setChecked(True)
# 退出系统(关闭界面)
def quit_sys(self):
self.close()
sys.exit()
# 入口
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) # 创建一个应用程序
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
ui1 = Ui_MainWindow() # 创建设计好的窗口对象
ui1.show()
sys.exit(app.exec_())
6、运行截图



7、项目总结
本项目是一个非常适合练手的项目,对我们的python编程技术结合pyqt5模块运用开发界面的提升有很大的帮助,推荐大家学习研究这个项目,搞懂其中的业务逻辑流程以及各个知识点非常关键。
项目资料截图:

资料获取地址:https://h5.m.taobao.com/awp/core/detail.htm?ft=t&id=692912597391
B站视频讲解地址:https://www.bilibili.com/video/BV1xD4y1P7rs/
注:其他问题请参看视频讲解,都有介绍,一定要认真看完哦!
代码编写、视频录制不易,感谢您的支持,祝您学习愉快!
避免走丢,记得关注哦🌹🌹🌹
版权声明:本文为博主兵慌码乱原创文章,请勿转载!

基于python+PyQt5+MySQL的图书借阅管理系统项目实战
浙公网安备 33010602011771号