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 会进行相应的更新;
借书证管理:
管理员可以在登陆后增加或者删除一个借书证;
二、 各模块功能描述
用户登录:
图书查询
图书证管理
图书入库
.
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技术:
- 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();}
- Qt+Mysql 图书管理系统设计
- [mysql+qt] 图书管理系统
- Qt+MySQL实现数据库图书管理系统
- 图书管理系统设计
- 图书管理系统设计
- 图书管理系统设计
- SQLite+Qt 图书管理系统设计(具体实现)
- 图书管理系统设计blog
- 图书管理系统数据库设计
- 图书管理系统数据库设计
- 图书管理系统设计流程
- C++ 图书管理系统设计
- 图书管理系统设计报告
- 图书管理系统数据库设计
- Java+MySQL图书管理系统
- 基于QT的图书管理系统
- qt+mysql 制作简易的图书管理系统的一些知识点
- 设计图书管理系统的信息要求;
- 公众号自定义菜单内网页授权登陆url设置
- Candence16.6画封装时出现异常关机
- 【算法题】寻找最少完全平方数
- LeetCode 45 Jump Game II
- qml初学日记(2)- 基本语法
- Qt+Mysql 图书管理系统设计
- RxJava2.0的使用-2
- 海尔COSMOPlat: 世界智能制造的新坐标
- js删除数组元素,快捷方便,删除对象属性
- 机器学习笔记---决策树
- Android中SQL的使用与详解
- poj2151概率入门
- linux服务器上文件编码格式转化shell
- jQuery选择器之可见性筛选选择器