QT+MYSQL实现图书管理系统(续前)

前面说到菜单模块,这次继续更新下面的内容
这是全部源代码和所需素材链接:
https://pan.baidu.com/s/1vJP4StgNYO27FH7HSjV_fg
源码链接
提取码:csdn
喜欢的朋友点赞加关注!!!
1.图书管理
图书管理主要功能有:显示所有图书信息,根据不同字段查询信息,新增图书,修改图书信息,删除图书信息。

1)查询信息显示在窗口主要是使用QT自带的模型QSqlQueryModel和视图QTableView。model->setHeaderData(0, Qt::Horizontal, tr(“列名”))可以设置显示出来字段名。setQuery()里存放查询语句。这个模型视图里的表内容不可更改。QSqlQuery myQuery(db)绑定了一个数据库对象。myQuery.exec(str_sql)也可以执行查询语句。如果查询结果不存在,提示用户重新输入条件。图书管理界面图见成果展示,具体代码如下:
在这里插入图片描述

QWidget* Dw = new QWidget();
QSqlQueryModel* model = new QSqlQueryModel(this);
QString str_sql = "select * from books where 书名 like '%" + book_name->text().trimmed() + "%' and 作者 like '%" + book_author->text().trimmed() + "%' and 出版社 like '%" + book_publisher->text().trimmed() + "%'";
	
	if (book_name->text().trimmed()==""&& book_author->text().trimmed()==""&&book_publisher->text().trimmed()=="")
	{
		QMessageBox::information(this, "查询", "您没有输入查询条件,请重试");
		return;
	}
	
	int count = 0;
	QSqlQuery myQuery(db);
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历数据表格每一行,从第0行到最后一行
		{
			count++;
		}
	}
	if (count == 0)  //如果查询的结果集为空,提示用户重新输入条件
	{
		QMessageBox::information(this, "", "没有您想要的查询,请重新输入查询信息");
		return;
	}


QSqlQueryModel* model = new QSqlQueryModel(this);
model->setQuery("select * from books");
	model->setHeaderData(0, Qt::Horizontal, tr("图书ID"));
	model->setHeaderData(1, Qt::Horizontal, tr("书名"));
	model->setHeaderData(2, Qt::Horizontal, tr("作者"));
	model->setHeaderData(3, Qt::Horizontal, tr("出版社"));
	model->setHeaderData(4, Qt::Horizontal, tr("出版时间"));
	model->setHeaderData(5, Qt::Horizontal, tr("价格"));
	model->setHeaderData(6, Qt::Horizontal, tr("库存"));
	this->tableView->setModel(model);//数据放置进去  
	this->tableView->verticalHeader()->hide();//不显示序号  
	this->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //表的列宽均 匀充满空间
    tableView->show();

2)更改和新增信息反映到数据库里主要用到QSqlTableModel模型和视图QTableView。QSqlRecord获取空记录。修改完以后可以点击确定提交和取消修改。提交事务会修改数据库里的内容,取消修改可撤销未提交的事务。达到了数据可视化的目标。参数均已初始化。具体代码如下:

QTableView* tableView;//表格模板
QSqlTableModel *model;//添加空记录
QSqlRecord record = model->record();//获取空记录
int row = model->rowCount();//获取行号
model->insertRecord(row, record);

void BookManagement::SureOk_clicked()
{
	model->submitAll();//提交事务
	QMessageBox::information(this, "修改", "修改成功!");
}
void BookManagement::Cancel_clicked()
{
	model->revertAll(); //撤销事务
	model->submitAll();  //撤销事务需要提交
}

3)删除信息需要使用QItemSelectionModel模型,获取选中的行,可以是多行。QModelIndexList可以取出选中的行,然后用for循环遍历删除每一行数据。具体代码如下:

void BookManagement::Deletebooks() //删除图书
{
	//获取选中的模型
	QItemSelectionModel* SModel = this->tableView->selectionModel()
	//取出所选中的行
	QModelIndexList list = SModel->selectedRows();
	//删除
	for (int i = 0;i < list.size();i++) //遍历选中的多行
	{
		model->removeRow(list.at(i).row()); //删除每一行
	}
}

2.读者模块的功能和图书模块相似,都具有增删改查的功能,所以这里不多做介绍。页面如下:
在这里插入图片描述
3.借阅管理
借阅模块除了包含基本的增删改查外,还支持借书还书功能。借书时系统会自动显示所有图书信息。
1)借书模块:让用户输入姓名和图书编号完成借书。
○1防止用户乱点击借书而输入为空的情况,提示用户信息不全且终止下面的操作。
○2如果用户不是合法用户,终止借书操作。
○3如果书ID不存在,提醒用户重新输入ID。
○4如果借书本书超出上限,不允许借书。
○5如果书库存为0,不予借书。
○6以上条件都满足,对应书的库存-1,提示借书成功。

void BrReManagement::Borrow_clicked() //确定借书
{
	//如果输入信息为空,则提示用户输入信息
	if(borrow_reader_name->text().trimmed() == "" || book_id->text().trimmed() == "")
	{
		QMessageBox::information(this, "查询", "您没有输入的信息不全,请重新输入");
		return;
	}

//如果用户输入的姓名不存在,停止借书操作
	int count = 0;
	QSqlQuery myQuery(db);
	QString str_sql = "select reader_id from readers where 姓名='" + borrow_reader_name->text().trimmed() + "'";
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
		{
			++count;
		}

		if (count == 0) //如果查询的读者不在结果集中,返回记录为空
		{
			QMessageBox::information(this, "", "抱歉,您不是合法用户!!!");
			return;
		}
			
	}
	//如果用户输入的图书ID不存在,停止借书操作
	count = 0;
	str_sql = "select book_id from books where book_id=" + book_id->text().trimmed();
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
		{
			++count;
		}

		if (count == 0) //如果图书ID不在结果集中,返回记录为空
		{
			QMessageBox::information(this, "", "图书ID不存在,请重新输入");
			return;
		}

	}
	//首先判断用户借书数量是否超出上限,超过则中断借书操作
	//还书时间判空,如果为空表示未还书
	count = 0;
	str_sql = "select * from br_re \
	 where 还书时间 IS NULL and br_reader_id=(select reader_id from readers   where 姓名='" + borrow_reader_name->text().trimmed() + "')"; 
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
		{
			++count;  //累计借书记录数
		}
	}

	if (count >= 5) //借书最多五本
	{
		QMessageBox::information(this, "", "您的借书数量超出上限,请先还书再借");
		return;
	}

	//如果书的库存为0,系统提示无法借此书
	str_sql = "select 库存 from books where book_id="+book_id->text().trimmed();
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
		{
			if (0 == myQuery.value(0)) {
				QMessageBox::information(this, "", "抱歉,您想借的书库存不足");
				return;
			}
		}
	}

    //根据姓名查找读者id,再将读者id和书的id增添到借阅记录中
	str_sql = "insert into br_re(br_reader_id,br_book_id) \
		     select reader_id,book_id from readers,books \
		         where readers.姓名='" + borrow_reader_name->text().trimmed()+"' and 
books.book_id=" + book_id->text().trimmed();
	myQuery.exec(str_sql);
	

	//借书后,相应的图书库存减1
	str_sql = "update books set 库存=库存-1 where book_id=" + book_id->text().trimmed();
	myQuery.exec(str_sql);
	QMessageBox::information(this, "", "✔借书成功");
}

2)还书模块
还书时需要用户输入姓名,查询本人的借书情况,由用户选择还哪本书。输入借书记录ID完成还书。
○1如果查询未还图书结果为空,则提示用户没有未还的书。
○2还书后对应图书表图书库存加1。

void BrReManagement::SelectBorrowBooksList() //查询个人所借图书
{
	//如果输入信息为空,则提示用户输入信息
	if (return_reader_name->text().trimmed() == "")
	{
		QMessageBox::information(this, "查询", "您没有输入相关信息,请重新输入");
		return;
	}


	//根据用户输入的名字找到其借书记录,而且是还书时间为空的记录
	QSqlQueryModel* model = new QSqlQueryModel(this);
	QString str_sql = "select br_id,reader_id,姓名,book_id,书名,借阅时间 \
						from readers,books,br_re where \
						br_reader_id=reader_id and br_book_id=book_id and \
						还书时间 IS NULL and  \
	                    br_reader_id=(select reader_id from readers  where 姓名='" + return_reader_name->text().trimmed() + "')";
	int count = 0;
	QSqlQuery myQuery(db);
	if (myQuery.exec(str_sql))
	{
		while (myQuery.next())//遍历数据表格每一行,从第0行到最后一行
		{
			count++;
		}
	}
	if (count == 0)
	{
		QMessageBox::information(this, "", "您没有未还的书或者信息输入错误");
		return;
	}
}
void BrReManagement::Return_clicked() //还书响应
{
	//如果输入信息为空,则提示用户输入信息
	if (return_br_id->text().trimmed() == "")
	{
		QMessageBox::information(this, "还书", "您没有输入相关信息,请重新输入");
		return;
	}


	//用户还书后系统修改对应的还书时间为当前时间
	//根据输入的借阅ID完成还书,因为借阅ID唯一
      QSqlQuery myQuery(db);
	  QString str_sql = "update br_re set 还书时间=Now() where br_id=" + return_br_id->text().trimmed();
      myQuery.exec(str_sql);
	 
	//根据用户输入的br_re id号,锁定对应的图书,使图书库存加1
	str_sql = "update books,br_re set 库存=库存+1 where \
				br_re.br_book_id=books.book_id and br_id="+ return_br_id->text().trimmed();
	myQuery.exec(str_sql);
	QMessageBox::information(this, "", "✔还书成功");       
 }

借书和还书界面如下:
在这里插入图片描述
4. QSS样式表(界面)
主要介绍系统用到的几种主要样式:
font-family 设置字体
background-image 设置背景图片
border-radius 设置圆角边框
font-size 设置字体大小
gridline-color 设置视图里表的边框颜色
margin-left 设置外边界的距离
background-color:qlineargradient 设置渐变色

*
{
	font-family:Microsoft Yahei;
}

QLineEdit
{
	border:1px solid blue;
	border-radius:5px;
	width:150px;
	height:20px;
	background-color:rgba(255,255,255,50%);
}

.SumW
{
	background-image:url(:/LibraryMangamentSystem/book4.jpg);
}

.view
{
	border-radius:55px;
	background-color:rgba(0,0,0,30%);
}
.view:hover
{
	border-radius:55px;
	background-color:rgba(0,0,0,35%);
}

.Login
{
    border:1px;
	background-image:url(:/LibraryMangamentSystem/book6.jpg);
}

.Menu
{
	background-image:url(:/LibraryMangamentSystem/book5.jpg);
}

.LoginLabel
{
	font-size:20px;
	color:white;
}

.logininput
{
    font-size:20px;
	border:1px;
	border-radius:10px;
	font-family:_GB2312 KaiTi_GB2312;
	background-color:rgba(255,255,255,70%);
}

.logininput:hover 
{
    font-size:20px;
	border:2px solid green;
	border-radius:10px;
	font-family:_GB2312 KaiTi_GB2312;
}

.Radiouser
{
	margin-left:190px;
	margin-top:130px;
}

.Radioadmin
{
	margin-top:130px;
}

.MenuBtn
{
	border-radius:10px;
	background-color:rgba(0,0,0,30%);
	font-family:_GB2312 KaiTi_GB2312;
}

.MenuBtn:hover
{
	border-radius:10px;
	font-family:_GB2312 KaiTi_GB2312;
	background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
										stop : 0 rgba(150,255,0,10%),
										stop : 0.495 rgba(88,207,253,100%),
										stop : 0.505 rgba(88,207,253,100%),
										stop : 1 rgba(150,255,0,10%));
}

.btn1
{
	border-radius:10px;
	border:2px solid green;
	font-size:15px;
	color:white;
}

.btn1:hover
{
	border-radius:5px;
	color:black;
	background-color:green;
}

.RegisterBtn
{
	border-radius:8px;
	border:2px solid green;
}
.RegisterBtn:hover
{
	border-radius:8px;
	background-color:green;
}


.RegisterPage
{
	background-color:black;
	background-image:url(:/LibraryMangamentSystem/book11.jpg);
}

.QLineEditRegister
{
	border:1px;
	background-color:rgba(255,255,255,70%);
}

.tableview
{
	background-color:rgba(255,255,255,60%);
	border-radius:20px;
	border:2px;
	gridline-color:blue;
}

.SumLabel
{
	color:white;
	margin-left:60px;
}



.QHeaderView::section
{
	background-color:rgba(255,255,255,0%);
}

.FunctionBtn
{
	border-radius:8px;
	background-color:rgba(255,255,255,50%);
	font-family:_GB2312 KaiTi_GB2312;
	height:50px;
	margin-left:25px;
}

.SelectBtn
{
    border:2px solid yellow;
    border-radius:5px;
	background-color:rgba(255,255,255,70%);
	font-family:_GB2312 KaiTi_GB2312;
	height:20px;
}

.SelectBtn:focus
{
    border:2px solid yellow;
    border-radius:5px;
	background-color:rgba(255,255,255,50%);
	font-family:_GB2312 KaiTi_GB2312;
	height:20px;
	background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
										stop : 0 rgba(150,255,0,10%),
										stop : 0.495 rgba(88,207,253,100%),
										stop : 0.505 rgba(88,207,253,100%),
										stop : 1 rgba(150,255,0,10%));
}

.FunctionBtn:hover
{
	border-radius:8px;
	font-family:_GB2312 KaiTi_GB2312;
	height:50px;
	margin-left:25px;
	background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
										stop : 0 rgba(180,159,218,90%),
										stop : 0.495 rgba(238,162,162,100%),
										stop : 0.505 rgba(238,162,162,100%),
										stop : 1 rgba(180,159,218,90%));
}

.TransactionBtn
{
	border-radius:8px;
	background-color:rgba(255,255,255,50%);
	
}
.TransactionBtn:focus
{
	border-radius:8px;
	background-color:rgba(255,255,255,50%);
	background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
										stop : 0 rgba(249,212,35,90%),
										stop : 0.495 rgba(255,78,80,100%),
										stop : 0.505 rgba(255,78,80,100%),
										stop : 1 rgba(249,212,35,90%));
}

以上是我做的图书管理系统,仅供参考。

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
QT MYSQL图书管理系统是一款用QT框架,结合MYSQL数据库开发的图书管理软件。本系统主要实现图书的借阅和归还、读者信息的管理、图书信息的管理、图书馆统计和查询等功能。下面是系统的设计与实现。 1.系统设计 系统采用了分层架构,分为用户界面层、业务逻辑层和数据访问层。用户界面层采用了QT GUI部件库,实现了系统的用户界面,业务逻辑层实现了系统各功能模块的业务逻辑,数据访问层使用MYSQL数据库存储和访问数据。 2.系统实现 读者信息和图书信息的管理:系统中的读者信息和图书信息存储在MYSQL数据库中,通过QT中的SQL API来访问数据库,实现了对图书信息和读者信息的增、删、改、查。 图书借阅和归还:图书的借阅和归还采用了事务处理,保证了数据的一致性。当读者借阅一本图书时,系统会检查该图书是否被借阅,如果没有被借阅,则记录借阅记录并将该图书的状态设置为已借出;当读者归还图书时,系统会检查该图书是否已经被借阅,如果被借阅,则还原该图书的状态。 图书馆统计和查询:系统中提供了各项功能操作的统计和查询,例如读者借阅情况、图书借阅情况、图书分类统计等,便于图书馆管理员进行管理和查询。 总之,本系统采用了QTMYSQL等技术,通过分层架构和事务处理等技术,实现图书管理系统的功能模块。本系统的实现具有良好的用户体验和信息管理效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值