该系统主要包括登陆、图书管理和图书类型管理三个功能,该系统涵盖了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()
需要完整代码的留言私发