Qt+Mysql 图书管理系统设计

来源:互联网 发布:adobe杀人软件 编辑:程序博客网 时间:2024/05/17 03:14

图书管理系统设计报告

一、 系统整体架构

实验要求设计一个图书管理系统,主要具备以下几个功能:

 用户和管理员的登录:

输入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 keypassword    varchar(20) name    varchar(10) tel varchar(11)

书book

Bno Char(8) *primary keyCategory    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 keyName    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();}
原创粉丝点击