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。
- 再次打开学生王五已不存在
(三)数据库内容更新
- 用户表数据情况。
- 可看到学生王五的信息已不存在。
待后续更新....