圖書管理系統設計報告
一、 系統整體架構
實驗要求設計一個圖書管理系統,主要具備以下幾個功能:
用戶和管理員的登錄:
輸入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();
}