Qt+Mysql 圖書管理系統設計

圖書管理系統設計報告

一、 系統整體架構

實驗要求設計一個圖書管理系統,主要具備以下幾個功能:

 用戶和管理員的登錄:

輸入ID和密碼(其中密碼會變成小圓點隱藏),若ID和密碼正確則登錄成功,進入到主頁面,否則輸出錯誤提示,並清空文本框以方便用戶再次輸入。普通用戶和管理員有不同的賬戶體系,ID密碼不共用,且登錄後的界面不同;

 圖書入庫:

入庫方式分爲單本入庫和批量入庫,由管理員操作。單本入庫要求管理員輸入圖書的編號(必需)、書名、出版社、年份、作者、價格、數量等信息,並對後臺的數據庫中的book表進行更新;批量入庫的方式是從指定的txt文本文件中讀入書的信息,格式爲:book_no_1, Computer Science, Computer Architecture, xxx, 2004, xxx, 90.00, 2 (其中年份、數量是整數類型,價格是兩位小數類型,其餘爲字符串類型),一行爲一本書的信息,批量導入到數據庫中;

 圖書查詢:

普通用戶在登錄成功後即可進行查詢操作,查詢時,用戶可以輸入書號、書名、作者、出版社、類別等信息(至少一個)進行查詢,程序會輸出滿足條件的所有書籍的信息,若用戶未輸入任何查詢信息或沒有查到符合要求的結果,程序會輸出相應的錯誤提示,在每次查詢完成後,程序會清空所有輸入的文本框以方便用戶進行下一次的查詢;

 借書:

借書時用戶輸入自己的借書證號和書號進行借書,借書成功或者失敗程序會分別輸出相應的提示,若借書成功則在數據庫的borrow表中新增相應的借書記錄,同時更新book表中相應書籍的庫存信息;同時,在借書界面中,輸入用戶的借書證號,點擊查詢,程序會輸出該借書證目前借閱的所有書的信息;

 還書:

還書操作與借書在同一個界面完成,相應的,還書用戶只需輸入自己的借書證號和書號即可還書,程序會輸出操作成功或失敗的提示,若還書成功,數據庫的borrow表和book表將AZSA 會進行相應的更新;

 借書證管理:

管理員可以在登陸後增加或者刪除一個借書證;

二、 各模塊功能描述

  1. 用戶登錄:
    這裏寫圖片描述

  2. 圖書查詢
    這裏寫圖片描述

  3. 圖書證管理
    這裏寫圖片描述

  4. 圖書入庫

這裏寫圖片描述
.
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技術:

  1. 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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章