做这个项目之前我没接触过Qt 我也没做过项目,如果贪吃蛇算项目的话。。我只是粗略的看完了C++ Primer。。
我是照着一篇SQL+JAVA的思路合着Qt快速上手完成的项目合着老师的要求
1.需求分析
1.1用户需求
面向三类用户:超级管理员、管理员、学生
超级管理员可对学生、管理员信息作查询、增加、修改操作
管理员可对书籍进行查询、增加、修改操作,可对学生的借书情况进行查看
学生可以对已借书籍进行续借、也可对未借书籍进行预约
三类用户必须输入正确的ID及PASSWORD方可进入系统
1.2 业务流程分析
该系统功能模块:
学生、管理员、超级管理员
- 登陆功能:登陆系统为身份验证登陆,分为学生登陆,管理员登陆,超级管理员登陆,不具备注册功能
- 学生登陆后:显示该用户的基本信息,可续借已借书籍,可预约未借书籍
- 管理员登陆后:显示该用户的基本信息,对书籍进行相应操作、查看学生的借还情况
- 超级管理员登陆后:显示该用户的基本信息,对管理员、学生进行相应操作
学生 - 预约书籍:查询到书籍后,可对书籍进行预约
- 已借书籍:可对已借书籍进行续借
管理员
- 增加书籍:可直接向数据库输入新的书籍信息
- 修改书籍信息:查看书籍具体信息后,可对书籍信息进行修改
- 对学生借还的情况进行查看
超级管理员
- 增加管理员:增加一个新的管理员
- 查看管理员信息:查看管理员信息后,可对其进行修改
- 增加学生:增加一个新的学生用户
- 查看学生信息:查看学生信息后,可对其进行修改
2.BPM模型(这里我就贴我用PD画的模型吧)
3.原型(使用Axure)
嗯我画的很粗略就随便看看好了,和最后实现的界面布局也差很多
4.数据库设计(CDM->LDM->PDM->SQL)
表有book、student、administrator、superadministrator、borrow、reserve
create table book(
bno varchar(10),
bname varchar(30),
bAuthor varchar(20),
bnum int,
primary key(bno)
);
create table student(
ID varchar(10) ,
PASSWORD varchar(10),
primary key(ID)
);
create table administrator(
ID varchar(10),
PASSWORD varchar(10),
primary key(ID)
);
create table superadministrator(
ID varchar(10),
PASSWORD varchar(10),
primary key(ID)
);
create table book_borrow(
ID varchar(10),
bno varchar(10),
primary key(ID,bno),
foreign key(ID) references student(ID) on delete cascade,
foreign key(bno) references book(bno) on delete cascade);
create table reserve (
bno varchar(10),
ID varchar(10),
primary key(bno,ID),
foreign key(bno) references book(bno) on delete cascade,
foreign key(ID) references student(ID) on delete cascade);
以下是一些插入数据
insert into book values
('100001','C++ Primer','Stanley B. Lippman',100),
('100002','Database System Concepts','Avi Silberschatz',100),
('100003','数据结构算法与应用C++语言描述','Sartaj Sahni',100),
('100004','数据库系统概论','王珊',100),
('100005','数据结构C语言版','严蔚敏',100);
insert into student values('1170210042','123456');
insert into administrator values('leslie','123456');
insert into superadministrator values('leslie5','123456');
insert into book_borrow values('1170210042','100001');
insert into reserve values (100004,1170210042);
5.Qt实现
1.连接mysql数据库
请安装32位MySQL以及32位Qt5.2以上版本 我的32位Qt连接不上64位的MySQL
Qt 5.2以上版本已编译好连接MySQL的驱动,我们就可以偷偷用了嘿嘿
在连接之前,在MySQL安装目录将lib文件夹下的 libmysql.dll 文件拷贝置Qt安装目录bin下(我的是C:\QT\Qt5.11.2\5.11.2\mingw53_32\bin)
在这里注意!在之后编译的时候请务必选对编译器版本!!
由于我们放入的是mingw53_32文件夹下,所以在kit套件选择MinGW编译!否则会显示连接失败!(当然你可以选择放在其他目录下选择其他套件)
新建一个Qt Widgets Application,修改.pro文件QT +=sql
测试代码:
#include "mainwindow.h"
#include <QApplication>
#include<QSqlDatabase>
#include "book_student.h"
#include<QMessageBox>
#include<QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QTextCodec>
bool creatConnect();
QString MainWindow::u;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
creatConnect();
MainWindow w;
w.show();
return a.exec();
}
bool creatConnect()
{
QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("library");
db.setUserName("root");
db.setPassword("123456");
bool ok = db.open();//建立数据库连接
if(!ok)
{
QMessageBox::critical(0,QObject::tr("连接数据库失败!!!"),db.lastError().text());
return false;
}
else
{
QMessageBox::information(0,QObject::tr("Tips"),QObject::tr("连接数据库成功!!!"));
return true;
}
}
将相应的数据改成你的MySQL数据,运行,连接成功会有弹框提示
2.下面贴一下cpp代码
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<book_student.h>
#include<QTableWidget>
#include<QSqlQuery>
#include<QSqlRecord>
#include<QDebug>
#include<QMessageBox>
#include<QStandardItemModel>
#include<QTableView>
#include<QString>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("图书管理系统主窗口");
ui->PAlineEdit->setEchoMode(QLineEdit::Password);
MainWindow::student=new book_student(this);
MainWindow::administrator=new book_administrator(this);
MainWindow::superadministrator=new book_super_administrator(this);
MainWindow::brw=new Book_Borrow(this);
//MainWindow::rsw=new Reserve;
ui->book_search->setPlaceholderText("请输入书名");
ui->tableWidget->setRowCount(100); //设置行数为10
ui->tableWidget->setColumnCount(4); //设置列数为5
ui->tableWidget->setColumnWidth(1,200);
ui->tableWidget->setColumnWidth(2,200);
QStringList header;
header<<"Book_No"<<"Book_Name"<<"Book_Author"<<"Book_number";
ui->tableWidget->setHorizontalHeaderLabels(header);
QSqlQuery query;
query.exec("select * from book");
int k=-1;
while(query.next()){
++k;
for(int i=0;i<4;++i)ui->tableWidget->setItem(k,i,new QTableWidgetItem(query.value(i).toString()));
}
//The Sign out
/* connect(student->Signout,SIGNAL(clicked()),this,SLOT(reshow()));
connect(administrator->Signout,SIGNAL(clicked()),this,SLOT(reshow()));
connect(superadministrator->Signout,SIGNAL(clicked()),this,SLOT(reshow()));*/
//Student's borrow
connect(student->Borrowed,SIGNAL(clicked()),this,SLOT(create()));
//admini's book manage
//connect(administrator->)
//connect(brw,SIGNAL(sendData(QString)),this,SLOT(receiveData(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString username=ui->IDlineEdit->text();
QString userpassword=ui->PAlineEdit->text();
QSqlQuery query;
MainWindow::u=username;
if(ui->radioButton->isChecked()){//student
query.prepare("select PASSWORD from student where ID=:ll");
query.bindValue(":ll",username);
query.exec();
query.first();
QString password=query.value(0).toString();
if(password==userpassword){
student->exec();
ui->IDlineEdit->clear();
ui->PAlineEdit->clear();
}else{
QMessageBox::warning(this,"错误","用户名或密码错误!","确定");
}
}
else if(ui->radioButton_2->isChecked()){//administrator
query.prepare("select PASSWORD from administrator where ID=:ll");
query.bindValue(":ll",username);
query.exec();
query.first();
QString password=query.value(0).toString();
if(password==userpassword){
administrator->exec();
ui->IDlineEdit->clear();
ui->PAlineEdit->clear();
}else{
QMessageBox::warning(this,"错误","用户名或密码错误!","确定");
}
}
else if(ui->radioButton_3->isChecked()){//superadministrator
query.prepare("select PASSWORD from superadministrator where ID=:ll");
query.bindValue(":ll",username);
query.exec();
query.first();
QString password=query.value(0).toString();
if(password==userpassword){
superadministrator->exec();
ui->IDlineEdit->clear();
ui->PAlineEdit->clear();
}else{
QMessageBox::warning(this,"错误","用户名或密码错误!","确定");
}
}
}
void MainWindow::on_search_button_clicked()
{
QString book_name=ui->book_search->text();
QSqlQuery query;
/*if(book_name.length()==0){QMessageBox::warning(this,"错误","请输入书名!","确定");return;}*/
ui->tableWidget->clearContents();
query.prepare("select * from book where bname like :ll");
query.bindValue(":ll","%"+book_name+"%");//模糊查询
query.exec();
int k=-1;
while(query.next()){
++k;
for(int i=0;i<4;++i)ui->tableWidget->setItem(k,i,new QTableWidgetItem(query.value(i).toString()));
}
ui->book_search->clear();
}
void MainWindow::reshow(){
this->show();
}
void MainWindow::create(){
QSqlQuery query;
QStandardItemModel *model=new QStandardItemModel();
//brw->table=new QTableView();
model->setColumnCount(1);
model->setHeaderData(0,Qt::Horizontal,"book_name");
query.prepare("select bname from book where bno in (select bno from book_borrow where ID=:ll)");
query.bindValue(":ll",MainWindow::u);
query.exec();
int k=-1;
while(query.next()){
++k;
model->setItem(k,new QStandardItem(query.value(0).toString()));
}
brw->table->setModel(model);
brw->table->setColumnWidth(0,200);
brw->setWindowTitle("您已借");
brw->exec();
}
/*void MainWindow::receiveData(QString data){
ui->lineEdit->setText(data);
}
*/
book_student.cpp
#include "book_student.h"
#include "ui_book_student.h"
#include<QMessageBox>
#include"mainwindow.h"
#include<QTableView>
#include<QStandardItemModel>
#include<QDebug>
#include<QString>
book_student::book_student(QWidget *parent) :
QDialog(parent),
ui(new Ui::book_student)
{
ui->setupUi(this);
book_student::rsw=new Reserve(this);
this->setWindowTitle("学生");
this->Signout=ui->pushButton;
this->Borrowed=ui->pushButton_3;
this->reserve=ui->pushButton_2;
}
book_student::~book_student()
{
delete ui;
}
void book_student::on_pushButton_clicked()//sign out
{
this->close();
}
void book_student::on_pushButton_3_clicked()//borrowed
{
}
void book_student::on_pushButton_2_clicked()//reserve
{
rsw->exec();
}
book_delete.cpp
#include "book_delete.h"
#include "ui_book_delete.h"
#include<QSqlQuery>
#include<QMessageBox>
Book_Delete::Book_Delete(QWidget *parent) :
QDialog(parent),
ui(new Ui::Book_Delete)
{
ui->setupUi(this);
this->line=ui->lineEdit;
}
Book_Delete::~Book_Delete()
{
delete ui;
}
void Book_Delete::on_pushButton_clicked()
{
if(!ui->lineEdit->text().length()){
QMessageBox::warning(this,"错误!","请输入Book_No!");
return;
}
QSqlQuery query;
query.prepare("delete from book where bno=:ll");
query.bindValue(":ll",ui->lineEdit->text());
query.exec();
QMessageBox::information(this,"恭喜!","书籍信息及相关信息删除成功!");
}
book_borrow.cpp
#include "book_borrow.h"
#include "ui_book_borrow.h"
Book_Borrow::Book_Borrow(QWidget *parent) :
QDialog(parent),
ui(new Ui::Book_Borrow)
{
ui->setupUi(this);
this->table=ui->tableView;
//connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(buttonBox_accepted()));
}
Book_Borrow::~Book_Borrow()
{
delete ui;
}
/*void Book_Borrow::on_pushButton_clicked()
{
}
void Book_Borrow::buttonBox_accepted(){
emit sendData(ui->lineEdit->text());
}*/
book_administrator.cpp
#include "book_administrator.h"
#include "ui_book_administrator.h"
#include<QTableView>
#include<QStandardItemModel>
#include<QSqlQuery>
#include<QDebug>
book_administrator::book_administrator(QWidget *parent) :
QDialog(parent),
ui(new Ui::book_administrator)
{
ui->setupUi(this);
this->setWindowTitle("管理员");
this->Signout=ui->pushButton;
this->book_rsw=ui->pushButton_3;//预约情况
this->book_brw=ui->pushButton_2;//借还情况
book_administrator::brw=new Book_Borrow();
book_administrator::jiehuan=new Book_Borrow();
book_administrator::chose=new Choose();
}
book_administrator::~book_administrator()
{
delete ui;
}
void book_administrator::on_pushButton_clicked()//Sign Out
{
this->close();
}
void book_administrator::on_pushButton_3_clicked()//学生预约
{
//book_administrator::brw->table=new QTableView;
QStandardItemModel *model=new QStandardItemModel();
model->setColumnCount(2);
model->setHeaderData(0,Qt::Horizontal,"Book_No");
model->setHeaderData(1,Qt::Horizontal,"Student_ID");
QSqlQuery query;
query.exec("select * from reserve");
int k=-1;
while(query.next()){
++k;
for(int i=0;i<2;++i)model->setItem(k,i,new QStandardItem(query.value(i).toString()));
}
book_administrator::brw->table->setModel(model);
book_administrator::brw->setWindowTitle("学生预约情况");
book_administrator::brw->exec();
}
void book_administrator::on_pushButton_4_clicked()//学生借还
{
QStandardItemModel *model=new QStandardItemModel();
model->setColumnCount(2);
model->setHeaderData(0,Qt::Horizontal,"ID");
model->setHeaderData(1,Qt::Horizontal,"Book_No");
QSqlQuery query;
query.exec("select * from book_borrow");
int k=-1;
while(query.next()){
++k;
for(int i=0;i<2;++i)model->setItem(k,i,new QStandardItem(query.value(i).toString()));
}
book_administrator::jiehuan->table->setModel(model);
book_administrator::jiehuan->setWindowTitle("学生借还情况");
book_administrator::jiehuan->exec();
}
void book_administrator::on_pushButton_2_clicked()
{
chose->setWindowTitle("请选择您要进行的操作");
chose->exec();
}
admini_delete.cpp
#include "admini_delete.h"
#include "ui_admini_delete.h"
#include<QSqlQuery>
#include<QMessageBox>
Admini_Delete::Admini_Delete(QWidget *parent) :
QDialog(parent),
ui(new Ui::Admini_Delete)
{
ui->setupUi(this);
this->setWindowTitle("管理员删除");
}
Admini_Delete::~Admini_Delete()
{
delete ui;
}
void Admini_Delete::on_pushButton_clicked()
{
if(!ui->lineEdit->text().length()){
QMessageBox::warning(this,"错误!","请输入管理员编号!");
return;
}
QSqlQuery query;
query.prepare("delete from administrator where ID=:ll");
query.bindValue(":ll",ui->lineEdit->text());
query.exec();
QMessageBox::information(this,"恭喜!","信息删除成功!");
ui->lineEdit->clear();
}
admini_insert.cpp
#include "adimi_insert.h"
#include "ui_adimi_insert.h"
#include<QSqlQuery>
#include<QMessageBox>
Adimi_Insert::Adimi_Insert(QWidget *parent) :
QDialog(parent),
ui(new Ui::Adimi_Insert)
{
ui->setupUi(this);
this->setWindowTitle("管理员添加");
}
Adimi_Insert::~Adimi_Insert()
{
delete ui;
}
void Adimi_Insert::on_pushButton_clicked()
{
if(!(ui->lineEdit->text().length()&&ui->lineEdit_2->text().length())){
QMessageBox::warning(this,"错误!","请填入信息!");
return;
}
QSqlQuery query;
query.prepare("insert into administrator values(:kk,:ll)");
query.bindValue(":kk",ui->lineEdit->text());
query.bindValue(":ll",ui->lineEdit_2->text());
query.exec();
QMessageBox::information(this,"恭喜!","插入成功!");
ui->lineEdit->clear();
ui->lineEdit_2->clear();
}
book_superadministrator.cpp
#include "book_super_administrator.h"
#include "ui_book_super_administrator.h"
book_super_administrator::book_super_administrator(QWidget *parent) :
QDialog(parent),
ui(new Ui::book_super_administrator)
{
ui->setupUi(this);
this->setWindowTitle("超级管理员");
this->Signout=ui->pushButton;
book_super_administrator::ade=new Admini_Delete();
book_super_administrator::ait=new Adimi_Insert();
book_super_administrator::sde=new Stu_Delete();
book_super_administrator::sit=new Stu_Insert();
}
book_super_administrator::~book_super_administrator()
{
delete ui;
}
void book_super_administrator::on_pushButton_clicked()//Sign Out
{
this->close();
}
void book_super_administrator::on_pushButton_2_clicked()//管理员删除
{
ade->exec();
}
void book_super_administrator::on_pushButton_3_clicked()//管理员添加
{
ait->exec();
}
void book_super_administrator::on_pushButton_4_clicked()//学生删除
{
sde->exec();
}
void book_super_administrator::on_pushButton_5_clicked()//学生添加
{
sit->exec();
}
choose.cpp
#include "choose.h"
#include "ui_choose.h"
#include<QMessageBox>
Choose::Choose(QWidget *parent) :
QDialog(parent),
ui(new Ui::Choose)
{
ui->setupUi(this);
Choose::ist=new Insert();
Choose::dlt=new Book_Delete();
}
Choose::~Choose()
{
delete ui;
}
void Choose::on_pushButton_clicked()
{
ist->setWindowTitle("请填入相关信息");
ist->exec();
}
void Choose::on_pushButton_2_clicked()
{
QMessageBox::information(this,"注意!","删除书籍同时会删除学生的预约和借阅信息!");
dlt->setWindowTitle("请输入要删除的图书编号");
dlt->line->setPlaceholderText("请输入Book_No");
dlt->exec();
}
insert.cpp
#include "insert.h"
#include "ui_insert.h"
#include<QMessageBox>
#include<QSqlQuery>
Insert::Insert(QWidget *parent) :
QDialog(parent),
ui(new Ui::Insert)
{
ui->setupUi(this);
}
Insert::~Insert()
{
delete ui;
}
void Insert::on_pushButton_clicked()
{
if(!(ui->Book_ID->text().length()&&ui->Book_Name->text().length()&&ui->Book_Author->text().length()&&ui->Book_number->text().length())){
QMessageBox::warning(this,"错误!","请勿空输入!");
return;
}
QSqlQuery query;
query.prepare("insert into book values(:hh,:jj,:kk,:ll)");
query.bindValue(":hh",ui->Book_ID->text());
query.bindValue(":jj",ui->Book_Name->text());
query.bindValue(":kk",ui->Book_Author->text());
query.bindValue(":ll",ui->Book_number->text().toInt());
query.exec();
QMessageBox::information(this,"恭喜!","插入书籍信息成功!");
}
reserve.cpp
#include "reserve.h"
#include "ui_reserve.h"
#include<QString>
#include<QSqlQuery>
#include<QMessageBox>
#include<mainwindow.h>
Reserve::Reserve(QWidget *parent) :
QDialog(parent),
ui(new Ui::Reserve)
{
ui->setupUi(this);
this->setWindowTitle("预约书籍");
ui->book_search->setPlaceholderText("请输入书名");
ui->resline->setPlaceholderText("请输入Book_No");
ui->tableWidget->setRowCount(100); //设置行数为10
ui->tableWidget->setColumnCount(4); //设置列数为5
ui->tableWidget->setColumnWidth(1,200);
ui->tableWidget->setColumnWidth(2,200);
QStringList header;
header<<"Book_No"<<"Book_Name"<<"Book_Author"<<"Book_number";
ui->tableWidget->setHorizontalHeaderLabels(header);
QSqlQuery query;
query.exec("select * from book");
int k=-1;
while(query.next()){
++k;
for(int i=0;i<4;++i)ui->tableWidget->setItem(k,i,new QTableWidgetItem(query.value(i).toString()));
}
}
Reserve::~Reserve()
{
delete ui;
}
void Reserve::on_pushButton_clicked()
{
QString book_name=ui->book_search->text();
QSqlQuery query;
if(book_name.length()==0){QMessageBox::warning(this,"错误","请输入书名!","确定");return;}
ui->tableWidget->clearContents();
query.prepare("select * from book where bname like :ll");
query.bindValue(":ll","%"+book_name+"%");//模糊查询
query.exec();
int k=-1;
while(query.next()){
++k;
for(int i=0;i<4;++i)ui->tableWidget->setItem(k,i,new QTableWidgetItem(query.value(i).toString()));
}
}
void Reserve::on_pushButton_2_clicked()
{
QString book_No=ui->resline->text();
QSqlQuery query;
if(book_No.length()==0){QMessageBox::warning(this,"错误","请输入Book_No!","确定");return;}
query.prepare("select bnum from book where bno=:ll");
query.bindValue(":ll",book_No);
query.exec();
query.first();
int val=query.value(0).toInt();
if(val){
QMessageBox::information(this,QString("恭喜!"),QString("您已预约成功,请在24小时之内入图书馆借阅!"));
query.prepare("update book set bnum =bnum-1 where bno=:ll");
query.bindValue(":ll",book_No);
query.exec();
query.prepare("insert into reserve values (:ll,:kk)");
query.bindValue(":kk",MainWindow::u);
query.bindValue(":ll",book_No);
query.exec();
}else{
QMessageBox::warning(this,QString("Sorry!"),QString("本书不存在或库存为空"));
}
}
stu.delete.cpp
#include "stu_delete.h"
#include "ui_stu_delete.h"
#include<QSqlQuery>
#include<QMessageBox>
Stu_Delete::Stu_Delete(QWidget *parent) :
QDialog(parent),
ui(new Ui::Stu_Delete)
{
ui->setupUi(this);
this->setWindowTitle("学生删除");
}
Stu_Delete::~Stu_Delete()
{
delete ui;
}
void Stu_Delete::on_pushButton_clicked()
{
if(!ui->lineEdit->text().length()){
QMessageBox::warning(this,"错误!","请输入学生编号!");
}
QSqlQuery query;
query.prepare("delete from student where ID=:ll");
query.bindValue(":ll",ui->lineEdit->text());
query.exec();
QMessageBox::information(this,"恭喜!","删除成功!");
ui->lineEdit->clear();
}
stu.insert.cpp
#include "stu_insert.h"
#include "ui_stu_insert.h"
#include<QSqlQuery>
#include<QMessageBox>
Stu_Insert::Stu_Insert(QWidget *parent) :
QDialog(parent),
ui(new Ui::Stu_Insert)
{
ui->setupUi(this);
this->setWindowTitle("学生添加");
}
Stu_Insert::~Stu_Insert()
{
delete ui;
}
void Stu_Insert::on_pushButton_clicked()
{
if(!(ui->lineEdit->text().length()&&ui->lineEdit_2->text().length())){
QMessageBox::warning(this,"错误!","请输入信息!");
return;
}
QSqlQuery query;
query.prepare("insert into student values(:kk,:ll)");
query.bindValue(":kk",ui->lineEdit->text());
query.bindValue(":ll",ui->lineEdit_2->text());
query.exec();
QMessageBox::information(this,"恭喜!","插入成功!");
ui->lineEdit->clear();
ui->lineEdit_2->clear();
}