基于PyQt的图书管理系统


该系统主要包括登陆、图书管理和图书类型管理三个功能,该系统涵盖了Qt常见的一些组件,采用三层架构开发,数据库部分是使用的MySQL。是个非常适合练手的Qt项目。


1、登陆功能

​ 运行程序,首先是进入登陆页面,用户输入账号密码,点击登陆,验证成功后进入主界面,账号或者密码错误会给出提示信息,点击重置按钮可以重置输入内容。

在这里插入图片描述

登陆功能的槽函数如下:

    def login(self):
        userName = self.userNameInput.text()
        password = self.passwordInput.text()
        if userName.strip() == "" or password.strip() == "":
            QMessageBox.warning(None, '用户名和密码不能为空!')
        else:
            user = User(userName, password)
            resultUser = userDao.login(user)
            if resultUser:
                print("登陆成功")
                userDao.currentUserName = userName
                userDao.currentUserPassword = password
                self.m = main.Ui_MainWindow()
                self.m.show()
                self.hide()
            else:
                QMessageBox.warning(None, '系统提示', '用户名或者密码输入错误!')

​ 登陆功能Dao层代码如下,主要步骤分为创建con连接对象、获取连接、创建cursor对象,写入SQL语句执行、返回结果,关闭连接。使用工具类封装数据库相关代码。下面相关操作类似,只是换了关键的SQL语句,将不在重复。

def login(user: User):
    """
    用户登录判断
    :param user:用户实体
    :return: 登录成功返回用户信息实体,登录失败,返回Node
    """
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        cursor.execute(f"select * from t_user where userName='{user.userName}' and password='{user.password}'")
        return cursor.fetchone()
    except Exception as e:
        con.rollback()
        print(e)
        return None
    finally:
        dbUtil.closeCon(con)

​ 表单清空按钮即获取到相关文本框,然后使用setTex()方法使其置为空。下面重置方法相关代码写法类似。槽函数代码如下:

def resetForm(self):
    self.userNameInput.setText("")
    self.passwordInput.setText("")

2、主页面

​ 用户登陆成功后进入主页面左上角菜单栏有图书管理、图书类别管理、系统设置三个一级菜单下面分别是图书添加、图书信息管理。图书类别添加、图书类别信息管理。修改密码和退出登陆。左下角有显示当前登陆的用户。

在这里插入图片描述

点击二级菜单跳转页面的槽函数如下:

    def openBookType(self, m):
        print(m.text())
        if m.text() == "图书类别添加":
            self.bookTypeAdd = bookTypeAdd.Ui_Form()
            self.bookTypeAdd.show()
        elif m.text() == "图书类别信息管理":
            self.bookTypeManage = bookTypeManage.Ui_Form()
            self.bookTypeManage.show()

    def openBook(self, m):
        print(m.text())
        if m.text() == "图书添加":
            self.bookAdd = bookAdd.Ui_Form()
            self.bookAdd.show()
        elif m.text() == "图书信息管理":
            self.bookManage = bookManage.Ui_Form()
            self.bookManage.show()

    def openSetting(self, m):
        if m.text() == "修改密码":
            self.modifyPassword = modifyPassword.Ui_Form()
            self.modifyPassword.show()
        elif m.text() == "安全退出":
            reply = QMessageBox.question(self, '系统提示', '您确定要退出登陆吗?',
                                         QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
                                         QMessageBox.StandardButton.No)
            if reply == QMessageBox.StandardButton.Yes:
                self.close()

使用QMenu菜单的triggered信息,与槽函数绑定即可实现跳转页面的效果。

3、图书管理

3.1、图书信息添加

​ 用户点击图书信息添加按钮后,跳转至该页面,用户输入响应的图书信息,选择图书类别选择点击添加按钮,即可将数据填入数据库,点击重置按钮清空表单。

在这里插入图片描述

​ 图书信息添加核心代码如下;

def add(self):
    bookName = self.bookNameInput.text()
    if bookName.strip() == "":
        QMessageBox.warning(None, '系统提示', '图书名称不能为空!')
        return
    author = self.authorInput.text()
    if author.strip() == "":
        QMessageBox.warning(None, '系统提示', '图书作者不能为空!')
        return
    sex = ''
    if self.manRadio.isChecked():
        sex = '男'
    else:
        sex = '女'
    price = self.priceInput.text()
    if price.strip() == "":
        QMessageBox.warning(None, '系统提示', '图书价格不能为空!')
        return
    bookTypeId = self.bookTypeComboBox.currentData()
    if bookTypeId == -1:
        QMessageBox.warning(None, '系统提示', '请选择图书类别!')
        return
    bookDesc = self.bookDescInput.toPlainText()
    book = Book.my_constructor(bookName, author, sex, price, bookTypeId, bookDesc)
    if bookDao.add(book) > 0:
        QMessageBox.information(None, '系统提示', '添加成功')
        self.reset()
    else:
        QMessageBox.warning(None, '系统提示', '添加失败')
3.2、图书信息管理

​ 点击图书信息管理按钮,即可进入其二级界面,用户可以通过图书名称、图书作者、图书类别进入查询相关图书信息,用户选择查询到的信息可以对图书进行修改。

在这里插入图片描述

其中查询操作,使用了SQL语句拼接,用户不输入关键字就是查询全部图书,用户也可以输入任意关键字,选择查询。Dao层查询代码如下:

def list(s_book: Book):
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        sql = "SELECT  t.`id` AS id ,bookName,author,bookTypeName,sex,price,bookDesc FROM t_book1 AS t,t_booktype AS ty WHERE t.`bookTypeId`=ty.`id`"
        if s_book != None:
            if s_book.bookName.strip() != '':
                sql += " and t.bookName like '%" + s_book.bookName + "%' "
            if s_book.author.strip() != '':
                sql += " and t.author like '%" + s_book.author + "%' "
            if s_book.bookTypeId != -1:
                sql += " and t.bookTypeId= " + str(s_book.bookTypeId)
        cursor.execute(sql)
        return cursor.fetchall()
    except Exception as e:
        con.rollback()
        print(e)
        return None
    finally:
        dbUtil.closeCon(con)

​ 图书类别一栏是相关图书类别信息,在页面渲染的时候查询出来自动生成。

def initBookTypeLisComboBox(self):
    # 查询出来所有图书类别
    bookTypeList = bookTypeDao.list("")
    self.bookTypeComboBox.addItem("请选择图书类型", -1)
    # 添加进comboBox组件
    for bookType in bookTypeList:
        self.bookTypeComboBox.addItem(bookType[1], bookType[0])

​ 查询出来相关图书信息后,点击相应的行即可将信息自动填入下方的修改表单,行点击事件,会回调一个QModelIndex行信息对象,通过QTableWidget的item(rowIndex,columnIndex).text()获取具体的某行某列的数据,然后设置表单数据。槽函数代码如下:

def initForm(self, index: QModelIndex):
    rowIndex = index.row()  # 获取行索引
    self.idInput.setText(self.bookListTable.item(rowIndex, 0).text())  # 设置id编号
    self.bookNameInput.setText(self.bookListTable.item(rowIndex, 1).text())  # 设置图书名称
    self.authorInput.setText(self.bookListTable.item(rowIndex, 2).text())  # 设置图书作者
    self.bookTypeComboBox.setCurrentText(self.bookListTable.item(rowIndex, 3).text())  # 设置图书类别

    if self.bookListTable.item(rowIndex, 4).text() == '男':  # 设置性别
        self.manRadio.setChecked(True)
    else:
        self.femaleRadio.setChecked(True)

    self.priceInput.setText(self.bookListTable.item(rowIndex, 5).text())  # 设置图书价格
    self.bookDescInput.setPlainText(self.bookListTable.item(rowIndex, 6).text())  # 设置图书描述

4、图书类别管理

4.1、图书类型添加

​ 用户点击图书类别添加,进入其二级界面,填入相关表单信息,点击添加按钮进入验证即可添加成功,点击重置按钮即可清空表单,图书类型添加槽函数如下:

def add(self):
    """
    添加图书类别信息
    :return:
    """
    bookTypeName = self.bookTypeNameInput.text()
    bookTypeDesc = self.bookTypeDescInput.toPlainText()
    if bookTypeName.strip() == "":
        QMessageBox.warning(None, '系统提示', '图书类别名称不能为空!')
    else:
        bookType = BookType(bookTypeName, bookTypeDesc)
        if bookTypeDao.add(bookType) > 0:
            QMessageBox.information(None, '系统提示', '添加成功')
            self.reset()
        else:
            QMessageBox.warning(None, '系统提示', '添加失败')
4.2、图书类别信息管理

​ 该页面分为三个部分,上面的查询部分,中间的图书类别展示以及下面的修改。涉及到的相关代码思想与图书信息管理类似,只是具体代码有所改变,不在陈述。

在这里插入图片描述

​ 其中表单操作中的编号因为是自增长的,不允许其修改,所以设置了不可修改,改变其背景色为灰色。

self.idInput.setReadOnly(True)
self.idInput.setStyleSheet("background-color:gray")

5、系统设置

5.1、修改密码

​ 用户选择修改密码按钮,进入其二级界面,用户名和密码在登陆成功的时候存储在系统中,用户输入原密码和新密码,然后确定输入新密码,点击提交,进行相关校验操作,成功即可修改成功,失败会给出提示信息。修改密码相关槽函数如下所示:

def modifyPwd(self):
    """
    修改密码
    :return:
    """
    userName = self.userNameLabel.text()
    oldPwd = self.oldPwdInput.text()
    if oldPwd.strip() == "":
        QMessageBox.warning(None, '系统提示', '请输入原密码!')
        return
    # 判断原密码是否正确
    if oldPwd != userDao.currentUserPassword:
        QMessageBox.warning(None, '系统提示', '原密码输入不正确!')
        return
    newPwd = self.newPwdInput.text()
    if newPwd.strip() == "":
        QMessageBox.warning(None, '系统提示', '请输入新密码!')
        return
    newPwd2 = self.newPwd2Input.text()
    if newPwd2.strip() == "":
        QMessageBox.warning(None, '系统提示', '请输入确认新密码!')
        return
    # 判断新密码和确认新密码是否一致
    if newPwd != newPwd2:
        QMessageBox.warning(None, '系统提示', '确认新密码输入不正确!')
        return
    user = User.my_constructor(userName, oldPwd, newPwd)
    if userDao.modifyPassword(user) > 0:
        QMessageBox.information(None, '系统提示', '密码修改成功!')
        self.resetForm()
    else:
        QMessageBox.warning(None, '系统提示', '密码修改失败!')
5.2、退出登陆

​ 用户点击系统设置中的按钮退出,即可关闭页面,退出程序,代码如下:

elif m.text() == "安全退出":
    reply = QMessageBox.question(self, '系统提示', '您确定要退出登陆吗?',
                                 QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
                                 QMessageBox.StandardButton.No)
    if reply == QMessageBox.StandardButton.Yes:
        self.close()

需要完整代码的留言私发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子味汽水ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值