乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
pyqt5图书管理系统--5、管理员页面设计之用户管理

本节分为两个部分:管理员界面设计、用户管理界面设计。

主要流程:1、通过进入管理员界面,点击用户管理按钮,转到用户管理界面。

     2、连接数据库,读取数据库内用户数量。

       3、设置表格布局,根据数据库内用户数量返回的参数设置相应的行数,并绑定相应的表格行数选中方法。

       4、点击删除用户按钮,根据选择的行数信息进行逻辑处理,返回相应的信息提示。

一、管理员界面

  • 新添加模块:
from UserMange import UserManage
  • 导入dropBookDialog模块
  • 调用淘汰书籍模块
    def usermangeClicked(self):
        usermange = UserManage()
        usermange.show()
        usermange.exec_()

二、用户管理界面

功能需求叙述:

  • 用户管理
    为了删除用户的同时保护数据库的完整性和约束性
    1、从user表中返回所有用户,删除指定的用户
    2、将该用户所借阅的所有书籍全部归还
  • 使用Qtablewidget来展示所有的用户的学号以及姓名
    1、展示所有用户
    2、管理员选中一行
    3、点击删除用户按钮
    4、提醒管理员是否删除
    5、删除,同时刷新最新的数据
  • 模块导入
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import qdarkstyle
from PyQt5.QtSql import *
import time
from PyQt5 import sip

 (一)类基础设置

class UserManage(QDialog):
    def __init__(self):
        super(UserManage, self).__init__()
        self.resize(380, 400)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.setWindowTitle("用户管理")

        # 用户数
        self.userCount = 0
        self.oldDeleteId = ""
        self.oldDeleteName = ""
        self.deleteID = ""
        self.deleteName = ""
        self.setUpUI()

(二)用户管理界面设计

1、连接数据库

self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName('./db/LibraryManagement.db')
self.db.open()
self.query = QSqlQuery()

2、调用查询用户数量函数,返回用户量参数

        self.getResult()

    def getResult(self):
        """
        返回学生用户的总数量
        :return:
        """
        sql = "select StudentId, Name from User where IsAdmin=0"
        self.query.exec_(sql)
        self.userCount = 0
        while self.query.next():
            self.userCount += 1
        sql = "select StudentId, Name from User where IsAdmin=0"
        self.query.exec_(sql)

 3、设置表格

# 表格设置
# QtableWidget 是pyQt5中的表格组件.
self.tablewidget = QTableWidget()

# 设置行数
self.tablewidget.setRowCount(self.userCount)
# 设置列数
self.tablewidget.setColumnCount(2)
# 设置表头
self.tablewidget.setHorizontalHeaderLabels(['学号', '姓名'])

 4、设置表格方法

# 不可编辑
self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 标题可以拉伸
# QHeaderView 自动改变列宽
self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

# 整行选中
# QAbstractItemView 项目视图类xx
# SelectRows单选行
self.tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)

 5、设置删除用户按钮

self.deleteUserButton = QPushButton("删除用户")
hlayout = QHBoxLayout()
hlayout.addWidget(self.deleteUserButton, Qt.AlignHCenter)
self.widget = QWidget()
self.widget.setLayout(hlayout)
self.widget.setFixedHeight(48)
font = QFont()
font.setPixelSize(15)
self.deleteUserButton.setFixedHeight(36)
self.deleteUserButton.setFixedWidth(180)
self.deleteUserButton.setFont(font)

6、添加进垂直布局

(1)添加表格至垂直布局

self.layout.addWidget(self.tablewidget)
  • 添加用户信息至表格
  • self.setRows()
def setRows(self):
    """
    读取每一行学生的数据 '学号', '姓名'
    :return:
    """
    font = QFont()
    font.setPixelSize(14)
    for i in range(self.userCount):
        if self.query.next():
            StudentIdItem = QTableWidgetItem(self.query.value(0))
            StudentNameItem = QTableWidgetItem(self.query.value(1))
            StudentIdItem.setFont(font)
            StudentNameItem.setFont(font)
            # setTextAlignment设置表达单元格文本对齐的方式
            StudentIdItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            StudentNameItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tablewidget.setItem(i, 0, StudentIdItem)
            self.tablewidget.setItem(i, 1, StudentNameItem)
    return

(2)添加删除按钮至垂直布局

self.layout.addWidget(self.widget, Qt.AlignCenter)

(三)信号传递

1、触发信号一

  • self.tablewidget.itemClicked.connect(self.getStudentInfo)
  • 检测操作中的行信息id和name是否一致。
def getStudentInfo(self, item):

    # 索引行的id
    # currentIndex().row()可以获取当前点击单元格所在的行序号
    row = self.tablewidget.currentIndex().row()
    # verticalScrollBar()
    # 设置滚动, 和行数保持一致
    self.tablewidget.verticalScrollBar().setSliderPosition(row)
    self.getResult()
    i = 0
    while self.query.next() and i != row:
        i = i + 1

    self.oldDeleteId = self.deleteID
    self.oldDeleteName = self.deleteName
    self.deleteID = self.query.value(0)
    self.deleteName = self.query.value(1)

2、触发信号二

(1)根据选中行的情况进行逻辑判断,返回相应提示信息。

  • self.deleteUserButton.clicked.connect(self.deleteUser)
  • 通过连接删除用户按钮,触发后 会根据选中行信息进行逻辑处理
  • 若未选中则弹出以下消息框
def deleteUser(self):
    if self.deleteID == "" and self.deleteName == "":
        print(QMessageBox.warning(self, '警告', '请选中要删除的用户', QMessageBox.Yes, QMessageBox.Yes))
        return
  •  若选中的行内信息相等则提示不存在
elif self.deleteID == self.oldDeleteId and self.deleteName == self.oldDeleteName:
    print(QMessageBox.warning(self, '警告', '该用户信息不存在', QMessageBox.Yes, QMessageBox.Yes))
    return
  •  若以上两种情况都不存在,则执行以下if语句提示是否删除
if (QMessageBox.information(self, '提醒',
                           f'删除用户:{self.deleteID, self.deleteName}\n用户一经删除将无法恢复,是否继续?',
                           QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No):
    return

(2)确定删除,更新数据库信息

  • 确定删除,则执行SQL删除语句,删除该行的用户信息
# 从user表删除用户
sql = "delete from User where StudentId='%s'" % (self.deleteID)
self.query.exec_(sql)
self.db.commit()
  • 将用户的借阅书籍自动归还到可借阅书籍内(即增加可借阅书籍数量)
# 归还所有书籍
sql = "select * from User_book where StudentId='%s' and BorrowState=1" % self.deleteID
self.query.exec_(sql)
  • 同时将修改信息表进行更新
timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
updateQuery = QSqlQuery()
while self.query.next():
    bookId = self.query.value(1)
    sql = "update Book set NumCanBorrow=NumCanBorrow+1 where BookId='%s'" % bookId
    updateQuery.exec_(sql)
    self.db.commit()
sql = "update User_Book set ReturnTime='%s', Borrowstate=0 where StudenteId='%s' and BorrowState=1" % (
timenow, self.deleteID)
self.query.exec_(sql)
self.db.commit()
print(QMessageBox.information(self, "提醒", "删除用户成功", QMessageBox.Yes, QMessageBox.Yes))

(3)调用更新函数,重新加载表格信息

  • self.updateUI()

  • 再调用更新表格函数,当再次打开时根据数据库用户信息重新加载至表格内。
def updateUI(self):
    self.getResult()
    self.layout.removeWidget(self.widget)
    self.layout.removeWidget(self.tablewidget)
    sip.delete(self.widget)
    sip.delete(self.widget)

    self.tablewidget = QTableWidget()

    # 设置行数
    self.tablewidget.setRowCount(self.userCount)
    # 设置列数
    self.tablewidget.setColumnCount(2)
    # 设置表头
    self.tablewidget.setHorizontalHeaderLabels(['学号', '姓名'])
    # 不可编辑
    self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
    # 标题可以拉伸
    # QHeaderView 自动改变列宽
    self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

    # 整行选中
    # QAbstractItemView 项目视图类xx
    # SelectRows单选行
    self.tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)

    # 布局
    self.layout.addWidget(self.tablewidget)
    self.setRows()
    self.deleteUserButton = QPushButton("删除用户")
    hlayout = QHBoxLayout()
    hlayout.addWidget(self.deleteUserButton, Qt.AlignHCenter)
    self.widget = QWidget()
    self.widget.setLayout(hlayout)
    self.widget.setFixedHeight(48)
    font = QFont()
    font.setPixelSize(15)
    self.deleteUserButton.setFixedHeight(36)
    self.deleteUserButton.setFixedWidth(180)
    self.deleteUserButton.setFont(font)
    self.layout.addWidget(self.widget, Qt.AlignCenter)

    # 设置信号
    self.deleteUserButton.clicked.connect(self.deleteUser)
    self.tablewidget.itemClicked.connect(self.getStudentInfo)

(四)程序入口

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./iron-man.png"))
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    mainMindow = UserManage()
    mainMindow.show()
    sys.exit(app.exec_())

三、完整代码

(一)管理员界面完整代码

import sys
from PyQt5.QtWidgets import *
import qdarkstyle
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
from addBookDialog import addBookDialog
from dropBookDialog import dropBookDialog
from UserMange import UserManage
class AdminHome(QWidget):
    def __init__(self):
        super(AdminHome, self).__init__()
        self.setUpUi()

    def setUpUi(self):
        self.resize(900,600)
        self.setWindowTitle("欢迎进入管理员主页")
        self.layout = QHBoxLayout()
        self.buttonlayout = QVBoxLayout()
        self.setLayout(self.layout)

        font = QFont()
        font.setPixelSize(16)

        self.userManageButton = QPushButton("用户管理")
        self.addBookButton = QPushButton("添加书籍")
        self.dropBookButton = QPushButton("淘汰书籍")

        self.userManageButton.setFont(font)
        self.addBookButton.setFont(font)
        self.dropBookButton.setFont(font)

        self.userManageButton.setFixedWidth(100)
        self.userManageButton.setFixedHeight(42)
        self.addBookButton.setFixedWidth(100)
        self.addBookButton.setFixedHeight(42)
        self.dropBookButton.setFixedWidth(100)
        self.dropBookButton.setFixedHeight(42)
        # 将三个按钮添加到垂直布局中
        self.buttonlayout.addWidget(self.addBookButton)
        self.buttonlayout.addWidget(self.userManageButton)
        self.buttonlayout.addWidget(self.dropBookButton)
        # 将按钮布局添加到垂直布局中
        self.layout.addLayout(self.buttonlayout)

        self.addBookButton.clicked.connect(self.addBookButtonClicked)
        self.dropBookButton.clicked.connect(self.dropBookButtonClicked)
        self.userManageButton.clicked.connect(self.usermangeClicked)
    def addBookButtonClicked(self):
        addDialog = addBookDialog()
        addDialog.show()
        addDialog.exec_()
    def dropBookButtonClicked(self):
        dropDialog = dropBookDialog()
        dropDialog.show()
        dropDialog.exec_()
    def usermangeClicked(self):
        usermange = UserManage()
        usermange.show()
        usermange.exec_()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    app.setWindowIcon(QIcon('./iron-man.png'))
    mianMindow = AdminHome()
    mianMindow.show()
    sys.exit(app.exec_())

(二)用户管理界面完整代码

"""
用户管理
为了删除用户的同时保护数据库的完整性和约束性
--从user表中返回所有用户,删除指定的用户
--将该用户所借阅的所有书籍全部归还

使用Qtablewidget来展示所有的用户的学号以及姓名
--展示所有用户
--管理员选中一行
--点击删除用户按钮
--提醒管理员是否删除
--删除,同时刷新最新的数据

"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import qdarkstyle
from PyQt5.QtSql import *
import time
from PyQt5 import sip


class UserManage(QDialog):
    def __init__(self):
        super(UserManage, self).__init__()
        self.resize(380, 400)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.setWindowTitle("用户管理")

        # 用户数
        self.userCount = 0
        self.oldDeleteId = ""
        self.oldDeleteName = ""
        self.deleteID = ""
        self.deleteName = ""
        self.setUpUI()

    def setUpUI(self):
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName('./db/LibraryManagement.db')
        self.db.open()
        self.query = QSqlQuery()
        # 调用学生用户数量查询函数
        self.getResult()

        # 表格设置
        # QtableWidget 是pyQt5中的表格组件.
        self.tablewidget = QTableWidget()

        # 设置行数
        self.tablewidget.setRowCount(self.userCount)
        # 设置列数
        self.tablewidget.setColumnCount(2)
        # 设置表头
        self.tablewidget.setHorizontalHeaderLabels(['学号', '姓名'])
        # 不可编辑
        self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        # 标题可以拉伸
        # QHeaderView 自动改变列宽
        self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 整行选中
        # QAbstractItemView 项目视图类xx
        # SelectRows单选行
        self.tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)

        # 布局
        self.layout.addWidget(self.tablewidget)
        self.setRows()
        self.deleteUserButton = QPushButton("删除用户")
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.deleteUserButton, Qt.AlignHCenter)
        self.widget = QWidget()
        self.widget.setLayout(hlayout)
        self.widget.setFixedHeight(48)
        font = QFont()
        font.setPixelSize(15)
        self.deleteUserButton.setFixedHeight(36)
        self.deleteUserButton.setFixedWidth(180)
        self.deleteUserButton.setFont(font)
        self.layout.addWidget(self.widget, Qt.AlignCenter)

        # 设置信号
        self.deleteUserButton.clicked.connect(self.deleteUser)
        self.tablewidget.itemClicked.connect(self.getStudentInfo)
    # 返回学生用户的总数量,以便创建表格添加行数和列数用。
    def getResult(self):
        """
        返回学生用户的总数量
        :return:
        """
        sql = "select StudentId, Name from User where IsAdmin=0"
        self.query.exec_(sql)
        self.userCount = 0
        while self.query.next():
            self.userCount += 1
        sql = "select StudentId, Name from User where IsAdmin=0"
        self.query.exec_(sql)

    # 循环填入学生的学号、姓名信息
    def setRows(self):
        """
        读取每一行学生的数据 '学号', '姓名'
        :return:
        """
        font = QFont()
        font.setPixelSize(14)
        for i in range(self.userCount):
            if self.query.next():
                StudentIdItem = QTableWidgetItem(self.query.value(0))
                StudentNameItem = QTableWidgetItem(self.query.value(1))
                StudentIdItem.setFont(font)
                StudentNameItem.setFont(font)
                # setTextAlignment设置表达单元格文本对齐的方式
                StudentIdItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                StudentNameItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                self.tablewidget.setItem(i, 0, StudentIdItem)
                self.tablewidget.setItem(i, 1, StudentNameItem)
        return

    def getStudentInfo(self, item):

        # 索引行的id
        # currentIndex().row()可以获取当前点击单元格所在的行序号
        row = self.tablewidget.currentIndex().row()
        # verticalScrollBar()
        # 设置滚动, 和行数保持一致
        self.tablewidget.verticalScrollBar().setSliderPosition(row)
        self.getResult()
        i = 0
        while self.query.next() and i != row:
            i = i + 1

        self.oldDeleteId = self.deleteID
        self.oldDeleteName = self.deleteName
        self.deleteID = self.query.value(0)
        self.deleteName = self.query.value(1)

    # 执行删除类的逻辑处理
    def deleteUser(self):
        if self.deleteID == "" and self.deleteName == "":
            print(QMessageBox.warning(self, '警告', '请选中要删除的用户', QMessageBox.Yes, QMessageBox.Yes))
            return

        elif self.deleteID == self.oldDeleteId and self.deleteName == self.oldDeleteName:
            print(QMessageBox.warning(self, '警告', '该用户信息不存在', QMessageBox.Yes, QMessageBox.Yes))
            return

        if (QMessageBox.information(self, '提醒',
                                   f'删除用户:{self.deleteID, self.deleteName}\n用户一经删除将无法恢复,是否继续?',
                                   QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No):
            return
        # 从user表删除用户
        sql = "delete from User where StudentId='%s'" % (self.deleteID)
        self.query.exec_(sql)
        self.db.commit()

        # 归还所有书籍
        sql = "select * from User_book where StudentId='%s' and BorrowState=1" % self.deleteID
        self.query.exec_(sql)
        timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
        updateQuery = QSqlQuery()
        while self.query.next():
            bookId = self.query.value(1)
            sql = "update Book set NumCanBorrow=NumCanBorrow+1 where BookId='%s'" % bookId
            updateQuery.exec_(sql)
            self.db.commit()
        sql = "update User_Book set ReturnTime='%s', Borrowstate=0 where StudenteId='%s' and BorrowState=1" % (
        timenow, self.deleteID)
        self.query.exec_(sql)
        self.db.commit()
        print(QMessageBox.information(self, "提醒", "删除用户成功", QMessageBox.Yes, QMessageBox.Yes))
        self.updateUI()
        return
    # 更新表格,重新在用户管理界面中展示
    def updateUI(self):
        self.getResult()
        self.layout.removeWidget(self.widget)
        self.layout.removeWidget(self.tablewidget)
        sip.delete(self.widget)
        sip.delete(self.widget)

        self.tablewidget = QTableWidget()

        # 设置行数
        self.tablewidget.setRowCount(self.userCount)
        # 设置列数
        self.tablewidget.setColumnCount(2)
        # 设置表头
        self.tablewidget.setHorizontalHeaderLabels(['学号', '姓名'])
        # 不可编辑
        self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        # 标题可以拉伸
        # QHeaderView 自动改变列宽
        self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 整行选中
        # QAbstractItemView 项目视图类xx
        # SelectRows单选行
        self.tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)

        # 布局
        self.layout.addWidget(self.tablewidget)
        self.setRows()
        self.deleteUserButton = QPushButton("删除用户")
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.deleteUserButton, Qt.AlignHCenter)
        self.widget = QWidget()
        self.widget.setLayout(hlayout)
        self.widget.setFixedHeight(48)
        font = QFont()
        font.setPixelSize(15)
        self.deleteUserButton.setFixedHeight(36)
        self.deleteUserButton.setFixedWidth(180)
        self.deleteUserButton.setFont(font)
        self.layout.addWidget(self.widget, Qt.AlignCenter)

        # 设置信号
        self.deleteUserButton.clicked.connect(self.deleteUser)
        self.tablewidget.itemClicked.connect(self.getStudentInfo)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./iron-man.png"))
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    mainMindow = UserManage()
    mainMindow.show()
    sys.exit(app.exec_())

四、效果展示

(一)管理员界面效果

  • 打开管理员界面

  • 点击用户管理

(二)用户管理界面操作

  • 不用鼠标选中行内信息,点击删除用户

  • 重复选中同一行信息,点击删除用户

  • 单击一行信息,点击删除用户

  • 点击yes。

  • 再次打开学生王五已不存在

(三)数据库内容更新

  • 用户表数据情况。
  • 可看到学生王五的信息已不存在。

待后续更新....

posted on 2022-12-14 14:16  乐之之  阅读(598)  评论(0编辑  收藏  举报