[mysql+qt] 图书管理系统

一.图书管理数据库概念模式设计

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

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

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

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

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

二.数据库设计

        管理员(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();

    //连接数据库
    if(!createConnection()){
        QMessageBox::critical(0,"error","数据库连接失败");

    }
}

/* 析构函数 */
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();
        }
    }
    //清空表格信息
    clearAddBookMessage();
    //继续加载文本信息(如果还有的话)
    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();
}
时间: 2024-10-09 05:11:33

[mysql+qt] 图书管理系统的相关文章

PHP+MySql实现图书管理系统

这个图书管理系统是我学完PHP时写的一个练手项目,功能参考了自己学校的图书管理系统.为了锻炼自己的动手能力以及加深对代码的理解,前端和后端均由自己完成,前端使用了一些基本的框架(毕竟我主攻后端开发方向),后端大部分要用到的功能都是自己从底层实现并封装,基本没有用到第三方框架.总体来说还是比较简陋的,在某些地方可能存在缺陷或者漏洞. 项目地址 此项目已经提交到我的Github中 仓库地址:https://github.com/horvey/library-manager 基本功能 用户 查询图书状

c语言小项目-使用mysql数据库的图书管理系统

VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装得很方便使用.这里使用的是mysql方式. 1.新建bookAdminSys工程 2.将文件夹MySQL目录下的include添加到VC++目录中的包含目录中,另外将文件夹MySQL目录下的lib添加到VC++目录中的库目录中 3.添加附加依赖项,将MySQL目录下的libmysql.lib添加到L

Java swing项目-图书管理系统(swing+mysql+jdbc)

(一)项目功能分析 该项目是设计一个图书管理系统,主要包含的内容有 (1)管理员登陆界面 ->信息录入 ->登录 ->重置 (2)图书管理系统总界面 ->子界面菜单: 1)图书类别添加子界面 ->图书类别信息录入 ->图书类别添加 ->图书类别信息重置 2)图书类别管理子界面 ->显示所有的图书类别 ->查询图书类别 ->修改的图书类别信息显示 ->修改图书类别信息 ->删除图书类别 3)图书添加子界面 ->图书信息录入 -&g

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website development Tags asp.net / mvc4 相关资源 ibatis manual pro git 廖雪峰的官方网站 BookMS-V1.0 上一篇链接 任务简介 开发工具:VS2010 项目框架:MVC4 浏览器:Chrome 数据库ORM框架:iBatis.net 数据库:mysql 后端开

基于jsp+servlet图书管理系统之后台用户信息删除操作

上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732955 自此,基于jsp+servlet开发的用户信息增删该查已经全部写完了,上面的链接是全部的代码,包含增删该查和数据库. 注意点: 1:删除操作使用的是伪删除.即只是不在页面显示了,但是还保存在数据库. 2:分页查询使用的是一个小工具,后面有时间把这些

Java版本:图书管理系统

实验目的:掌握数据库编程技术.能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 实验内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出版日期.书号.价格字段.设计一个GUI界面进行书目管理.在该界面上有四个选项卡,分别是查询.插入.删除.修改.点击查询选项卡,出现的界面上有书名.作者.出版社.书号四个文本框,一个按钮和一个只读文本区.文本框内容可以为空,输入相应的查询信息后(例如根据书名查询可以仅输入书名),点击界面上的"查询"按钮,可以在界面下方的文本区中显

图书管理系统(spring springmvc)

Spring入门demo||图书管理系统 一. 本图书管理系统基于spring,spring mvc,数据库为mysql.前端使用了Bootstrap. 非常适合学习spring的新手. 二.功能概述该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等的功能. 三.数据库本系统共有六张数据表.admin为管理员表,book_info为图书信息表,class_info为分类信息表,lend_list为借还信息表,reader_card为读者证表,re

Python-Flask框架之——图书管理系统 , 附详解源码和效果图 !

该图书管理系统要实现的功能: 1. 可以通过添加窗口添加书籍或作者, 如果要添加的作者和书籍已存在于书架上, 则给出相应的提示. 2. 如果要添加的作者存在, 而要添加的书籍书架上没有, 则将该书籍添加到该作者栏. 3. 如果要添加的作者和书籍都不存在于书架上 , 则将书籍和作者一起添加. 4. 每个书籍和作者旁边都有一个删除按钮 , 点击删除书籍的按钮可以将该书籍删除 , 若某作者栏的书籍全部删除完毕则显示"无". 5. 若直接点击删除作者按钮, 则可以将该作者和其书籍一起全部删掉.

在Django中使用ORM创建图书管理系统

一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等)会有点区别, 因此直接在你的项目中使用sql语句的话,不便于以后的修改,万一更换了数据库,那所有sql语句不就要重新写吗? 所以这个时候ORM就体现出优点了,你只需要写ORM的代码,它就会根据你连接的数据库自动帮你翻译成对应的sql语句, 也就是说无论你使用的是mysql还是oracle,ORM操