图书管理系统设计报告
一、 系统整体架构
实验要求设计一个图书管理系统,主要具备以下几个功能:
用户和管理员的登录:
输入ID和密码(其中密码会变成小圆点隐藏),若ID和密码正确则登录成功,进入到主页面,否则输出错误提示,并清空文本框以方便用户再次输入。普通用户和管理员有不同的账户体系,ID密码不共用,且登录后的界面不同;
图书入库:
入库方式分为单本入库和批量入库,由管理员操作。单本入库要求管理员输入图书的编号(必需)、书名、出版社、年份、作者、价格、数量等信息,并对后台的数据库中的book表进行更新;批量入库的方式是从指定的txt文本文件中读入书的信息,格式为:book_no_1, Computer Science, Computer Architecture, xxx, 2004, xxx, 90.00, 2 (其中年份、数量是整数类型,价格是两位小数类型,其余为字符串类型),一行为一本书的信息,批量导入到数据库中;
图书查询:
普通用户在登录成功后即可进行查询操作,查询时,用户可以输入书号、书名、作者、出版社、类别等信息(至少一个)进行查询,程序会输出满足条件的所有书籍的信息,若用户未输入任何查询信息或没有查到符合要求的结果,程序会输出相应的错误提示,在每次查询完成后,程序会清空所有输入的文本框以方便用户进行下一次的查询;
借书:
借书时用户输入自己的借书证号和书号进行借书,借书成功或者失败程序会分别输出相应的提示,若借书成功则在数据库的borrow表中新增相应的借书记录,同时更新book表中相应书籍的库存信息;同时,在借书界面中,输入用户的借书证号,点击查询,程序会输出该借书证目前借阅的所有书的信息;
还书:
还书操作与借书在同一个界面完成,相应的,还书用户只需输入自己的借书证号和书号即可还书,程序会输出操作成功或失败的提示,若还书成功,数据库的borrow表和book表将AZSA 会进行相应的更新;
借书证管理:
管理员可以在登陆后增加或者删除一个借书证;
二、 各模块功能描述
用户登录:
图书查询
图书证管理
图书入库
.
5. 借书/还书
三、 数据库表结构
管理员admin
id char(8) *primary key
password varchar(20)
name varchar(10)
tel varchar(11)
书book
Bno Char(8) *primary key
Category Char(10)
Title Varchar(40)
Press Varchar(30)
Year Int
Author Varchar(20)
Price Decimal(7,2)
Total Int
Stock int
借书记录borrow
cno Char(7) //外键,级联更新删除
Bno Char(8) //外键,级联删除
Borrow_date Date
Return_date Date
Handler_id Char(8)
借书证card
Cno Char(7) *primary key
Name Varchar(10)
Department Varchar(40)
Type Char(1)
四、MySQL数据库准备
在整个工程开始之前,我们先确定了统一的数据库名称和建表的格式,以方便我们之间协调合作。建表的过程同实验二,在此不作赘述。为了方便测试,我们使用了MySQL里的批量入库语句来导入初始数据:
use managelibrary;
load data local infile “D:/book3.txt”
Into table book(bno,category,title,press,year,author,price,total,stock);
之后,我们对数据库managelibrary的操作将完全基于QT,下面将详细介绍我们如何在QT进行SQL语句的执行和图形界面的开发。
五、QT编程技术介绍
本小组采用Qt制作图书管理系统的图形界面。Qt是一个跨平台C++图形用户界面的应用程序开发框架,它既可以开发GUI程序,也可用于开发非GUI程序。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。
Qt creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。
Qt提供了大量的库函数用于制作图形界面,程序员需要做的事主要就是,首先使用软件提供的组件编程,然后完成相应信号的槽函数即可,在槽函数中有大量的用于图形界面制作的库函数、类可供使用;
下面介绍本小组在此次图书管理系统中所用到的qt技术:
- qt creator连接到数据库
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//设置主机名
db.setHostName("localhost");
//设置数据库名
db.setDatabaseName("managelibrary");
//设置账号名
db.setUserName("root");
//设置密码名
db.setPassword("123456");
//设置端口
db.setPort(3306);
if(!db.open()){
qDebug()<<endl<<"fail!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
return false;
}
qDebug()<<endl<<"success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
return true;
}
2. 用户登录界面
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);//密码
}
Dialog::~Dialog() //析构函数
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
int valid=0;
QSqlQuery query;
QString name0;
QString id0;
QString id =ui->lineEdit->text(); //从界面获取id的值
QString name=ui->lineEdit_2->text();
if(id.isEmpty()||name.isEmpty())
{
QMessageBox::warning(this,tr("Warning"),tr("Input your ID and name!"),QMessageBox::Yes);
return;
}
query.exec("select * from card");
while( query.next()){//指向第一条记录
id0=query.value(0).toString();
name0=query.value(1).toString();
if(!QString::compare(name,name0)&&!QString::compare(id,id0)) //查到该用户
{
valid=1;
break;
}
}
if(valid) //如果合法
{
accept();
}
else{
ui->lineEdit->clear();
ui->lineEdit_2->clear();
QMessageBox::warning(this,tr("Warning"),tr("user name or user ID error!"),QMessageBox::Yes);
//如果不正确,弹出警告对话框
}
}
void Dialog::on_pushButton_2_clicked()
{
int valid=0;
QSqlQuery query;
QString pass0;
QString id0;
QString id =ui->lineEdit->text(); //从界面获取id的值
QString pass=ui->lineEdit_2->text();
query.exec("select * from admin");
while( query.next()){//指向第一条记录
id0=query.value(0).toString();
pass0=query.value(1).toString();
if(!QString::compare(pass,pass0)&&!QString::compare(id,id0)) //查到该用户
{
valid=1;
break;
}
}
if(valid) //如果合法
{
done(-1);
}
else{
ui->lineEdit->clear();
ui->lineEdit_2->clear();
QMessageBox::warning(this,tr("Warning"),tr("admin ID or password error!"),QMessageBox::Yes);
//如果不正确,弹出警告对话框
}
}
3. 图书入库与图书证管理界面
add_user::add_user(QWidget *parent) :
QDialog(parent),
ui(new Ui::add_user)
{
ui->setupUi(this);
}
add_user::~add_user()
{
delete ui;
}
//增加借书证
void add_user::on_pushButton_clicked()
{
QSqlQuery query;
int exist=0;
QString cno=ui->lineEdit->text(); //读取文本框内容
QString name=ui->lineEdit_6->text();
QString dept=ui->lineEdit_5->text();
QString type=ui->lineEdit_8->text();
QString name0,cno0;
if(cno.isEmpty())
{
QMessageBox::warning(this,tr("Warning"),tr("Input cno!"),QMessageBox::Yes); //弹出警告提示框
return;
}
query.exec("select * from card");
while( query.next())
{//指向第一条记录
cno0=query.value(0).toString();
if(!QString::compare(cno,cno0)) //用户已存在
{
exist=1;
break;
}
}
if(exist)
{
QMessageBox::warning(this,tr("Warning"),tr("ID exists"),QMessageBox::Yes);
}
else
{
query.prepare("INSERT INTO card (cno,name,department,type) values(:cno,:name,:department,:type)"); //准备执行SQL查询
query.bindValue(":cno", cno); //在这定占位符上确定绑定的值
query.bindValue(":name", name);
query.bindValue(":department",dept);
query.bindValue(":type",type);
query.exec();
QMessageBox::warning(this,tr("提示"),tr("Insert success"),QMessageBox::Yes);
}
ui->lineEdit->clear(); //清空文本框
ui->lineEdit_5->clear();
ui->lineEdit_6->clear();
ui->lineEdit_8->clear();
}
//删除借书证
void add_user::on_pushButton_2_clicked()
{
QSqlQuery query;
int exist=0;
QString cno=ui->lineEdit_2->text();
QString cno0;
query.exec("select * from card");
while( query.next())
{//指向第一条记录
cno0=query.value(0).toString();
if(!QString::compare(cno,cno0)) //用户存在
{
exist=1;
break;
}
}
if(!exist)
{
QMessageBox::warning(this,tr("warning"),tr("ID doesn't exist!"),QMessageBox::Yes);
}
else
{
query.prepare("delete from card where cno=:cno"); //准备执行SQL查询
query.bindValue(":cno", cno); //在这定占位符上确定绑定的值
query.exec();
QMessageBox::warning(this,tr("提示"),tr("Delete success"),QMessageBox::Yes);
}
ui->lineEdit_2->clear();
}
//图书入库
void add_user::on_pushButton_3_clicked()
{
QSqlQuery query;
QString bno=ui->lineEdit_3->text(); //读取文本内容
QString category=ui->lineEdit_4->text();
QString title=ui->lineEdit_7->text();
QString press=ui->lineEdit_9->text();
QString year=ui->lineEdit_10->text();
QString author=ui->lineEdit_11->text();
QString price=ui->lineEdit_12->text();
QString total=ui->lineEdit_13->text();
QString bno0;
QString c0;
QString t0;
QString press0,y0,a0,price0;
QString total0,stock0;
int exist=0;
int stock=0;
int t=0;
bool ok;
if(bno.isEmpty())
{
QMessageBox::warning(this,tr("Warning"),tr("Input bno!"),QMessageBox::Yes);
return;
}
query.exec("select * from book");
while( query.next())
{//指向第一条记录
bno0=query.value(0).toString(); //从数据库读取内容
c0 = query.value(1).toString();
t0 = query.value(2).toString();
press0 = query.value(3).toString();
y0 = query.value(4).toString();
a0 = query.value(5).toString();
price0 = query.value(6).toString();
total0 = query.value(7).toString();
stock0 = query.value(8).toString();
if(!QString::compare(bno,bno0)) //已存在
{
exist=1;
break;
}
}
if(exist)
{
query.prepare("select * from book where bno = :bno0");
query.bindValue(":bno0",bno0);
query.exec();
t = total0.toInt(&ok,10) + total.toInt(&ok,10);
stock = stock0.toInt(&ok,10) + total.toInt(&ok,10);
total0 = QString::number(t);
stock0 = QString::number(stock);
query.prepare("update book set stock = :stock where bno = :bno0");
query.bindValue(":bno0",bno0);
query.bindValue(":stock",stock0);
query.exec();
query.prepare("update book set total = :total where bno = :bno0");
query.bindValue(":bno0",bno0);
query.bindValue(":total",total0);
query.exec();
QMessageBox::warning(this,tr("success"),tr("book exists and update"),QMessageBox::Yes);
}
else
{
query.prepare("INSERT INTO book values(:bno,:category,:title,:press,:year,:author,:price,:total,:stock)"); //准备执行SQL查询
query.bindValue(":bno", bno); //在这定占位符上确定绑定的值
query.bindValue(":category", category);
query.bindValue(":title",title);
query.bindValue(":press",press);
query.bindValue(":year",year);
query.bindValue(":author",author);
query.bindValue(":price",price);
query.bindValue(":total",total);
query.bindValue(":stock",total);
query.exec();
QMessageBox::warning(this,tr("提示"),tr("Insert success"),QMessageBox::Yes);
}
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
ui->lineEdit_7->clear();
ui->lineEdit_9->clear();
ui->lineEdit_10->clear();
ui->lineEdit_11->clear();
ui->lineEdit_12->clear();
ui->lineEdit_13->clear();
}
4. 图书查询界面
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//输入信息查询图书
void MainWindow::on_pushButton_clicked()
{
createConnection();
int valid=0;
int flag=0;
QSqlQuery query;
QTableView *view = new QTableView;
QString cno0,category0,author0,press0,title0;
QString cno =ui->lineEdit->text(); //从界面获取id的值
QString category=ui->lineEdit_2->text();
QString title=ui->lineEdit_3->text();
QString author=ui->lineEdit_4->text();
QString press=ui->lineEdit_5->text();
QString result;
ui->textBrowser->setPlainText("");//清空结果栏
ui->lineEdit->clear();
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
ui->lineEdit_5->clear();
query.exec("select * from book");
while( query.next())
{//指向第一条记录
cno0=query.value(0).toString();
category0=query.value(1).toString();
title0=query.value(2).toString();
press0=query.value(3).toString();
author0=query.value(5).toString();
if(cno.isEmpty()&&category.isEmpty()
&&title.isEmpty()&&author.isEmpty()
&&press.isEmpty()) //查到书
{
flag=1;
QMessageBox::warning(this,tr("Warning"),tr("Please Input More Informations"),QMessageBox::Yes);
break;
}
else if((!QString::compare(cno,cno0)||cno.isEmpty())&&(!QString::compare(category,category0)||category.isEmpty())
&&(!QString::compare(title,title0)||title.isEmpty())&&(!QString::compare(author,author0)||author.isEmpty())
&&(!QString::compare(press,press0)||press.isEmpty())) //查到书
{
valid=1;
result=query.value(0).toString()+" "+query.value(1).toString()+" "+query.value(2).toString()+" "+query.value(3).toString()+" "
+query.value(4).toString()+" "+query.value(5).toString()+" "+query.value(6).toString()+" "+query.value(7).toString()+" "
+query.value(8).toString()+"\n";
ui->textBrowser->insertPlainText(result);
}
}
if(!valid&&!flag){
QMessageBox::warning(this,tr("Warning"),tr("No Result"),QMessageBox::Yes);
//如果不正确,弹出警告对话框
}
}
//跳转到借还书界面
void MainWindow::on_pushButton_3_clicked()
{
this->close();
brrtw.show();
brrtw.exec();
this->show();
}
5. 借书还书界面
brrt::brrt(QWidget *parent) :
QDialog(parent),
ui(new Ui::brrt)
{
ui->setupUi(this);
}
brrt::~brrt()
{
delete ui;
}
void brrt::on_pushButton_4_clicked()
{
QSqlQuery query;
QString cnoin =ui->lineEdit->text(); //读取图书证号
QString result;
ui->textBrowser->clear(); //清空输出部分
query.prepare("select * from book natural join borrow where cno = :cno");
query.bindValue(":cno",cnoin);;
query.exec(); //选择该借书证已借书籍
while (query.next()) //每行按格式输出
{
result=query.value(0).toString()+" "+query.value(1).toString()+" "+query.value(2).toString()+" "+query.value(3).toString()+" "
+query.value(4).toString()+" "+query.value(5).toString()+" "+query.value(6).toString()+" "+query.value(7).toString()+" "
+query.value(8).toString()+"\n";
ui->textBrowser->insertPlainText(result);
}
}
void brrt::borrowbk () { //借书函数
QSqlQuery query;
QString cnoin =ui->lineEdit->text(); //读取图书证号
QString bnoin =ui->lineEdit_2->text(); //读取要借的书号
QString result;
QString date1,date2,han;
ui->textBrowser->clear();
query.exec("select * from book"); //选择book表
QString bno0;
int exists = 0;
while (query.next()) { //查看是否存在该书
bno0 = query.value(0).toString();
if(!QString::compare(bnoin,bno0)) {
exists=1; //若存在该书则exists = 1
break;
}
}
if (exists == 0) {
QMessageBox::warning(this,tr("Warning"),tr("book not found!"),QMessageBox::Yes);
}
//若该书不存在,输出错误信息
else { //若该书存在
query.prepare("select stock from book where bno = :bno");
//选择该书的库存
query.bindValue(":bno", bnoin);
query.exec();
if (query.next() && query.value(0) > 0) { //若有库存
query.prepare("update book set stock = stock - 1 where bno = :bno"); //更新库存
query.bindValue(":bno", bnoin);
query.exec();
query.prepare("insert into borrow values (:cno, :bno, :date1, :date2,:han)"); //更新borrow表
query.bindValue(":cno", cnoin);
query.bindValue(":bno", bnoin);
query.bindValue(":date1", "2017-04-23");
query.bindValue(":date2", "0000-00-00");
query.bindValue(":han", "01");
query.exec();
QMessageBox::warning(this,tr("Warning"),tr("borrow success"),QMessageBox::Yes); //输出成功信息
}
else { //若无库存
QMessageBox::warning(this,tr("Warning"),tr("No stock!"),QMessageBox::Yes); //输出无库存信息
query.prepare("select * from borrow where bno = :bno");
query.bindValue(":bno", bnoin);
query.exec();
query.next();
result = query.value(0).toString()+" "+query.value(1).toString()+" "+query.value(2).toString()+" "+query.value(3).toString() +"\n";
ui->textBrowser->insertPlainText(result);
//输出还书时间等信息
}
}
}
void brrt::returnbk () { //还书函数
QSqlQuery query;
QString cnoin =ui->lineEdit->text(); //读取图书证号
QString bnoin =ui->lineEdit_2->text(); //读取还书书号
QString result;
ui->textBrowser->clear();
int existc = 0, existb = 0;
QString bno0;
QString cno0;
query.exec("select * from book"); //选择book表
while (query.next()) { //查找该书
bno0 = query.value(0).toString();
if(!QString::compare(bnoin,bno0)) {
existb=1; //书存在
break;
}
}
query.exec("select * from card"); //选择card表
while (query.next()) { //查找图书证
cno0 = query.value(0).toString();
if(!QString::compare(cnoin,cno0)) {
existc=1; //图书证存在
break;
}
}
if (existb&&existc) { //若有借书记录
query.prepare("update book set stock = stock + 1 where bno = :bno"); //更新库存
query.bindValue(":bno", bnoin);
query.exec();
query.prepare("delete from borrow where bno = :bno and cno = :cno"); //更新借书表
query.bindValue(":bno", bnoin);
query.bindValue(":cno", cnoin);
query.exec();
QMessageBox::warning(this,tr("Warning"),tr("success"),QMessageBox::Yes); //输出成功信息
}
else {
QMessageBox::warning(this,tr("Warning"),tr("No borrow record!"),QMessageBox::Yes); //否则输出错误信息
}
}
void brrt::on_pushButton_clicked() //借书按键接口
{
brrt::borrowbk ();
}
void brrt::on_pushButton_2_clicked() //还书按键接口
{
brrt::returnbk ();
}
void brrt::on_pushButton_3_clicked() //返回查询界面按键接口
{
this->close();
}