您的位置:首页 > 编程语言 > Qt开发

[mysql+qt] 图书管理系统

2016-04-22 11:50 691 查看
一.图书管理数据库概念模式设计

图书管理系统包括了游客、用户登录、管理员登录三种模式。

在游客模式下,可以实现检索书籍的功能。

游客可以注册用户,但是借书权限需要管理员授予。

用户登录后,在检索书籍功能的基础上,还可以进行书籍的借阅,并且查看自己的借还情况。

管理员登录后,可以对图书进行管理,即入库新的书籍,也可以对用户进行管理,即授予用户借书证,注销用户。



二.数据库设计

管理员(manager)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

Password

varchar(20) not null

密码

用户(user)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

Password

varchar(20) not null

密码

图书(book)

属性

主码/外码

数据类型

说明

book_id

主码

char(5)

编号

Name

varchar(20) not null

书名

Price

float(9,2)

价格

Number

int unsigned

数量

storage_date

date

入库时间

manage_name

外码,参照manager

varchar(20)

入库人员

Publisher

varchar(15) not null

出版社

publish_year

year

出版日期

Type

varchar(10) not null

分类

作者信息(book_author)

属性

主码/外码

数据类型

说明

Book_id

主码

外码,参照book

char(5)

编号

Author_name

主码

varchar(20)

作者

借阅(loan)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

book_id

主码

char(5)

编号

loan_number

主码

int unsigned

单册编号

loan_date

date

借阅日期

三.开发技术

本次图书管理系统用MySql和qt进行开发。两者都是知名的跨平台、开源的项目。

mysql被广泛应用于web开发中,相比起其他数据库,其体积较小,而且被多种语言支持,是非常流行的开源关系型数据库。

qt是基于C++的图形界面开发库,它提供了基本窗口控件对象绘制、网络、多线程开发、数据库连接、XML使用等功能。

基于mysql开发的qt应用程序的搭建非常简单,只需安装32位的mysql和qt creator,然后把mysql提供的libmysql.dll放到qt的bin下,而不需要安装特别的插件,因为qt已经默认安装了mysql的驱动。

对于mysql,qt提供了两种驱动,一种是QMYSQL驱动程序,另一种是QODBC驱动程序,在这里我们选择了前者。



qt的数据库驱动程序

qt提供了两种操纵数据库的方式,一种是使用QSqlQuery类,就可以直接使用底层的SQL语句,另一种是使用QsqlTableModel,使用者不需要了解SQL语法,qt对sql语句进行了很好的封装,在这里我们选择了QSqlQuery。

四.详细设计

1.图书搜索

只提供图书检索功能,游客可以选择注册,但是借书权限需要管理员添加。

图书检索实例:



检索采用了‘%string%’形式,可以搜索到包含用户输入字符串的信息。

用户可以不用填写所有信息,只需填写一部分感兴趣的信息即可。代码会根据用户的输入生成相应的SQL查询代码。

为了便于编程,搜索采取的是所有信息的交集,如果想要检索并集,只能分别查询。这样的设计已经基本能够满足用户的搜索需求了。

左侧的类型和右侧的搜索栏是独立的,它们点击后的搜索是单独进行的,而不是取交集。

该系统会对用户输入的语句进行简单的判断,在一些异常情况下,会给出一些提示:



如果是错误的输入,会有sql底层的警告信息:



如果没有查找到结果,也会给出提示。



注:因为没有写预备语句,查询不能保证安全性,对于有意的破坏性语句(sql注入),可能会导致数据库的崩溃。

2.用户注册



注册过程中也会对用户输入的信息做出相应的判断:



注册完成后,会向user表中插入user信息,借书权限默认为false。

3.用户/管理员登录

登录时,会根据用户输入的用户名,在数据库在搜索密码,如果没有搜到,提示用户名不存在,如果搜到的密码和用户输入不匹配,提示密码错误。



切换用户和管理员登录,只需在上面的分栏选择。

游客身份,显示图书搜索界面

用户身份,显示图书搜索、借阅情况界面

管理员身份,显示图书搜索、用户管理、单册入库、多册入库界面

4.借阅情况

在借阅情况窗口,用户可以查到自己的借阅信息,包括书本编号、名称,以及借阅、归还日期。单册编号是为了维护借阅关系的主码,针对一本书被借多次的情况设置的。



同时,用户可在这里进行归还书籍操作。

点击归还后,借阅信息动态更新。同时可以发现,在用户登录后,查询书籍的界面多了一个借阅书籍的按钮,用户可以在查询的过程中进行书本借阅操作,如:



借阅成功后,库存量会减少,然后用户借阅窗口的信息也会动态更新。

如果用户没有选中书籍,或者用户借阅数量已经达到上限,都会给出警告:



5.用户管理

以管理员身份登录后,可以对用户进行管理,在这里可以看到用户的几乎所有信息。同时也可以执行删除/授予借书权限、用户删除操作。

判断是删除还是授予权限,是由用户当前的状态决定。



如果一个用户有未归还的书籍,管理系统会禁止删除操作:



6.单册入库





信息必须全部填写,否则不允许插入:



只有全部填写才能插入书籍:



在插入的同时,会给书籍设置一个编号,编号通过如下算法得到:

id = select count(*)from book

while(exist id) id++

之所以执行第二步,是因为数据库可能因为删除书籍操作导致中间部分编号的缺失。

同时,还会存入当前的入库人员(管理员),入库时间等信息。入库时间是通过获取系统时间得到的,如果计算机的系统时间被篡改了,我们也没有很好的办法。

插入成功后,输入框会自动清空,便于下一次入库。

很遗憾的是,这里并没有对输入数据进行类型检查(预处理操作),所以输入了什么错误的东西,数据库也会一并接收。

删除书籍只提供了指定书的编号删除的功能。因为删除书时一般都有明确的导向,不像查询书籍,需要实现复合条件搜索功能。

7.多册入库

除了单册入库,我们还提供了多册入库的功能,包括了表格的填写,和文本文件的读入:



表格填写入库。

直接点击表格,就可以对内容进行编辑。



如果管理员插入了和原来相同的书籍,我们会询问管理员是否需要合并,如果点击确认,就将原来书籍的数量更新,否则将取消入库。

表格插入也会检测用户输入是否完整的数据,最后是一条条插入数据的。如果哪一条插入失败,会有单独的提示。

同样,我们可以通过文件读入来批量录入,点击右上角的加载文件,文件需要按照一定的格式书写,并且只支持.txt后缀的文件。



以下是一个预先准备好的文件:



读入后的显示效果如下:



此时文件还没有加载到数据库里,需要点击提交表单。

由于这里限定一页只显示13列,而文本有时会有超过13条书本信息的记录,所以点击了提交后,只提交13本书的信息,剩下的书本记录会在提交后继续加载到表格中。

也就是说,对于多条数据,管理员需要多次提交表单。

mysql建立数据库代码:

CREATE SCHEMA `book_manage` ;
use book_manage;
set autocommit=0;

create table `manager`
(
`username` varchar(20),
`password` varchar(20) not null,
primary key(`username`)
);

create table `user`
(
`username` varchar(20) not null,
`password` varchar(20) not null,
primary key (`username`)
);

create table `book`
(
`book_id` char(5),
`name` varchar(20) not null,
`price` float(9,2) unsigned,
`number` int unsigned not null,
`storage_date` date,
`manage_name` char(20),
`publisher` varchar(15) not null,
`publish_year` year,
`type` varchar(10) not null,
primary key(`book_id`),
foreign key(`manage_name`) references `manager`(`username`)
);

create table `book_author`
(
`book_id` char(5),
`author_name` varchar(20),
primary key(`author_name`,`book_id`),
foreign key(`book_id`) references `book`(`book_id`) on delete cascade on update cascade
);

create table `loan`
(
`username` char(20),
`book_id` char(5),
`loan_date` date,
`loan_number` int unsigned,
primary key(`username`,`book_id`,`loan_number`),
foreign key(`username`) references `user`(`username`),
foreign key(`book_id`) references `book`(`book_id`)
);


database.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-04-03T16:38:55
#
#-------------------------------------------------

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Database
TEMPLATE = app

QTPLUGIN += QSQLMYSQL

SOURCES += main.cpp\
database.cpp

HEADERS  += database.h

INCLUDEPATH += "C:/Program Files (x86)/MySQL/MySQL Server 5.7/include"

LIBS += "C:/Program Files (x86)/MySQL/MySQL Server 5.7/lib/libmysql.lib"


database.h

#ifndef DATABASE_H
#define DATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVector>

class QWidget;
class QLineEdit;
class QComboBox;
class QPushButton;
class QLabel;
class QGridLayout;
class QTabWidget;
class QVBoxLayout;
class QHBoxLayout;
class QTreeWidget;
class QTreeWidgetItem;
class QGroupBox;
class QToolButton;
class QTableWidget;
class QCheckBox;
class QTableWidgetItem;
class QTimer;

class database : public QObject
{
Q_OBJECT

private:

enum{MANAGER,USER,VISITOR,USER_LOGIN,USER_REGISTER};
QString current_user;

int user_type;
int current_page;
int max_page;

int user_current_page;
int user_max_page;
int user_num;

int current_row_number;

QTimer *timer;

QTableWidget *tablewidget;
QGridLayout *gridLayout ;
QVBoxLayout *vboxLayout0;
QVBoxLayout *vboxLayout1;
QVBoxLayout *vboxLayout ;
QWidget *titleImage;

QVBoxLayout *vboxLayout3;
QVBoxLayout *vboxLayout2;
QHBoxLayout *hboxLayout1;
QHBoxLayout *hboxLayout ;
QHBoxLayout *hboxLayout2;
QHBoxLayout *hboxLayout3;

QLabel *spacelabel2;
QLabel *spacelabel3;
QGroupBox *groupbox;
QGroupBox *groupbox1;
QPushButton *clearbutton;
QPushButton *searchbutton;
QPushButton *registerbutton;
QPushButton *loginbutton;
QPushButton *quitloginbutton;
QLabel *label;

QTreeWidget *tree;
QTreeWidgetItem *root;

QLineEdit *nameLine;
QLineEdit *publishLine;
QLineEdit *priceLine;
QLineEdit *priceLine1;
QLineEdit *authorLine;
QComboBox *dateBox;
QComboBox *dateBox1;
QComboBox *isLent;
QWidget *window;

QPushButton *nextbutton;
QPushButton *lastbutton;

QSqlDatabase db;
QSqlQuery query;

QTabWidget *mainTabWidget;
QTabWidget *loginTabWidget;
QWidget *user_loginWidget;
QWidget *manager_loginWidget;

QLineEdit *username1;
QLineEdit *password1;
QLineEdit *username2;
QLineEdit *password2;

QPushButton *okbutton;
QVBoxLayout *vboxLayout4;
QVBoxLayout *vboxLayout5;
QVBoxLayout *vboxLayout6;
QHBoxLayout *hboxLayout4;
QHBoxLayout *hboxLayout5;
QHBoxLayout *hboxLayout6;
QGridLayout *gridLayout2;
QTabWidget *manageTabWidget;
QWidget *addBookWidget;
QLabel *label2;

QLineEdit *nameLine2;
QComboBox *typeBox2;
QLineEdit *priceLine2;
QLineEdit *authorLine2;
QLineEdit *numLine2;
QLineEdit *publishLine2;
QComboBox *dateBox2;

QWidget *window1;
QWidget *window2;
QWidget *window3;
QWidget *window4;
QWidget *window5;

QWidget *registerWindow;
QLabel *label3;
QLineEdit *nameLine3;
QLineEdit *passwordLine1;
QLineEdit *passwordLine2;
QPushButton *registerOkButton;
QHBoxLayout *hboxLayout7;
QHBoxLayout *hboxLayout8;
QVBoxLayout *vboxLayout7;
QGridLayout *gridLayout3;
QLabel *label4;
QVector<QString>result;

QLabel *label5;
QLineEdit *idLine;
QVBoxLayout *vboxLayout9;
QHBoxLayout *hboxLayout9;
QWidget *deletebookWidget;
QPushButton *deleteOkButton;

QTableWidget *tablewidget1;
QVBoxLayout *vboxLayout10;
QHBoxLayout *hboxLayout10;
QPushButton *deleteUserButton;
QPushButton *grantLentButton;
QPushButton *lastPageButton;
QPushButton *nextPageButton;
QTableWidgetItem *item0[13];
QTableWidgetItem *item1[13];
QVector<QString*>userMessage;

QTableWidgetItem *item2[10];
QTableWidgetItem *item3[10];
QPushButton *lendBookButton;

QTableWidget *tablewidget2;
QVector<QString*>loanMessage;
QHBoxLayout *hboxLayout11;
QVBoxLayout *vboxLayout11;
QTableWidgetItem *item4[3];
QPushButton *returnBookButton;

QTableWidget *tablewidget3;
QVBoxLayout *vboxLayout12;
QHBoxLayout *hboxLayout12;
QPushButton *addBookOkButton;
QPushButton *addBookClearButton;

QComboBox *bookType[13];
QComboBox *publishDate[13];
QString bookMessage[7];

QLabel *tipLabel;
QWidget *fileWindow;
QHBoxLayout *hboxLayout13;
QPushButton *loadFileButton;
QVector<QString*>multiBookMessage;

void setLayout();
bool createConnection();

void setWindowShowBook(int type);
void setWindowSearchBook(int type);
void setWindowAddBook();
void setWindowUserManage();
void setWindowLoanBook();
void setWindowMutiAddBook();
void setWindowTitle();

void updateManageWindow();
void updateShowBookWindow();
void updateLoanBookWindow();
void updateTitle(int type);

bool addBook();

void loadUserMessage();
void loadLoanMessage();

QWidget* createLoginWindow(int type);

public:

database(QObject *parent = 0);
~database();

private slots:

void searchBook();
void updateTime();
void clear();
void quitLogin();
void returnBook();
void managerLogin();
void deleteLogin();
void bookLastPage();
void bookNextPage();
void deleteBook();
void searchBookByType(QTreeWidgetItem*,int);
void userLogin();
void setWindowRegister();
void setWindowLogin();
void Register();
void deleteUser();
void grantLent();
void userNextPage();
void userLastPage();
void lendBook();
void oneAddBook();
void mutiAddBook();
void clearAddBookMessage();
void openFile();
};

#endif // DATABASE_H


database.cpp

/*  _______________________
|                       |
|  author:fish1996      |
|  start:2016/04/03     |
|  finish:2016/04/22    |
|  tool:mysql+qtCreator |
|  图书管理系统           |
|                       |
———————————————————————
*/
#include "database.h"
#include <QWidget>
#include <QLineEdit>
#include <QLayout>
#include <QComboBox>
#include <QLabel>
#include <QFrame>
#include <QGroupBox>
#include <QPushButton>
#include <QTabWidget>
#include <QTreeWidget>
#include <QPalette>
#include <QBrush>
#include <QPixmap>
#include <QDateTime>
#include <QtSql>
#include <QStringList>
#include <QPluginLoader>
#include <QMessageBox>
#include <QCheckBox>
#include <QTableWidget>
#include <QTimer>
#include <QDir>
#include <QFileDialog>

/* 构造函数 */
database::database(QObject *parent)
: QObject(parent)
{
//初始化变量
user_num = 0;
user_type = VISITOR;
current_user = "游客";

//新建计时器
timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));
timer->start(1000);

//初始化指针
tablewidget = NULL;
tablewidget2 = NULL;
nextbutton = NULL;
lastbutton = NULL;
hboxLayout6 = NULL;
lastbutton = NULL;
nextbutton = NULL;

deleteUserButton = NULL;
grantLentButton = NULL;
lendBookButton = NULL;
returnBookButton = NULL;

window4 = NULL;

for(int i=0;i<10;i++){
item2[i] = NULL;
item3[i] = NULL;
}

//窗口布局
setLayout();

//连接数据库
createConnection();
}

/* 析构函数 */
database::~database()
{
//取消与数据库的连接
db.removeDatabase("book_manage");
}

/*  _______________________
|                       |
|   第一部分:页面布局     |
|                       |
———————————————————————
*/

/* 初始化布局 */
void database::setLayout()
{
//显示标题栏
setWindowTitle();

//以游客身份新建搜索窗口
setWindowSearchBook(VISITOR);
}

/* 标题窗口布局*/
void database::setWindowTitle()
{
//申请内存
QPalette palette;
loginbutton = new QPushButton(tr("登录"));
registerbutton = new QPushButton(tr("注册"));
spacelabel2 = new QLabel();
spacelabel3 = new QLabel("\n\n");
vboxLayout0 = new QVBoxLayout();
hboxLayout2 = new QHBoxLayout();
hboxLayout3 = new QHBoxLayout();
titleImage = new QWidget();
window = new QWidget();
vboxLayout3 = new QVBoxLayout();
mainTabWidget = new QTabWidget();

//登录注册按钮状态设置
registerbutton->setFlat(true);
registerbutton->setFixedSize(QSize(60,30));
loginbutton->setFlat(true);
loginbutton->setFixedSize(QSize(60,30));

//建立信号与槽
connect(registerbutton,SIGNAL(clicked()),this,SLOT(setWindowRegister()));
//点击注册按钮,显示注册窗口
connect(loginbutton,SIGNAL(clicked()),this,SLOT(setWindowLogin()));
//点击登录按钮,显示登录窗口

//设置标题图片
QDir d;
titleImage->setAutoFillBackground(true);
palette.setBrush(QPalette::Background,QBrush(QPixmap(d.currentPath()+"/title.jpg")));
titleImage->setPalette(palette);
titleImage->setLayout(hboxLayout2);

//标题栏布局
hboxLayout3->addWidget(spacelabel2);
hboxLayout3->addWidget(loginbutton);
hboxLayout3->addWidget(registerbutton);

vboxLayout3->addWidget(spacelabel3);
vboxLayout3->addLayout(hboxLayout3);

hboxLayout2->addStretch();
hboxLayout2->addLayout(vboxLayout3);

//将标题图片和标签窗口加入总布局
vboxLayout0->addWidget(titleImage);
vboxLayout0->addWidget(mainTabWidget);

//总窗口显示
window->setAutoFillBackground(true);
window->setLayout(vboxLayout0);
window->setWindowTitle(tr("图书管理系统"));
window->setFixedSize(1024*1.2,768*1.2);
window->show();
}

/* 登录窗口布局 */
void database::setWindowLogin()
{
//登录时禁用登录和注册按钮
loginbutton->setDisabled(true);
registerbutton->setDisabled(true);

//新建用户和管理员登录窗口
user_loginWidget = createLoginWindow(1);
manager_loginWidget = createLoginWindow(2);

//加入两个登录窗口加入分栏布局,并显示
loginTabWidget = new QTabWidget();
loginTabWidget->addTab(user_loginWidget,"用户登录");
loginTabWidget->addTab(manager_loginWidget,"管理员登录");

//禁用关闭按钮
loginTabWidget->setWindowFlags(loginTabWidget->windowFlags()&~Qt::WindowCloseButtonHint);

loginTabWidget->show();

}

/* 搜索书籍界面布局 */
void database::setWindowSearchBook(int type)
{
//如果身份为用户,需要销毁之前的窗口新建
if(type==USER_LOGIN||type==USER_REGISTER){
delete window1;
}

//常量
const int num = 8;
const int columnNum = 3;
const int typenum =23;

//申请内存
window1 = new QWidget();
gridLayout = new QGridLayout();
vboxLayout1 = new QVBoxLayout();
vboxLayout = new QVBoxLayout();

hboxLayout1 = new QHBoxLayout();
hboxLayout = new QHBoxLayout();

groupbox = new QGroupBox();
groupbox1 = new QGroupBox();
clearbutton = new QPushButton(tr("清空"));
searchbutton = new QPushButton(tr("搜索"));
tablewidget = new QTableWidget();

tree = new QTreeWidget();
root = new QTreeWidgetItem(QStringList()<<"所有类型");
QTreeWidgetItem *leaf[typenum];

//建立信号与槽
connect(searchbutton,SIGNAL(clicked()),this,SLOT(searchBook()));
//点击搜索按钮,进行搜索操作
connect(clearbutton,SIGNAL(clicked()),this,SLOT(clear()));
//点击清除按钮,进行清除操作
connect(tree,SIGNAL(itemClicked(QTreeWidgetItem*,int)),
this,SLOT(searchBookByType(QTreeWidgetItem*,int)));
//点击树状列表,进行查找书籍操作

//更新窗口信息
updateTitle(type);

//设置左边的树状图书分类栏
tree->setHeaderLabels(QStringList()<<"图书类型");
tree->addTopLevelItem(root);
tree->setFixedWidth(280);

tree->setColumnWidth(1,10);

QString str2[] = {
"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字",
"文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生",
"工业技术","交通运输","航空航天","环境科学"
};
for(int i=0;i<20;i++){
leaf[i] = new QTreeWidgetItem(QStringList()<<str2[i]);
root->addChild(leaf[i]);
}

tree->expandAll();

//设置高级搜索栏
window = new QWidget();
nameLine = new QLineEdit();
publishLine = new QLineEdit();
authorLine = new QLineEdit();
dateBox = new QComboBox();
dateBox1 = new QComboBox();
priceLine = new QLineEdit();
priceLine1 = new QLineEdit();
isLent = new QComboBox();

label = new QLabel[num];
QString str[] = {"书名","出版社","作者","年份"," --","状态","价位"," --"};

for(int i=0;i<num;i++){
label[i].setText(str[i]);
gridLayout->addWidget(label+i,i/columnNum+1,2*(i%columnNum)+1);
}

dateBox->addItem("    ");
dateBox1->addItem("    ");
for(int i=0;i<60;i++){
dateBox->addItem(QString::number(2016-i));
dateBox1->addItem(QString::number(2016-i));
}

isLent->addItem("    ");
isLent->addItem("已借出");
isLent->addItem("未借出");

//表格布局,放置搜索选项
gridLayout->addWidget(nameLine,1,2);       //书名
gridLayout->addWidget(publishLine,1,4);       //类型
gridLayout->addWidget(authorLine,1,6);     //作者名称
gridLayout->addWidget(dateBox,2,2);        //年份(起)
gridLayout->addWidget(dateBox1,2,4);       //年份(终)
gridLayout->addWidget(isLent,2,6);        //借阅状态
gridLayout->addWidget(priceLine,3,2);     //价格(从)
gridLayout->addWidget(priceLine1,3,4);     //价格(到)

//搜索选项加入群组中
groupbox->setLayout(gridLayout);
groupbox->setFixedSize(600,140);

//垂直布局,放置两个按钮
vboxLayout1->addStretch();
vboxLayout1->addWidget(searchbutton);
vboxLayout1->addWidget(clearbutton);
vboxLayout1->addStretch();

groupbox1->setLayout(vboxLayout1);
groupbox1->setFixedSize(200,140);

//水平布局,依次加入搜索选项和按钮的垂直布局
hboxLayout1->addWidget(groupbox);
hboxLayout1->setSpacing(30);
hboxLayout1->addWidget(groupbox1);

//垂直布局,依次加入搜索框和显示框
vboxLayout->addLayout(hboxLayout1);
vboxLayout->addWidget(tablewidget);
setWindowShowBook(type);
vboxLayout->addLayout(hboxLayout6);

//水平布局,加入左边栏和右窗口
hboxLayout->addWidget(tree);
hboxLayout->addLayout(vboxLayout);

//窗口1加入水平布局
window1->setLayout(hboxLayout);
mainTabWidget->addTab(window1,"图书搜索");

//如果对象为用户,那么新建借书窗口
if(type==USER_LOGIN||type==USER_REGISTER){
setWindowLoanBook();
}
}

/* 单册添加书籍界面布局 */
void database::setWindowAddBook()
{
//申请内存
QLabel *label3 = new QLabel;
label3->setText("(如果有多个作者,请用空格分开)");

addBookWidget = new QWidget();
deletebookWidget = new QWidget();
window3 = new QWidget();
vboxLayout4 = new QVBoxLayout();
vboxLayout5 = new QVBoxLayout();
vboxLayout6 = new QVBoxLayout();
vboxLayout9 = new QVBoxLayout();
hboxLayout4 = new QHBoxLayout();
hboxLayout5 = new QHBoxLayout();
hboxLayout9 = new QHBoxLayout();
deleteOkButton = new QPushButton("确定");

manageTabWidget = new QTabWidget();
gridLayout2 = new QGridLayout();
okbutton = new QPushButton(tr("确定"));

nameLine2 = new QLineEdit();
typeBox2 = new QComboBox();
priceLine2 = new QLineEdit();
authorLine2 = new QLineEdit();
numLine2 = new QLineEdit();
publishLine2 = new QLineEdit();
dateBox2 = new QComboBox();

idLine = new QLineEdit();
label2 = new QLabel[7];
label5 = new QLabel;
label5->setText("请输入待删除书目的编号");

//建立信号与槽
connect(deleteOkButton,SIGNAL(clicked()),this,SLOT(deleteBook()));
//点击确认删除按钮,进行删除书籍操作
connect(okbutton,SIGNAL(clicked()),this,SLOT(oneAddBook()));
//点击确认按钮,进行添加书本操作

//设置选项框信息
QString str[7] = {"书名","价格","数量","出版社","出版日期",
"分类","作者"};
QString str2[20] = {
"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字",
"文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生",
"工业技术","交通运输","航空航天","环境科学"
};

for(int i = 0;i < 7;i++){
label2[i].setText(str[i]);
}

for(int i=0;i<20;i++){
typeBox2->addItem(str2[i]);
}

for(int i=0;i<60;i++){
dateBox2->addItem(QString::number(2016-i));
}

//窗口布局

//设置选项框表格
gridLayout2->addWidget(label2,1,1);
gridLayout2->addWidget(label2+1,1,3);
gridLayout2->addWidget(label2+2,2,1);
gridLayout2->addWidget(label2+3,2,3);
gridLayout2->addWidget(label2+4,3,1);
gridLayout2->addWidget(label2+5,3,3);
gridLayout2->addWidget(label2+6,4,1);

gridLayout2->addWidget(nameLine2,1,2);
gridLayout2->addWidget(priceLine2,1,4);
gridLayout2->addWidget(numLine2,2,2);
gridLayout2->addWidget(publishLine2,2,4);
gridLayout2->addWidget(dateBox2,3,2);
gridLayout2->addWidget(typeBox2,3,4);
gridLayout2->addWidget(authorLine2,4,2);
gridLayout2->addWidget(label3,4,3,1,2);

//加入确认按钮
hboxLayout5->addStretch();
hboxLayout5->addWidget(okbutton);
hboxLayout5->addStretch();

vboxLayout6->addLayout(gridLayout2);
vboxLayout6->addLayout(hboxLayout5);

addBookWidget->setLayout(vboxLayout6);

hboxLayout9->addStretch();
hboxLayout9->addWidget(deleteOkButton);
hboxLayout9->addStretch();

vboxLayout9->addStretch();
vboxLayout9->addWidget(label5);
vboxLayout9->addWidget(idLine);
vboxLayout9->addLayout(hboxLayout9);
vboxLayout9->addStretch();

//添加分页窗口
deletebookWidget->setLayout(vboxLayout9);
manageTabWidget->addTab(addBookWidget,"添加图书");
manageTabWidget->addTab(deletebookWidget,"删除书籍");
vboxLayout5->addSpacing(100);
vboxLayout5->addWidget(manageTabWidget);
vboxLayout5->addSpacing(300);

hboxLayout4->addStretch();
hboxLayout4->addLayout(vboxLayout5);
hboxLayout4->addStretch();

window3->setLayout(hboxLayout4);
}

/* 多册添加书籍界面布局 */
void database::setWindowMutiAddBook()
{
//申请内存
tipLabel = new QLabel();
window5 = new QWidget();
tablewidget3 = new QTableWidget();
vboxLayout12 = new QVBoxLayout();
hboxLayout12 = new QHBoxLayout();
hboxLayout13 = new QHBoxLayout();
addBookOkButton = new QPushButton("提交表单");
addBookClearButton = new QPushButton("清空表单");
loadFileButton = new QPushButton("加载文件");

//建立信号与槽
connect(addBookOkButton,SIGNAL(clicked()),this,SLOT(mutiAddBook()));
connect(addBookClearButton,SIGNAL(clicked()),this,SLOT(clearAddBookMessage()));
connect(loadFileButton,SIGNAL(clicked()),this,SLOT(openFile()));

//设置选项信息
tipLabel->setText("请双击表格进行内容填写,或者通过文本加载。"
"如果有多个作者,请用空格分开\n"
"文本格式:按表格属性填写,同样属性按空格分开。"
"输入下本书籍信息要换行区分");
tipLabel->setFrameShape (QFrame::Box);
QStringList header;
tablewidget3->setRowCount(13);
tablewidget3->setColumnCount(7);
header<<"书名"<<"价格"<<"数量"<<"出版社"<<"出版日期"<<"分类"<<"作者";

//初始化表格信息
for(int i=0;i<13;i++){
for(int j=0;j<7;j++){
if(j==4){
publishDate[i] = new QComboBox();
for(int k=0;k<60;k++){
publishDate[i]->addItem(QString::number(2016-k));
}
tablewidget3->setCellWidget(i,j,publishDate[i]);
}
else if(j==5){
QString str[] = {
"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字",
"文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生",
"工业技术","交通运输","航空航天","环境科学"
};
bookType[i] = new QComboBox();
for(int k=0;k<20;k++){
bookType[i]->addItem(str[k]);
}
tablewidget3->setCellWidget(i,j,bookType[i]);
}
else{
QTableWidgetItem *item = new QTableWidgetItem("");
tablewidget3->setItem(i,j,item);
}
}
}

tablewidget3->setHorizontalHeaderLabels(header);

//加入按钮和表格
hboxLayout12->addStretch();
hboxLayout12->addWidget(addBookOkButton);
hboxLayout12->addWidget(addBookClearButton);

hboxLayout13->addWidget(tipLabel);
hboxLayout13->addWidget(loadFileButton);

vboxLayout12->addLayout(hboxLayout13);
vboxLayout12->addWidget(tablewidget3);
vboxLayout12->addLayout(hboxLayout12);

window5->setLayout(vboxLayout12);
}

/* 借阅书籍界面布局 */
void database::setWindowLoanBook()
{
//申请内存
window4 = new QWidget();
mainTabWidget->addTab(window4,"借阅情况");

tablewidget2 = new QTableWidget(3,7);
hboxLayout11 = new QHBoxLayout();
vboxLayout11 = new QVBoxLayout();
returnBookButton = new QPushButton("归还书籍");

//建立信号与槽
connect(returnBookButton,SIGNAL(clicked()),this,SLOT(returnBook()));
//点击还书按钮,进行还书操作

//加入按钮和表格
hboxLayout11->addStretch();
hboxLayout11->addWidget(returnBookButton);
hboxLayout11->addStretch();

vboxLayout11->addWidget(tablewidget2);
vboxLayout11->addLayout(hboxLayout11);
vboxLayout11->addStretch();

window4->setLayout(vboxLayout11);

//更新借阅表格
updateLoanBookWindow();
}

/* 用户管理界面布局 */
void database::setWindowUserManage()
{
//申请内存
lastPageButton = new QPushButton("上一页");
nextPageButton = new QPushButton("下一页");
deleteUserButton = new QPushButton("删除用户信息");
grantLentButton = new QPushButton("授予/删除借书权限");
tablewidget1 = new QTableWidget(13,11);
window2 = new QWidget();
hboxLayout10 = new QHBoxLayout();
vboxLayout10 = new QVBoxLayout();

//建立信号与槽
connect(lastPageButton,SIGNAL(clicked()),this,SLOT(userLastPage()));
//点击上一页按钮,翻到上一页
connect(nextPageButton,SIGNAL(clicked()),this,SLOT(userNextPage()));
//点击下一页按钮,翻到下一页
connect(deleteUserButton,SIGNAL(clicked()),this,SLOT(deleteUser()));
//点击删除用户按钮,进行删除用户操作
connect(grantLentButton,SIGNAL(clicked()),this,SLOT(grantLent()));
//点击借书授权按钮,进行借书授权操作

//载入用户信息,并更新用户管理表格
loadUserMessage();
updateManageWindow();

//加入按钮
hboxLayout10->addStretch();
hboxLayout10->addWidget(deleteUserButton);
hboxLayout10->addWidget(grantLentButton);
hboxLayout10->addWidget(lastPageButton);
hboxLayout10->addWidget(nextPageButton);

//布局
vboxLayout10->addWidget(tablewidget1);
vboxLayout10->addLayout(hboxLayout10);
window2->setLayout(vboxLayout10);
}

/* 用户注册界面布局 */
void database::setWindowRegister()
{
//申请内存
registerWindow = new QWidget();
gridLayout3 = new QGridLayout();

label4 = new QLabel[3];
label4[0].setText("用户名");
label4[1].setText("密码");
label4[2].setText("密码确认");
label3 = new QLabel("请输入注册信息(借书权\n"
"限将由管理员添加)");
nameLine3 = new QLineEdit();
passwordLine1 = new QLineEdit();
passwordLine2 = new QLineEdit();
passwordLine1->setEchoMode(QLineEdit::Password);
passwordLine2->setEchoMode(QLineEdit::Password);
registerOkButton = new QPushButton("确定");
hboxLayout7 = new QHBoxLayout();
hboxLayout8 = new QHBoxLayout();
vboxLayout7 = new QVBoxLayout();

//页面布局
hboxLayout7->addStretch();
hboxLayout7->addWidget(registerOkButton);
hboxLayout7->addStretch();

gridLayout3->addWidget(&label4[0],1,1);
gridLayout3->addWidget(&label4[1],2,1);
gridLayout3->addWidget(&label4[2],3,1);

gridLayout3->addWidget(nameLine3,1,2);
gridLayout3->addWidget(passwordLine1,2,2);
gridLayout3->addWidget(passwordLine2,3,2);

vboxLayout7->addWidget(label3);
vboxLayout7->addLayout(gridLayout3);
vboxLayout7->addLayout(hboxLayout7);

hboxLayout8->addStretch();
hboxLayout8->addLayout(vboxLayout7);
hboxLayout8->addStretch();

registerWindow->setLayout(hboxLayout8);
registerWindow->resize(400,300);
registerWindow->show();

//建立信号与槽
connect(registerOkButton,SIGNAL(clicked()),this,SLOT(Register()));
//点击确认登录按钮,进行登录操作
}

/* 显示书籍信息界面布局 */
void database::setWindowShowBook(int type)
{
//申请内存
hboxLayout6 = new QHBoxLayout();
lastbutton = new QPushButton(tr("上一页"));
nextbutton = new QPushButton(tr("下一页"));

//建立信号与槽
connect(lastbutton,SIGNAL(clicked()),this,SLOT(bookLastPage()));
//点击上一页按钮,翻到上一页
connect(nextbutton,SIGNAL(clicked()),this,SLOT(bookNextPage()));
//点击下一页按钮,翻到下一页

//页面布局
hboxLayout6->addStretch();
hboxLayout6->addWidget(lastbutton);
hboxLayout6->addWidget(nextbutton);

//如果当前使用者为用户,加入借阅书籍按钮
if(type==USER_LOGIN||type==USER_REGISTER){
lendBookButton = new QPushButton(tr("借阅书籍"));
connect(lendBookButton,SIGNAL(clicked()),this,SLOT(lendBook()));
hboxLayout6->addWidget(lendBookButton);
}

//初始化当前页和最大页
current_page = 1;
max_page = 1;

//更新显示书目窗口
updateShowBookWindow();
}

/* 更新书籍信息界面 */
void database::updateShowBookWindow()
{
QStringList header;

//清除表格信息
tablewidget->clear();

//设置表格为不可选择、不可修改
tablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
tablewidget->setSelectionMode(QAbstractItemView::NoSelection);

//根据当前使用者的不同使用不同的标题栏
if(user_type==USER){
tablewidget->setRowCount(10);
tablewidget->setColumnCount(11);
header<<""<<"编号"<<"书名"<<"价格"<<"库存"<<"入库时间"
<<"入库人员"<<"出版社"<<"出版年份"<<"类型"<<"作者";
}
else{
tablewidget->setRowCount(10);
tablewidget->setColumnCount(10);
header<<"编号"<<"书名"<<"价格"<<"库存"<<"入库时间"
<<"入库人员"<<"出版社"<<"出版年份"<<"类型"<<"作者";
}

//加入标题栏
tablewidget->setHorizontalHeaderLabels(header);

//设置宽度
for(int i=0;i<10;i++){
tablewidget->setColumnWidth(i,120);
}

//求出当前页的最多显示条目
int max;

if(result.length()==0)return;
if(current_page==max_page){
max = result.length()%100/10;
if(max==0)max=10;
}
else max = 10;

//根据当前使用者的不同在表格上显示不同信息
if(user_type==USER){
for(int i=0;i<max;i++){
item2[i] = new QTableWidgetItem();
item2[i]->setCheckState(Qt::Unchecked);
item3[i] = new QTableWidgetItem(result.at(10*i+100*(current_page-1)));
tablewidget->setItem(i,0,item2[i]);
tablewidget->setItem(i,1,item3[i]);
for(int j=1;j<10;j++){
QTableWidgetItem *item = new QTableWidgetItem(result.at(10*i+j+100*(current_page-1)));
tablewidget->setItem(i,j + 1,item);
}
}
}
else{
for(int i=0;i<max;i++){
for(int j=0;j<10;j++){
QTableWidgetItem *item = new QTableWidgetItem(result.at(10*i+j+100*(current_page-1)));
tablewidget->setItem(i,j,item);
}
}
}
}

/* 更新借阅书籍界面 */
void database::updateLoanBookWindow()
{
//更新前加载借阅信息
loadLoanMessage();

QStringList header;

//清空表格信息
tablewidget2->clear();

//设置标题栏
header<<""<<"书本编号"<<"书本名称"<<"借阅日期"<<"单册编号"<<"最晚归还日期"<<"剩余归还天数";
tablewidget2->setHorizontalHeaderLabels(header);

//设置表格为不可修改,不可选择
tablewidget2->setEditTriggers(QAbstractItemView::NoEditTriggers);
tablewidget2->setSelectionMode(QAbstractItemView::NoSelection);

//将信息显示到表格上
for(int i=0;i<loanMessage.length();i++){
item4[i] = new QTableWidgetItem();
item4[i]->setCheckState(Qt::Unchecked);
tablewidget2->setItem(i,0,item4[i]);
for(int j=0;j<6;j++){
QTableWidgetItem *item = new QTableWidgetItem(loanMessage.at(i)[j]);
tablewidget2->setItem(i,j + 1,item);
}
}
}

/* 更新用户管理界面 */
void database::updateManageWindow()
{
//计算当前页面能显示的最多用户数
int max;
if(user_current_page==user_max_page){
max = (user_num%13==0)?13:user_num%13;
}
else{
max = 13;
}

//清除表格信息
tablewidget1->clear();

//设置表格为不可选择,不可修改
tablewidget1->setEditTriggers(QAbstractItemView::NoEditTriggers);
tablewidget1->setSelectionMode(QAbstractItemView::NoSelection);

//设置标题栏
QStringList header;
header<<""<<"用户名"<<"密码"<<"借书权限"<<"借阅数目"<<"借阅书籍1"
<<"借阅日期"<<"借阅书籍2"<<"借阅日期"<<"借阅书籍3"<<"借阅日期";
tablewidget1->setHorizontalHeaderLabels(header);

//将信息显示到表格上
for(int i=0;i<max;i++){
int row = i + (user_current_page - 1)*13;
item0[i] = new QTableWidgetItem();
item0[i]->setCheckState(Qt::Unchecked);
item1[i] = new QTableWidgetItem(userMessage.at(row)[0]);

tablewidget1->setItem(i,0,item0[i]);
tablewidget1->setItem(i,1,item1[i]);

for(int j=1;j<10;j++){
QTableWidgetItem *item = new QTableWidgetItem(userMessage.at(row)[j]);
tablewidget1->setItem(i,j+1,item);
}
}
}

/* 更新时间显示 */
void database::updateTime()
{
//获取系统时间
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
QString text = "当前用户: " + current_user + " | 当前时间:"+current_date+" ";
spacelabel2->setText(text);
}

/* 更新标题栏信息 */
void database::updateTitle(int type)
{
//获取系统时间
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
QString text;

//如果当前使用者为游客,更新标题栏,直接返回
if(type==VISITOR){
text = "当前用户:游客 | 当前时间:"+current_date+" ";
spacelabel2->setText(text);
return;
}

//登录后删除登录、注册按钮
delete loginbutton;
delete registerbutton;

//新建退出登录按钮,点击退出登录按钮,进行退出登录操作
quitloginbutton = new QPushButton("退出登录");
connect(quitloginbutton,SIGNAL(clicked()),this,SLOT(quitLogin()));
hboxLayout3->addWidget(quitloginbutton);

quitloginbutton->setFlat(true);

//根据当前使用者显示不同的标题栏
if(type==USER_LOGIN){
text = "当前用户:"+username1->text()+" | 当前时间:"+current_date+" ";
current_user = username1->text();
user_type = USER;
//删除登录窗口
delete loginTabWidget;
}
else if(type==USER_REGISTER){
text = "当前用户:"+nameLine3->text()+" | 当前时间:"+current_date+" ";
current_user = nameLine3->text();
user_type = USER;
//删除注册窗口
delete registerWindow;
}
else if(type==MANAGER){
text = "当前用户:"+username2->text()+" | 当前时间:"+current_date+" ";
current_user = username2->text();
user_type = MANAGER;
//删除登录窗口
delete loginTabWidget;
}
spacelabel2->setText(text);
}

/* 创建登录窗口(登录窗口布局的辅助函数) */
QWidget* database::createLoginWindow(int type)
{
//申请内存
QWidget *widget = new QWidget();
QLabel *username_label = new QLabel;
QLabel *password_label = new QLabel;
QGridLayout *glayout = new QGridLayout;
QPushButton *yesbutton = new QPushButton(tr("确定"));
QPushButton *quitbutton = new QPushButton(tr("退出"));
QHBoxLayout *hlayout = new QHBoxLayout();
QVBoxLayout *vlayout = new QVBoxLayout();

//根据不同类型建立不同的输入栏
if(type==1){
username1 = new QLineEdit();
password1 = new QLineEdit();
password1->setEchoMode(QLineEdit::Password);
glayout->addWidget(username1,1,2);
glayout->addWidget(password1,2,2);
}
else if(type==2){
username2 = new QLineEdit();
password2 = new QLineEdit();
password2->setEchoMode(QLineEdit::Password);
glayout->addWidget(username2,1,2);
glayout->addWidget(password2,2,2);
}

username_label->setText(tr("账号"));
password_label->setText(tr("密码"));

//表格布局加入文字标签
glayout->setContentsMargins(50,100,50,100);
glayout->setSpacing(40);
glayout->addWidget(username_label,1,1);

glayout->addWidget(password_label,2,1);

//加入按钮和输入栏
hlayout->addStretch();
hlayout->addWidget(yesbutton);
hlayout->addWidget(quitbutton);
hlayout->addStretch();
vlayout->addLayout(glayout);
vlayout->addLayout(hlayout);

widget->setLayout(vlayout);

//点击退出按钮,进行删除登录窗口操作
connect(quitbutton,SIGNAL(clicked()),this,SLOT(deleteLogin()));

//点击确认按钮,根据类型不同将信号发送到用户登录和管理员登录中
if(type==1){
connect(yesbutton,SIGNAL(clicked()),this,SLOT(userLogin()));
}
else if(type==2){
connect(yesbutton,SIGNAL(clicked()),this,SLOT(managerLogin()));
}

return widget;
}

/* 清空搜索框 */
void database::clear()
{
nameLine->clear();
publishLine->clear();
authorLine->clear();
priceLine->clear();
priceLine1->clear();
}

/* 清空多册添加的表单 */
void database::clearAddBookMessage()
{
//对每一个表单,设置为空
for(int i = 0;i<13;i++){
for(int j = 0;j<7;j++){
if(j!=5&&j!=4){
tablewidget3->item(i,j)->setText("");
}
}
}
//如果有图书信息缓存,清空
for(int i=0;i<multiBookMessage.length();i++){
multiBookMessage.pop_front();
}
}

/* 删除登录界面*/
void database::deleteLogin()
{
//删除登陆界面,并将登录注册按钮设为可使用
delete loginTabWidget;
loginbutton->setEnabled(true);
registerbutton->setEnabled(true);
}

/* 退出登录更新界面*/
void database::quitLogin()
{
//删除退出登录按钮
delete quitloginbutton;

//根据当前使用者的不同,删除对应的窗口以及控件
if(user_type==MANAGER){
delete window3;
delete window2;
delete window5;
}
else if(user_type==USER){
delete window4;
delete lendBookButton;
}

//获取系统时间
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
QString text = "当前用户: 游客 | 当前时间:"+current_date+" ";

//更新使用者类型为游客
user_type = VISITOR;
current_user = "游客";
spacelabel2->setText(text);

//重新建立登录注册按钮,并摆放
loginbutton = new QPushButton("登录");
registerbutton = new QPushButton("注册");
loginbutton->setFlat(true);
registerbutton->setFlat(true);
registerbutton->setFixedSize(QSize(60,30));
loginbutton->setFixedSize(QSize(60,30));
hboxLayout3->addWidget(loginbutton);
hboxLayout3->addWidget(registerbutton);

//重新连接登录注册与对应的槽函数
connect(loginbutton,SIGNAL(clicked()),this,SLOT(setWindowLogin()));
connect(registerbutton,SIGNAL(clicked()),this,SLOT(setWindowRegister()));
}

/* 用户管理翻页(上一页)*/
void database::userLastPage()
{
//当前页为1,不存在上一页,返回
if(user_current_page==1)return;
//当前页减1
user_current_page--;
//更新用户管理窗口
updateManageWindow();
}

/* 用户管理翻页(下一页)*/
void database::userNextPage()
{
//如果当前页面为最大页面,不存在下一页面,返回
if(user_current_page==user_max_page)return;
//当前页面加一
user_current_page++;
//更新用户管理窗口
updateManageWindow();
}

/* 显示书籍翻页(上一页)*/
void database::bookLastPage()
{
//当前页为1,不存在上一页,返回
if(current_page==1)return;
//当前页减1
current_page--;
//更新显示书本窗口
updateShowBookWindow();
}

/* 显示书籍翻页(下一页)*/
void database::bookNextPage()
{
//如果当前页面为最大页面,不存在下一页面,返回
if(current_page==max_page)return;
//当前页面加一
current_page++;
//更新显示书本窗口
updateShowBookWindow();
}

/* 打开文件导入书籍数据 */
void database::openFile()
{
//新建文件显示窗口
fileWindow = new QWidget;
QFileDialog dlg(fileWindow,"打开文本");
dlg.resize(400,300);
dlg.setAcceptMode(QFileDialog::AcceptOpen);

//只允许打开.txt后缀的文件
dlg.setNameFilter("*txt");

//打开文件对话框
if(dlg.exec()==QDialog::Accepted ){
QStringList files = dlg.selectedFiles();
if(!files.isEmpty()){
//以只读形式打开选中文件
QFile file;
file.setFileName(files.at(0));
file.open(QIODevice::ReadOnly);
if(!file.atEnd()){
int count = 0;
int rowNum = 0;
//读取文本所有信息,并进行转码处理
QByteArray buff;
buff = file.readAll();
QString fileContent = QString::fromLocal8Bit(buff);
QString str = "";

//对文本进行格式化处理
for(int k=0;k<=fileContent.length();k++){
//读到换行符或者读完文本,把书籍信息存储
if(fileContent.at(k)=='\n'||k==fileContent.length()){
bookMessage[6] = str;
if(rowNum>=13){ //列数超过显示范围,暂存到容器中
QString *tmp = new QString[7];
for(int i=0;i<7;i++){
tmp[i] = bookMessage[i];
}
multiBookMessage.push_back(tmp);
}
else{ //列数未超过显示范围,直接显示在表格中
for(int i=0;i<7;i++){
if(i==4)publishDate[rowNum]->setCurrentText(bookMessage[i]);
else if(i==5)bookType[rowNum]->setCurrentText(bookMessage[i]);
else{
tablewidget3->item(rowNum,i)->setText(bookMessage[i]);
}
}
rowNum++;
count = 0;
str = "";
}
//如果以换行符结束,不需要继续处理
if(fileContent.at(k)=='\n'&&k==fileContent.length()-1){
break;
}
}
//读到空格且不是作者信息中的空格,跳过空格,并把字符串存储到bookmessage中
else if(fileContent.at(k)==' '&&count!=6){
bookMessage[count++] = str;
str = "";
}
//读到空格且是作者信息中的空格,直接存储空格信息
else if(fileContent.at(k)==' '&&count==6){
str = str + fileContent.at(k);
}
//读到支持的文本内容,将其加入字符串中
else if(fileContent.at(k).isLetter()||fileContent.at(k).isNumber()
||fileContent.at(k)=='.'||fileContent.at(k)==':'
||fileContent.at(k)=='-'||fileContent.at(k)=='"'
||fileContent.at(k)=='('||fileContent.at(k)==')'
||fileContent.at(k)=='·'){
str = str + fileContent.at(k);
}
}
}
}
}
}

/*  _______________________
|                       |
|   第二部分:业务逻辑     |
|                       |
———————————————————————
*/

/* 用户注册 */
void database::Register()
{
//检测用户是否输入了全部的信息
if(nameLine3->text().isEmpty()||passwordLine1->text().isEmpty()||passwordLine2->text().isEmpty()){
QMessageBox::critical(NULL, "Error", "您的信息填写不完整",
QMessageBox::Yes);
return;
}

//检测密码是否一致
if(passwordLine1->text().compare(passwordLine2->text())!=0){
QMessageBox::critical(NULL, "Error", "两次密码输入不一致!",
QMessageBox::Yes);
return;
}

//查询用户名是否已存在于数据库
QSqlQuery query;
query.exec("select username from user where username = '" + nameLine3->text() + "'");
if(query.next()){
QMessageBox::critical(NULL, "Error", "该用户名已被注册",
QMessageBox::Yes);
return;
}

//向user表中插入用户信息
query.exec("insert into user values('" + nameLine3->text() + "','" + passwordLine1->text() + "'" +",false)");
if(query.isActive()){
QMessageBox::about(0,"database","注册成功!");
}
else{
QMessageBox::critical(NULL, "Error", "注册失败",
QMessageBox::Yes);
return;
}

//更新检索书籍窗口
setWindowSearchBook(USER_REGISTER);
}

/* 用户登录 */
void database::userLogin()
{
QSqlQuery query2;

//根据用户输入的用户名,在user表中查询其密码
query2.exec("select password from user where username = '"
+username1->text()+"'");
if(!query2.isActive()){
return;
}

//判断密码是否与结果一致
if(query2.next()){
QString sel_password = query2.value(0).toString();
if(QString::compare(sel_password,password1->text())!=0){
QMessageBox::critical(NULL, "Error", "密码错误",
QMessageBox::Yes);
return;
}
}
//如果数据库中没有此用户名,给出警告
else{
QMessageBox::critical(NULL, "Error", "该用户名不存在",
QMessageBox::Yes);
return;
}

//更新检索书籍窗口
setWindowSearchBook(USER_LOGIN);
}

/* 管理员登录 */
void database::managerLogin()
{
QSqlQuery query2;

//根据用户输入的用户名,在manager表中查询其密码
query2.exec("select password from manager where username = '"
+username2->text()+"'");
if(!query2.isActive()){
return;
}

//判断密码是否与结果一致
if(query2.next()){
QString sel_password = query2.value(0).toString();
if(QString::compare(sel_password,password2->text())!=0){
QMessageBox::critical(NULL, "Error", "密码错误",
QMessageBox::Yes);
return;
}
}

//如果数据库中没有此用户名,给出警告
else{
QMessageBox::critical(NULL, "Error", "该用户名不存在",
QMessageBox::Yes);
return;
}

//更新标题栏信息
updateTitle(MANAGER);

//添加图书单册入库窗口
setWindowAddBook();
//添加用户管理窗口
setWindowUserManage();
//添加图书多册入库窗口
setWindowMutiAddBook();

//在分页栏中加入以上窗口
mainTabWidget->addTab(window2,"用户管理");
mainTabWidget->addTab(window3,"单册入库");
mainTabWidget->addTab(window5,"多册入库");
}

/* 多条件查询书籍 */
void database::searchBook()
{
//判断用户是否填写了信息
if(nameLine->text().isEmpty()&&publishLine->text().isEmpty()&&authorLine->text().isEmpty()
&&(!dateBox->currentText().compare("    ")&&!dateBox1->currentText().compare("    "))
&&!isLent->currentText().compare("    ")&&(priceLine->text().isEmpty()&&priceLine1->text().isEmpty())){
QMessageBox::critical(0,QObject::tr("error"),"您尚未填写任何信息");
return;
}

//检查日期和价格的填写是否正确
else if(((dateBox->currentText().compare("    ")==0&&dateBox->currentText().compare("    ")!=0)||
(dateBox->currentText().compare("    ")!=0&&dateBox->currentText().compare("    ")==0))&&
(!priceLine->text().isEmpty()&&priceLine1->text().isEmpty()||
priceLine->text().isEmpty()&&!priceLine1->text().isEmpty())){
QMessageBox::critical(0,QObject::tr("error"),"您的日期和价格范围有误");
return;
}
else if((dateBox->currentText().compare("    ")==0&&dateBox->currentText().compare("    ")!=0)||
(dateBox->currentText().compare("    ")!=0&&dateBox->currentText().compare("    ")==0)){
QMessageBox::critical(0,QObject::tr("error"),"您的日期范围有误");
return;
}
else if(!priceLine->text().isEmpty()&&priceLine1->text().isEmpty()||
priceLine->text().isEmpty()&&!priceLine1->text().isEmpty()){
QMessageBox::critical(0,QObject::tr("error"),"您的价格范围有误");
return;
}
int x1,x2,y1,y2;
x1=x2=y1=y2=0;
if(dateBox->currentText().compare("    ")){
x1 = dateBox->currentText().toInt();
x2 = dateBox1->currentText().toInt();
}
if(!priceLine->text().isEmpty()){
y1 = priceLine->text().toInt();
y2 = priceLine1->text().toInt();
}

if(x1>x2&&y1>y2){
QMessageBox::critical(0,QObject::tr("error"),"您的日期和价格范围有误");
return;
}
else if(x1>x2){
QMessageBox::critical(0,QObject::tr("error"),"您的日期范围有误");
return;
}
else if(y1>y2){
QMessageBox::critical(0,QObject::tr("error"),"您的价格范围有误");
return;
}

//将用户输入的信息暂存于容器中
QVector<QString>list;
if(!nameLine->text().isEmpty()){
list.push_back("name");
list.push_back(nameLine->text());
}
if(!publishLine->text().isEmpty()){
list.push_back("publisher");
list.push_back(publishLine->text());
}
if(!authorLine->text().isEmpty()){
list.push_back("author");
list.push_back(authorLine->text());
}
if(dateBox->currentText().compare("    ")!=0){
list.push_back("publish_year");
list.push_back(dateBox->currentText());
list.push_back(dateBox1->currentText());
}

if(isLent->currentText().compare("    ")!=0){
QString str;
if(isLent->currentText().compare("未借出")==0){
str = ">";
}
else if(isLent->currentText().compare("已借出")==0){
str = "=";
}
list.push_back("number");
list.push_back(str);
}
if(!priceLine->text().isEmpty()){
list.push_back("price");
list.push_back(priceLine->text());
list.push_back(priceLine1->text());
}

//根据用户输入的信息在book表和book_author两个表中进行检索
int len = list.length();
int count = 0;
QString ans = "select * from book where " ;
QSqlQuery query,query2;

while(count<len){
if(count!=0)ans = ans + " and ";
QString tmp = list.front();
list.pop_front();
count++;
QString tmp1,tmp2;
if(tmp.compare("publish_year")==0){
tmp1 = list.front();
list.pop_front();
count++;
tmp2 = list.front();
list.pop_front();
count++;
ans = ans + tmp + " >= '" + tmp1 + "' and " +
tmp + " <= '" + tmp2 + "'";
}
else if(tmp.compare("price")==0){
tmp1 = list.front();
list.pop_front();
count++;
tmp2 = list.front();
list.pop_front();
count++;
ans = ans + tmp + " > " + tmp1 + " and " +
tmp + " < " + tmp2;
}

else if(tmp.compare("number")==0){
tmp1 = list.front();
list.pop_front();
count++;
ans = ans + tmp + tmp1 + "0";
}
else if(tmp.compare("author")==0){
bool flag = false;
QVector<QString>str;
tmp1 = list.front();
list.pop_front();
count++;
query2.exec("select book_id from book_author where author_name like '%" + tmp1 + "%'");
while(query2.next()){
flag = true;
str.push_back(query2.value(0).toString());
}
if(!flag){
QMessageBox::critical(0,QObject::tr("error"),"未查到搜索的结果!");
return;
}
if(str.length()==1){
ans = ans + "book_id = '" + str.front() + "'";
str.pop_front();
}
else{
for(int i=0;i<str.length();i++){
if(i==0) ans = ans + "(book_id = '" + str[i] + "'";
else if(i==str.length()-1) ans = ans + " or book_id = '" + str[i] + "')";
else ans = ans + " or book_id = '" + str[i] + "'";
}
}
str.clear();
}
else{
tmp1 = list.front();
list.pop_front();
count++;
ans = ans + tmp + " like '%" + tmp1 + "%'";
}
}

query.exec(ans);
if(!query.isActive()){
QMessageBox::critical(0,QObject::tr("error"),query.lastError().text());
}

//将结果容器清空,把搜索的结果暂存于结果容器中,之后根据页码显示相应的结果
result.clear();

while(query.next()){

QString ans="";
QString str = query.value(0).toString();
query2.exec("select author_name from book_author where book_id = '"+str+"'");
while(query2.next()){
ans = ans + query2.value(0).toString() + " ";
}
for(int i=0;i<9;i++){
result.push_back(query.value(i).toString());
}
result.push_back(ans);
}
if(result.length()==0){
QMessageBox::critical(0,QObject::tr("error"),"未查到搜索的结果!");
return;
}

//初始化当前页和最大页
current_page = 1;
max_page = result.length()/100 + (result.length()%100!=0);

//更新显示书籍窗口
updateShowBookWindow();
}

/* 按照书的分类查询书籍 */
void database::searchBookByType(QTreeWidgetItem* tree,int num)
{
QSqlQuery query,query2;
QString text = tree->text(0);

//根据分类,在book表和book_author两个表中进行检索
query.exec("select * from book "
"where type = '"+text+"'");
if(!query.isActive()){
QMessageBox::critical(0,QObject::tr("error"),"未查询到结果!");
}

//将结果容器清空,把搜索的结果暂存于结果容器中,之后根据页码显示相应的结果
result.clear();
while(query.next()){
QString ans="";
QString str = query.value(0).toString();
query2.exec("select author_name from book_author where book_id = '"+str+"'");
while(query2.next()){
ans = ans + query2.value(0).toString() + " ";
}
for(int i=0;i<9;i++){
result.push_back(query.value(i).toString());
}
result.push_back(ans);
}

//初始化当前页和最大页
current_page = 1;
max_page = result.length()/100 + (result.length()%100!=0);

//更新显示书籍窗口
updateShowBookWindow();
}

/* 加载借书信息 */
void database::loadLoanMessage()
{
QSqlQuery query,query1;

//由于容器中存的是指针对象,需要一个个释放内存
//防止频繁更新表导致的内存泄漏
for(int i=0;i<loanMessage.length();i++){
for(int j=0;j<5;j++){
loanMessage.at(i)[j].clear();
}
}
//清空借阅信息
loanMessage.clear();

//从表loan中查询借书信息
query.exec("select book_id,loan_date,loan_number from loan where username = '"
+ current_user + "'");

//把搜索的结果暂存于借阅信息容器中,之后根据页码显示相应的结果
while(query.next()){
QString *ans = new QString[6];
ans[0] = query.value(0).toString();
query1.exec("select name from book where book_id = '" + ans[0] + "'");
if(query1.next()){
ans[1] = query1.value(0).toString();
}
else{
qDebug()<<"error";
return;
}
ans[2] = query.value(1).toString();//日期
ans[3] = query.value(2).toString();//单册编号
QDate currentDate = QDate::currentDate();
QDate loanDate = query.value(1).toDate();
QDate returnDate = loanDate.addDays(90);
int remainingTime = currentDate.daysTo(returnDate);
ans[4] = returnDate.toString("yyyy-MM-dd");
if(remainingTime>=0){
ans[5] = QString::number(remainingTime);
}
else{
ans[5] = "已逾期";
}
loanMessage.push_back(ans);
}
}

/* 加载用户信息 */
void database::loadUserMessage()
{
user_num = 0;
QSqlQuery query,query1,query2;

//由于容器中存的是指针对象,需要一个个释放内存
//防止频繁更新表导致的内存泄漏
for(int i=0;i<userMessage.length();i++){
for(int j=0;j<10;j++){
userMessage.at(i)[j].clear();
}
}
//清空用户信息
userMessage.clear();

//在表user中搜索所有信息
query.exec("select * from user");

int i = 0;
QString name[3];
QString id[3];
QString date[3];

//把搜索的结果暂存于借阅信息容器中,之后根据页码显示相应的结果
while(query.next()){
QString *ans = new QString[10];
int num = 0;
int count = 0;
for(int j=0;j<=2;j++){
ans[j] = query.value(j).toString();
}

query1.exec("select book_id,loan_date"
" from loan where username = '" + ans[0] + "'");
while(query1.next()){
id[count] = query1.value(0).toString();
date[count] = query1.value(1).toString();
num++;
query2.exec("select name from book where book_id = '"
+ id[count] + "'");
if(query2.next()){
name[count++] = query2.value(0).toString();
}
}
ans[3] = QString::number(num);

for(int j=0;j<count;j++){
ans[4 + 2*j] = name[j] + "(" + id[j] + ")";
ans[5 + 2*j] = date[j];
}
for(int j=count;j<3;j++){
ans[4 + 2*j] = "";
ans[5 + 2*j] = "";
}
userMessage.push_back(ans);
i++;
user_num++;
}

//初始化当前页码和最大页码
user_current_page = 1;
if(user_num%13==0)user_max_page = user_num/13;
else user_max_page = user_num/13 + 1;
}

/* 连接数据库 */
bool database::createConnection()
{
//连接MySQL数据库
db = QSqlDatabase::addDatabase("QMYSQL");
//设置主机名
db.setHostName("localhost");
//设置数据库名
db.setDatabaseName("book_manage");
//设置账号名
db.setUserName("root");
//设置密码名
db.setPassword("root");
//设置端口
db.setPort(3306);
if(!db.open()){
QMessageBox::critical(0,QObject::tr("error"),db.lastError().text());
return false;
}
return true;
}

/* 删除书籍 */
void database::deleteBook()
{
QSqlQuery query,query1;

//删除之前,检索书号是否存在,便于给出用户反馈信息
query1.exec("select book_id from book where book_id = '" + idLine->text() + "'");
if(!query1.next()){
QMessageBox::critical(NULL, "Error", "该书号不存在",
QMessageBox::Yes);
return;
}

//从book中删除该书本信息
query.exec("delete from book where book_id = '" + idLine->text() + "'");
if(!query.isActive()){
QMessageBox::critical(NULL, "Error", "删除失败",
QMessageBox::Yes);
}
else{
QMessageBox::about(NULL,"Ok","删除成功");
}
}

/* 书籍入库 */
bool database::addBook()
{
QSqlQuery query,query1,query2;

QString author_str = bookMessage[6];
QVector<QString>list;
QString tmp="";

//入库前,先查找是否存在相同(除作者)的书籍
query.exec("select book_id from book where name = '"
+ bookMessage[0] + "' and price = '"
+ bookMessage[1] + "' and publisher = '"
+ bookMessage[3] + "' and publish_year = '"
+ bookMessage[4] + "' and type = '"
+ bookMessage[5] + "'");

//如果存在的话,给出已存在书的信息
//并向用户询问,选择将两本书合并,还是退出
if(query.next()){
query1.exec("select author_name from book_author where book_id = '" +
query.value(0).toString() + "'");
QString author = "";
QString str = "";
while(query1.next()){
author = author + query1.value(0).toString() + " ";
}
for(int i = 0;i<6;i++){
if(i==2)continue;
else str = str + bookMessage[i] + ",";
}
str = str + author;
QMessageBox::StandardButton messagebox  = QMessageBox::question(NULL,"question","图书库已有类似图书:\n(" +
str + ")\n是否需要合并两本书?(不合并则取消入库)");
if(messagebox==QMessageBox::Yes){
query2.exec("update book set number = number + " + bookMessage[2]
+ " where book_id = '" + query.value(0).toString() +"'");
if(query2.isActive()){
return true;
}
else return false;
}
else if(messagebox==QMessageBox::No){
return false;
}
}

//对用户一次输入的多个作者,进行格式化,将作者名分开,并暂存于容器中
for(int i=0;i<author_str.length();i++){
if(author_str.at(i)!=' ')tmp = tmp + author_str.at(i);
else{
list.push_back(tmp);
tmp = "";
}
}
if(!tmp.isEmpty())list.push_back(tmp);

//获取当前时间
QDate d = QDate::currentDate();
QString str2 = d.toString("yyyy-MM-dd");

//查询当前书的总数,为该书分配一个编号,计算方法为当前书总数 + 1
//如果该编号已存在,继续查找连续的编号,直到找到一个未使用的编号为止
query.exec("select count(*) from book");
int num = 0;
int tmp_num;
if(query.next()){
num = query.value(0).toInt();
}
if(num>=99999){
QMessageBox::critical(NULL,"error","数据库存储已满,请申请数据库扩容");
return false;
}
tmp_num = ++num;

int count = 0;
while(tmp_num){
tmp_num/=10;
count++;
}
count=5-count;

QString str = QString::number(num);

for(int i=0;i<count;i++){
str = "0" + str;
}

query.exec("select book_id from book where book_id = '" + str +"'");

while(query.next()){
count = 0;
tmp_num = ++num;
while(tmp_num){
tmp_num/=10;
count++;
}
str = QString::number(num);
count=5-count;
for(int i=0;i<count;i++){
str = "0" + str;
}
query.exec("select book_id from book where book_id = '" + str +"'");
}

//向表book中插入书籍信息
query2.exec("insert into book values('"
+ str + "','" + bookMessage[0] + "'," +
bookMessage[1] + "," + bookMessage[2] + ",'" +
str2 + "','" + current_user + "','" +
bookMessage[3] + "','" + bookMessage[4] +
"','" + bookMessage[5]+"')");

//向表book_author中插入作者信息
for(int i=0;i<list.size();i++){
query1.exec("insert into book_author values('"+
str + "','"+list.front()+"')");
list.pop_front();
}

if(query1.isActive()&&query1.isActive()){
return true;
}
else{
return false;
}
}

/* 单册书籍入库(加载书籍信息) */
void database::oneAddBook()
{
//检查用户填写的信息是否完整
if(nameLine2->text().isEmpty()||priceLine2->text().isEmpty()||
authorLine2->text().isEmpty()||numLine2->text().isEmpty()||
publishLine2->text().isEmpty()){
QMessageBox::critical(NULL, "Error", "您的信息填写不完整",
QMessageBox::Yes);
return;
}

//将用户输入的信息暂存于数组中
bookMessage[0] = nameLine2->text();
bookMessage[1] = priceLine2->text();
bookMessage[2] = numLine2->text();
bookMessage[3] = publishLine2->text();
bookMessage[4] = dateBox2->currentText();
bookMessage[5] = typeBox2->currentText();
bookMessage[6] = authorLine2->text();

if(addBook()){
QMessageBox::about(0,"database","插入成功!");
}
else{
QMessageBox::critical(0,QObject::tr("error"),"插入失败");
}

//清空输入框
nameLine2->clear();
priceLine2->clear();
numLine2->clear();
publishLine2->clear();
authorLine2->clear();
}

/* 多册书籍入库(加载书籍信息) */
void database::mutiAddBook()
{
bool flag = true;
int count = 0;//统计书本数目

//检查用户输入是否完整
for(int i=0;i<13;i++){
bool hasValue = false;
bool isEmpty = false;
for(int j=0;j<7;j++){
if(j==4||j==5)continue;
else{
if(tablewidget3->item(i,j)->text().compare("")==0){
isEmpty = true;
}
else hasValue = true;
}
if(hasValue&&isEmpty){
QMessageBox::critical(NULL,"error","您的信息填写不完整");
return;
}
}
if(!isEmpty){
count++;
}
}

//将用户输入的信息暂存于数组中
for(int i=0;i<count;i++){
for(int j=0;j<7;j++){
if(j==4){
bookMessage[j] = publishDate[i]->currentText();
}
else if(j==5){
bookMessage[j] = bookType[i]->currentText();
}
else{
bookMessage[j] = tablewidget3->item(i,j)->text();
}
}
if(!addBook()){
flag = false;
QMessageBox::critical(NULL,"error","第" + QString::number(i+1) + "本书添加失败");
}
}
if(flag){
QMessageBox::about(NULL,"ok","插入成功");
//清空书本信息
for(int i=0;i<7;i++){
bookMessage[i].clear();
}
}
//对每一个表单,设置为空
for(int i = 0;i<13;i++){
for(int j = 0;j<7;j++){
if(j!=5&&j!=4){
tablewidget3->item(i,j)->setText("");
}
}
}
//继续加载文本信息(如果还有的话)
int max = multiBookMessage.length()<13?multiBookMessage.length():13;
for(int i=0;i<max;i++){
for(int j=0;j<7;j++){
if(j==4)publishDate[i]->setCurrentText(multiBookMessage.at(i)[j]);
else if(j==5)bookType[i]->setCurrentText(multiBookMessage.at(i)[j]);
else{
tablewidget3->item(i,j)->setText(multiBookMessage.at(i)[j]);
}
}
}

for(int i=0;i<max;i++){
multiBookMessage.pop_front();
}
}

/* 删除用户 */
void database::deleteUser()
{
QSqlQuery query;
//判断是否选中用户
bool flag = false;

//求出当前页面最多显示的用户
int max;
if(user_current_page==user_max_page){
max = (user_num%13==0)?13:user_num%13;
}
else max = 13;

//删除管理员选中的用户信息
for(int i=0;i<max;i++){
if(item0[i]->checkState() == Qt::Checked){
//如果用户有未归还的书籍,禁止删除
if(tablewidget1->item(i,4)->text().toInt()>0){
QMessageBox::critical(0,"error","该用户有未归还的书籍,不能删除!");
return;
}
flag = true;
query.exec("delete from user where username = '" +
item1[i]->text() + "'");
}
}
if(!flag){
QMessageBox::critical(0,"error","您尚未选择任何用户!");
return;
}
if(query.isActive()){
QMessageBox::about(0,"ok","删除成功");
}
else{
QMessageBox::critical(0,"error","删除失败");
}

//更新用户信息
loadUserMessage();
//更新用户管理窗口
updateManageWindow();
}

/* 授予借书权限*/
void database::grantLent()
{
//判断是否选中用户
bool flag = false;

//判断执行的操作是授权还是取消授权
int isGrant;
QSqlQuery query;

//求出当前页面最多显示的用户
int max;
if(user_current_page==user_max_page){
max = (user_num%13==0)?13:user_num%13;
}
else max = 13;

//根据用户当前借阅权限,执行授予借阅权限/取消借阅权限操作
for(int i=0;i<max;i++){
if(item0[i]->checkState() == Qt::Checked){
flag = true;
isGrant = tablewidget1->item(i,3)->text().toInt();

if(isGrant==0){
isGrant = true;
query.exec("update user set isLent = true where username = '" +
item1[i]->text() + "'");
}
else if(isGrant==1){
isGrant = false;
query.exec("update user set isLent = false where username = '" +
item1[i]->text() + "'");
}
}
}
if(!flag){
QMessageBox::critical(0,"error","您尚未选择任何用户!");
return;
}
if(query.isActive()){
if(isGrant){
QMessageBox::about(0,"ok","授权成功");
}
else{
QMessageBox::about(0,"ok","取消权限成功");
}
}
else{
if(isGrant){
QMessageBox::critical(0,"error","授权失败");
}
else{
QMessageBox::critical(0,"error","取消权限失败");
}
return;
}

//更新用户信息
loadUserMessage();
//更新用户管理窗口
updateManageWindow();
}

/* 归还书籍 */
void database::returnBook()
{
//判断是否选中书籍
bool flag = false;
QSqlQuery query,query1;

//执行归还操作
for(int i=0;i<loanMessage.length();i++){
if(item4[i]->checkState() == Qt::Checked){
flag = true;
query.exec("delete from loan where username = '" +
current_user + "' and book_id = '" +
loanMessage.at(i)[0] + "' and loan_number = " +
loanMessage.at(i)[3]);
query1.exec("update book set number = number + 1 where book_id = '"+
loanMessage.at(i)[0] + "'");
}
}
if(!flag){
QMessageBox::critical(0,"error","您尚未选中任何书目!");
return;
}
if(query.isActive()){
QMessageBox::about(NULL,"ok","归还成功!");
}
else{
QMessageBox::about(NULL,"error","归还失败");
return;
}
if(query1.isActive()){
QMessageBox::about(NULL,"ok","更新成功!");
}
else{
QMessageBox::about(NULL,"error","更新失败");
return;
}

//更新借书窗口
updateLoanBookWindow();
}

/* 借阅书籍 */
void database::lendBook()
{
//判断是否选中书籍
bool flag = false;
int max_num = 0;
QSqlQuery query,query1,query2;

//借书前判断用户是否具有借阅权限
query.exec("select isLent from user where username = '" + current_user + "'");

if(query.next()){
bool isLent = query.value(0).toBool();
if(!isLent){
QMessageBox::critical(0,"error","您不具有借书权限,需等待管理员添加!");
return;
}
}
else{
return;
}

//判断用户借阅的书籍是否达到最大书籍
query.exec("select count(*) from loan where username = '" +
current_user + "'");
if(query.next()){
int totalNum = query.value(0).toInt();
if(totalNum>=3){
QMessageBox::critical(0,"error","您的借书数目已达到限额(3本)!");
return;
}
}
else{
return;
}

//得到当前页码所能显示的最多书籍
int max;
if(current_page==max_page){
max = result.length()%100/10;
if(result.length()%100==0)max = 10;
}
else max = 10;
QDate d = QDate::currentDate();
QString date = d.toString("yyyy-MM-dd");

//根据用户选中的书籍插入相应借阅信息
for(int i=0;i<max;i++){
if(item2[i]->checkState() == Qt::Checked){
bool isMutiNum = false;
int num = 1;
flag = true;

//判断当前书本是否有库存
query.exec("select number from book where book_id = '" + item3[i]->text() + "'");
if(query.next()){
int num = query.value(0).toInt();
if(num==0){
QString str = item3[i]->text() + "暂无库存!";
QMessageBox::critical(NULL,"error",str);
}
}
else{
return;
}

//考虑到一本书可以被借多次,在这里进行特殊的处理
query.exec("select loan_number from loan where username ='" +
current_user + "' and book_id = '" + item3[i]->text()
+ "'" );
while(query.next()){
isMutiNum = true;
num = query.value(0).toInt();
if(num>max_num)max_num = num;
}
if(isMutiNum){
max_num++;
query1.exec("insert into loan values('" + current_user + "','" +
item3[i]->text() + "','" + date + "'," +
QString::number(max_num) + ")" );
}
else{
query1.exec("insert into loan values('" + current_user + "','" +
item3[i]->text() + "','" + date + "',1)" );
}
if(query1.isActive()){
query2.exec("update book set number = number - 1 where book_id = '" +
item3[i]->text() + "'");
}
}
}
if(!flag){
QMessageBox::critical(0,"error","您尚未选择任何书目!");
return;
}
if(query1.isActive()){
QMessageBox::about(0,"ok","借阅成功");

}
else{
QMessageBox::critical(0,"error","借阅失败");
return;
}

updateLoanBookWindow();
}


main.cpp

#include "database.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
database w;

return a.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: