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

1、项目说明

基于python+PyQt5+MySQL的图书借阅管理系统项目实战

项目需要安装pycharm社区版或专业版都可,以及项目所需的所有模块

项目需要安装pymysql、PyQt5及其他一些模块(可在需求文件中查看)
安装命令如下:

项目打包为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/
 
注:其他问题请参看视频讲解,都有介绍,一定要认真看完哦!
代码编写、视频录制不易,感谢您的支持,祝您学习愉快!
 

避免走丢,记得关注哦🌹🌹🌹

posted @ 2023-03-12 22:13  兵慌码乱  阅读(2498)  评论(0)    收藏  举报