数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是) 

(骗一下数据,说不定以后面试就过了,拜谢)

用户软件的实现根据自己所用语言选择对应开发工具,c++ 较常用的是QT或者MFC。这里使用QT做个示例,但博主前端属实现学现卖,也就是能用级别,可以参考一下,大佬轻喷。

(如果之前没接触过qt 和 c++,可能入门需要比较久时间,建议直接使用普通文本界面)

相关资源已放主页了,需要自取,同时上传github了

地址如下:https://github.com/goLSX/library_manager_system

目录

安装驱动

各个页面主要代码实现

系统启动

读者注册

用户登录

读者查询个人信息

读者修改个人信息

查询图书信息

查询借阅信息

提交意见反馈

查询意见反馈结果

修改密码

添加图书

删除图书

修改图书

图书借阅

图书归还

反馈处理

运行测试

系统管理员测试

读者测试

图书管理员测试


安装驱动

首先QT连接mysql 需要mysql的驱动程序,我用的QT 5.12.6 本身不集成mysql的驱动程序,需要手动编译,参考了这篇博文Qt连接MySQL数据库_自有林中趣的博客-CSDN博客_qt访问mysql

确定自己驱动安装好后,就可以尝试连接已经建立好的数据库

需要这几个头文件

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>  这个是打印用的

连接代码示例如下

第一行checker_connection是连接的名字,我们后面有不同的用户身份,需要使用不同的连接,通过这个连接名标识 

第二行hostname 是主机名,这个不用改,一般都是127.0.0.1

第三行,端口port 是3306,mysql服务通过3306端口提供

第四行,username是数据库里面建立的用户的用户名,之前我们建立了checker、reader、manager、sys_manager四个用户,之后都要用到

第五行pasword 用户密码,这个也是自己设置的

第六行databasename 我们要连接数据库的名字,就是放置所有表的那个模式的名字,我使用的是library_db

最后一行,打印看看连接是否成功,成功应该返回true

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","checker_connection");   
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("checker");
    db.setPassword("checkerpassword");
    db.setDatabaseName("library_db");//数据库名
    qDebug() <<  db.open();

各个页面主要代码实现

系统启动

系统运行时,先创建登录界面,然后尝试建立checker连接,如果checker连接建立失败,就提示checker建立失败,然后退出程序。checker建立成功则显示登录界面,循环等待操作

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

    if(!build_checker())    //建立checker失败
    {
        QMessageBox::information(w,"infor" ,"checker连接建立失败");
        exit(1);   //退出程序
    }
    w->show();   //显示登录页

    return a.exec();
}

读者注册

先对读者填写的注册信息格式进行检验,如果有检验不提供,弹框提示,结束函数;检验通过后,创建QSqlQuery,使用checker连接,执行检查函数sql,检查用户注册信息是否存在,如果存在则弹框提示读者;如果注册信息不存在,求输入密码的md5,然后将输入的注册信息一起作为参数传递给注册函数insert_reader。注册成功后弹框提示,然后关闭sqlQuery,关闭和释放注册页面.(图书管理员添加类似)

    if(password != ui->sigh_up_password2->text())
    {
        QMessageBox::information(this, "infor", "两次密码不一致");
        return;
    }
    if(password.size() < 6 )
    {
        QMessageBox::information(this, "infor", "密码太短");
        return;
    }
    if(id_num.size() != 15 and id_num.size() != 18 )
    {
        QMessageBox::information(this, "infor", "身份证长度不正确");
        return;
    }
    if(phone_num.size() != 11 )
    {
        QMessageBox::information(this, "infor", "手机号长度不正确");
        return;
    }
    // 指定使用checker连接
    QSqlQuery sqlQuery(QSqlDatabase::database("checker_connection")); 

    QString sql = QObject::tr(" call check_reader_sigh_up('%1','%2',@result)").arg(reader_name,id_num);

    qDebug() << "执行结果 " << sqlQuery.exec(sql) << endl;   //检查用户注册信息是否已存在
    qDebug() << "结果size " << sqlQuery.size() << endl;

    while(sqlQuery.next())
    {
         if(sqlQuery.value(0).toString() != "OK")
         {
             QMessageBox::information(this, "infor", sqlQuery.value(0).toString());
             return;
         }
    }
    password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex();   //求md5

    sql = QObject::tr(" call insert_reader('%1','%2','%3','%4','%5')").arg
            (reader_name,password,name,id_num,phone_num);
    if(sqlQuery.exec(sql) )   //注册用户账号
    {
        QMessageBox::information(this, "infor", "注册成功");
    }
    sqlQuery.finish();
   s->hide();
   delete s;

用户登录

有三类用户,通过选择的用户类型判断执行哪一个登录流程;读者和图书管理员都先使用checker连接,将密码md5和用户名传递给账户检验函数check_reader/check_manager,检验不通过则弹框提示失败,结束函数.检验成功后释放checker连接,建立用户自己的连接(一类用户共用一个数据库用户),然后显示用户界面;系统管理员直接使用数据库的用户账号登录,建立连接成功就进入系统管理员菜单。

if(user_type == "读者")
    {

        QSqlQuery sqlQuery(QSqlDatabase::database("checker_connection")); // 指定使用checker连接
        QString sql;
        password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex();   //求md5
        sql = QObject::tr(" call check_reader('%1','%2',@result)").arg(user_name,password);

        qDebug() << "用户正确 " << sqlQuery.exec(sql) << endl;   //检查用户信息是否正确


        while(sqlQuery.next())
        {
             if(sqlQuery.value(0).toString() != "正确")     // sql检验用户不正确
             {
                 QMessageBox::information(this, "infor", user_type+"用户名或密码错误");
                 return;
             }
        }
        sqlQuery.finish();
        QSqlDatabase::database("checker_connection").close();     //关闭checker连接
        QSqlDatabase::removeDatabase("checker_connection");  //从列表删除

        if(!build_reader())      //建立reader连接
        {
            QMessageBox::information(this, "infor", "reader连接失败");
            exit(1);
        }

        rm = new reader_mainmenu;   //创建读者菜单
        w->hide();
        delete w;      //删除登录界面
        w = nullptr;
        rm->show();    //显示读者菜单
//图书管理员
password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex();   //求md5
        sql = QObject::tr(" call check_manager('%1','%2',@result)").arg(user_name,password);

if(!build_manager())      //建立manager连接
        {
            QMessageBox::information(this, "infor", "manager连接失败");
            exit(1);
        }

        mm = new manager_mainmenu;   //创建图书管理员菜单
        w->hide();
        delete w;      //删除登录界面
        w = nullptr;
        mm->show();    //显示图书管理员菜单
else if(user_type == "系统管理员")     //使用输入的用户名和密码尝试建立mysql连接,没有检查阶段,因为不存储系统管理员账户
    {
        //建立sysmanager连接
        QSqlDatabase sysmanager_db = QSqlDatabase::addDatabase("QMYSQL","sysmanager_connection");
        sysmanager_db.setHostName("127.0.0.1");
        sysmanager_db.setPort(3306);
        sysmanager_db.setUserName(user_name);             //这里使用的账户密码是 mysql创建的用户的账户密码
        sysmanager_db.setPassword(password);
        sysmanager_db.setDatabaseName("library_db");//数据库名
        if(!sysmanager_db.open())    //sysmanager连接失败
        {
           QMessageBox::information(this, "infor","登录数据库账户有误!\n sysmanager连接数据库失败 ");
           return;
        }
        smm = new sysmanager_mainmenu;   //创建系统管理员菜单
        w->hide();
        delete w;      //删除登录界面
        w = nullptr;
        smm->show();    //显示系统管理员菜单
    }

读者查询个人信息

指定使用reader连接,自动获取用户名传递给查询函数,查询失败则弹框提示;查询成功后将信息展示到用户界面。关闭sqlQuery  (图书管理员查询类似)

QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
    QString sql;
    extern QString user_name;
    sql = QObject::tr(" call select_reader_message('%1')").arg(user_name);
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错");
        return;
    }
    while(sqlQuery.next())
    {
        ui->reader_name->setText(sqlQuery.value(0).toString());
        ui->name->setText(sqlQuery.value(1).toString());
        ui->id_num->setText(sqlQuery.value(2).toString());
        ui->age->setText(sqlQuery.value(3).toString());
        ui->phone_num->setText(sqlQuery.value(4).toString());
    }
    sqlQuery.finish();

读者修改个人信息

从输入框获取到的内容进行检验,检验失败弹框提示失败;检验成功后创建sqlQuery,指定使用reader连接,将输入框的内容传递给修改函数,如果修改失败,弹框提示修改失败,结束函数;修改成功后提示修改成功,关闭sqlQuery,关闭修改页

if(id_num.size() != 15 and id_num.size() != 18 )
    {
        QMessageBox::information(this, "infor", "身份证长度不正确");
        return;
    }
    if(phone_num.size() != 11 )
    {
        QMessageBox::information(this, "infor", "手机号长度不正确");
        return;
    }


    QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接

    QString sql;
    extern QString user_name;

    sql = QObject::tr(" call update_reader_message('%1','%2','%3','%4')").arg(user_name,name,id_num,phone_num);
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "修改出错");
        return;
    }
    QMessageBox::information(this, "infor", "修改成功");
    sqlQuery.finish();

    extern reader_message *r;
    r->hide();
    delete  r;
    r = nullptr;

查询图书信息

先清除表格内容,然后根据用户类型选择使用哪个连接;从输入框获取书名,传递给查询函数,如果执行出错,弹框提示出错,结束函数;查询成功后弹框提示查询到的数据量,展示到表格。关闭sqlQuery

if(user_type == "读者")  connection_name = "reader_connection";
    else if(user_type == "图书管理员")  connection_name = "manager_connection";
    QSqlQuery sqlQuery(QSqlDatabase::database(connection_name)); // 指定使用哪个连接
    QString sql;
    sql = QObject::tr(" call select_book_message('%1')").arg(ui->book_name->text());    //从输入框获取书名进行sql查询
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错");
        return;
    }
    QMessageBox::information(this, "infor", "图书信息查询sql执行成功\n查到" + QString::number(sqlQuery.size()) + "条数据" );
    for(int i = 0; sqlQuery.next();i++)
    {
        for(int j = 0; j < 5 ;j++)          // 循环设置每一列的内容,共5列
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
        }
    }
    sqlQuery.finish();

查询借阅信息

如果是读者查询借阅信息,使用reader连接,自动获取用户名传递给查询函数,将查询结果展示到表格;如果查询失败,弹框提示出错,结束函数.

if(user_type == "读者")
    {
        ui->widget->hide();
        extern QString user_name;
        QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
        QString sql;
        sql = QObject::tr(" call select_return_message('%1')").arg(user_name);
        if(!sqlQuery.exec(sql))
        {
            QMessageBox::information(this, "infor", "借阅信息查询sql执行出错");
            return;
        }
        for(int i = 0; sqlQuery.next();i++)
        {
            for(int j = 0; j < 12 ;j++)
            {
                ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
            }
        }
        sqlQuery.finish();
    }

如果是图书管理员,指定使用manager连接,需要在输入框输入要查询的用户名,点击查询,之后将查询结果展示到表格

 ui->tableWidget->clearContents();   //清除表格内容
    QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call select_return_message('%1')").arg(ui->reader_name->text());
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "借阅信息查询sql执行出错");
        return;
    }

    QMessageBox::information(this, "infor", "借阅信息查询sql执行成功\n查到" + QString::number(sqlQuery.size()) + "条数据" );
    for(int i = 0; sqlQuery.next();i++)
    {
        for(int j = 0; j < 12 ;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
        }
    }
    sqlQuery.finish();

提交意见反馈

检查反馈的字数,超过100提示太长,结束函数。检验通过后,创建sqlQuery使用reader连接,

自动获取用户名,与反馈一起传递给提交函数;如果提交失败,弹框提示失败,结束函数;提交成功弹框提示成功,关闭和释放页面.

QString opinion = ui->opinion->toPlainText();
    if(opinion.size() > 100)
    {
        QMessageBox::information(this, "infor", "太长了,请不要超过100字");
        return;
    }
    QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
    QString sql;
    extern QString user_name;
    sql = QObject::tr(" call insert_opinion('%1','%2',curdate())").arg(user_name,opinion);
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错");
        return;
    }
    QMessageBox::information(this, "infor", "提交成功");
    extern insert_opinion *i;
    i->hide();
    delete i;
    i = nullptr;

查询意见反馈结果

使用reader连接,获取用户名进行查询,如果执行失败,提示失败,结束函数;成功则将查询结果展示到表格

QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
    QString sql;
    sql = QObject::tr(" call select_opinion_result_message('%1')").arg(user_name);
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错");
        return;
    }
    for(int i = 0; sqlQuery.next();i++)
    {
        for(int j = 0; j < 8 ;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
        }
    }
    sqlQuery.finish();

修改密码

先检验输入新密码合法信息,检验通过后建立checker连接,如果建立失败,弹框提示失败,结束函数。建立成功后,使用输入的旧密码,求md5,自动获取用户名,一起传递给账户检查函数,如果检查不通过,弹框提示错误;检查通过后关闭checker连接,使用用户的连接将新密码的md5和自动获取的用户名传递给修改各自的函数,如果修改失败,弹框提示失败,结束函数;修改成功,弹框提示成功,关闭sqlQuery,关闭和释放修改页面。

if(ui->password->text() != ui->password2->text())
    {
        QMessageBox::information(this, "infor", "两次密码不一致");
        return;
    }
    if(ui->password->text().size() < 6)
    {
        QMessageBox::information(this, "infor", "新密码太短,至少要6位");
        return;
    }

    if(!build_checker())    //建立checker连接
    {
        QMessageBox::information(this, "infor", "checker连接建立失败");
        return;
    }

    QSqlQuery *sqlQuery = new QSqlQuery(QSqlDatabase::database("checker_connection")); // 指定使用checker连接
    QString sql;
    extern QString user_name;
    QString password = QCryptographicHash::hash(ui->old_password->text().toLatin1(),QCryptographicHash::Md5).toHex();   //求旧密码md5
    if(user_type == "读者")
    {
        sql = QObject::tr(" call check_reader('%1','%2',@result)").arg(user_name,password);
    }
    else if(user_type == "图书管理员")
    {
        sql = QObject::tr(" call check_manager('%1','%2',@result)").arg(user_name,password);
    }

    qDebug() << "用户检查sql执行成功 " << sqlQuery->exec(sql) << endl;   //检查用户信息是否正确
   // qDebug() << "结果size " << sqlQuery.size() << endl;
    while(sqlQuery->next())
    {                                              // sql检验用户不正确
         if(sqlQuery->value(0).toString() == "错误")
         {
             QMessageBox::information(this, "infor", "原密码错误");
             return;
         }
         if(sqlQuery->value(0).toString() == "注销")
         {
             QMessageBox::information(this, "infor", "账号已注销");
             return;
         }
    }

    sqlQuery->finish();
    delete  sqlQuery;
    QSqlDatabase::database("checker_connection").close();       //关闭checker连接
    QSqlDatabase::removeDatabase("checker_connection");         //从列表删除



    password = QCryptographicHash::hash(ui->password->text().toLatin1(),QCryptographicHash::Md5).toHex();   //求新密码md5
    if(user_type == "读者")
    {
        sqlQuery = new QSqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
        sql = QObject::tr(" call update_reader_password('%1','%2')").arg(user_name,password);
    }
    else if(user_type == "图书管理员")
    {
        sqlQuery = new QSqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
        sql = QObject::tr(" call update_manager_password('%1','%2')").arg(user_name,password);
    }

    if(!sqlQuery->exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错");
        return;
    }
    QMessageBox::information(this, "infor", "修改成功");

    extern change_password *c;
    c->hide();
    delete c;
    c = nullptr;

添加图书

创建sqlQuery,使用manager连接,从输入框获取书籍名,价格,馆藏位置传递给添加函数。如果添加失败,弹框提示失败,结束函数;添加成功,弹框提示成功,关闭sqlQuery,关闭和释放添加页面。   (图书价格输入框使用正则表达式限制输入数字和小数点)

正则
QRegExp exp("[0-9\\.]+$");
    QValidator *Validator = new QRegExpValidator(exp);
    ui->book_price->setValidator(Validator);



QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    if(ui->book_position->text() == "")
    {
        sql = QObject::tr(" call insert_book('%1','%2',null)").arg
                (ui->book_name->text(),ui->book_price->text());
    }
    else
    {
        sql = QObject::tr(" call insert_book('%1','%2','%3')").arg
            (ui->book_name->text(),ui->book_price->text(),ui->book_position->text());
    }
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行出错,可能价格有误");
        return;
    }
    QMessageBox::information(this, "infor", "添加成功");
    sqlQuery.finish();
    extern insert_book *ib;
    ib->hide();
    delete ib;
    ib = nullptr;

删除图书

创建sqlQuery,使用manager连接,从输入框获取书籍编号传递给删除函数。如果删除失败,弹框提示失败,结束函数;弹框提示删除结果,关闭sqlQuery,关闭和释放添加页面。

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call delete_book('%1',@result)").arg(ui->book_num->text());
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "执行删除失败");
        sqlQuery.finish();
        return;
    }

    while(sqlQuery.next())
    {
        if(sqlQuery.value(0).toString() == "图书不存在")
        {
            QMessageBox::information(this, "infor", "图书不存在");
            sqlQuery.finish();
            return;
        }
        QMessageBox::information(this, "infor",sqlQuery.value(0).toString() );
    }

    sqlQuery.finish();
    db->hide();
    delete db;
    db = nullptr;

修改图书

先输入图书编号,点击选择,会执行查询找到要删除的图书信息。如果执行查询失败,提示出错,结束函数;查询成功后展示书籍信息到修改页,显示修改按钮。

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call select_book_by_num('%1')").arg(ui->book_num->text());    //从输入框获取书籍编号进行sql查询
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "查询书籍sql执行出错");
        return;
    }
    if(!sqlQuery.size())
    {
        QMessageBox::information(this, "infor", "查无此书" );
        return;
    }
    while (sqlQuery.next())
    {
        ui->book_num_display->setText(sqlQuery.value(0).toString());
        ui->book_name->setText(sqlQuery.value(1).toString());
        ui->book_price->setText(sqlQuery.value(2).toString());
        ui->book_state->setText(sqlQuery.value(3).toString());
        ui->book_position->setText(sqlQuery.value(4).toString());
    }
    sqlQuery.finish();
    ui->change->show();

修改按钮点击后,选择按钮消失,修改按钮消失,确认按钮显示,书籍名,价格,状态,位置设置为可修改;

确认按钮点击后,检查图书状态,如果状态有误,提示出错,结束函数;如果检验通过,创建sqlQuery,使用manager连接,获取文本框内容传递给修改函数,如果修改sql执行失败,弹框提示失败;修改成功,弹框提示成功,关闭sqlQuery, 关闭和释放图书修改页面.

if(ui->book_state->text() != "不可借" && ui->book_state->text() != "可借")
    {
        QMessageBox::information(this, "infor", "书籍状态有误\n可借/不可借");
        return;
    }
    QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call update_book('%1','%2','%3','%4','%5')").arg(ui->book_num_display->text(),
          ui->book_name->text(),ui->book_price->text(),ui->book_state->text(),ui->book_position->text());
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "修改图书信息sql执行出错,可能价格有误");
        return;
    }
    QMessageBox::information(this, "infor", "修改成功");
    sqlQuery.finish();

    extern update_book *ub;
    ub->hide();
    delete ub;
    ub = nullptr;

图书借阅

创建sqlQuery,使用manager连接,获取输入框用户名和书籍编号,自动获取用户名,一起传递给借阅办理函数,如果函数执行失败,弹框提示执行失败,结束函数;如果执行成功,查看返回结果,如果不是’成功’,弹框显示结果信息,结束函数; 否则提示办理成功;关闭sqlQuery,关闭和释放借阅办理页面.

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call insert_borrow('%1','%2','%3',curdate(),@result)").arg
            (ui->reader_name->text(),ui->book_num->text(), user_name);
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "办理借阅sql执行出错");
        return;
    }
    while(sqlQuery.next())
    {
        if(sqlQuery.value(0).toString() != "成功")
        {
            QMessageBox::information(this, "infor", sqlQuery.value(0).toString());
            return;
        }
    }
    QMessageBox::information(this, "infor", "办理成功");
    sqlQuery.finish();
    extern borrow_book *bb;
    bb->hide();
    delete bb;
    bb = nullptr;

归还

创建sqlQuery,指定使用manager连接,获取输入框的书籍编号,传递给查询函数,如果查询函数执行失败,弹框提示失败,结束函数;如果返回信息大小为0,弹框提示没有找到借阅信息,结束函数;否则将返回信息展示到页面,显示正常归还和丢失归还按钮,关闭sqlQuery.

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call select_borrow_by_booknum('%1')").arg
            (ui->book_num->text());
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "查询书籍sql执行出错");
        return;
    }
    if(!sqlQuery.size())
    {
        QMessageBox::information(this, "infor", "没有此书的待还借阅信息");
        return;
    }
    while(sqlQuery.next())
    {
        ui->borrow_rec_num->setText(sqlQuery.value(0).toString());
        ui->reader_name->setText(sqlQuery.value(1).toString());
        ui->book_num_display->setText(sqlQuery.value(2).toString());
        ui->book_name->setText(sqlQuery.value(3).toString());
        ui->borrow_state->setText(sqlQuery.value(6).toString());
    }
    sqlQuery.finish();
    ui->return_button->show();
    ui->return_button_bad->show();

点击正常归还或者丢失归还,创建sqlQuery,使用manager连接,获取文本框借阅记录编号,自动获取用户名,加上’正常’或’丢失’归还类型,一起传递给归还函数;如果归还执行失败,弹框提示失败,结束函数; 归还成功后弹框提示应付费用,关闭sqlQuery,关闭和释放归还页面.

正常归还
QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call insert_return('%1',curdate(),'%2','%3',@result)").arg
            (ui->borrow_rec_num->text(),user_name,"正常");
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "归还书籍sql执行出错");
        return;
    }
    while(sqlQuery.next())
    {
        QMessageBox::information(this, "infor", "费用"+sqlQuery.value(0).toString());
    }
    sqlQuery.finish();
    extern return_book *rb;
    rb->hide();
    delete rb;
    rb = nullptr;
丢失,只是参数不一样
sql = QObject::tr(" call insert_return('%1',curdate(),'%2','%3',@result)").arg
            (ui->borrow_rec_num->text(),user_name,"丢失");

反馈处理

 创建sqlQuery,使用manager连接,执行查询未处理反馈的sql,如果执行失败,弹框提示执行失败,结束函数; 如果查询结果大小为0,说明没有待处理反馈,提示没有待处理反馈,结束函数;

否则弹框提示查到的数据数量,然后展示数据到表格。结束sqlQuery.

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call select_pending_opinion()");
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "意见信息查询sql执行出错");
        return;
    }
    if(!sqlQuery.size())         //没有待处理反馈
    {
        QMessageBox::information(this, "infor", "没有待处理反馈");
        return;
    }
    QMessageBox::information(this, "infor", "查询到"+QString::number(sqlQuery.size())+"条待处理反馈");
    for(int i = 0; sqlQuery.next();i++)
    {
        for(int j = 0; j < 4 ;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
        }
    }
    sqlQuery.finish();

输入要处理的意见编号,点击处理。创建sqlQuery,指定manager连接,获取文本框输入的意见编号传递给检查函数,如果检查函数执行失败,弹框提示执行失败;如果返回信息大小为0,弹框提示意见不存在,如果翻返回信息的状态为处理完成,弹框提示不用处理;否则将意见文本展示到意见文本框(这样能看到全部信息),然后显示确认按钮,关闭处理按钮和意见编号输入文本框。

QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    sql = QObject::tr(" call select_opinion('%1')").arg(ui->opinion_rec_num->text());
    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "意见信息查询sql执行出错");
        return;
    }
    if(!sqlQuery.size())
    {
        QMessageBox::information(this, "infor", "意见不存在");
        return;
    }
    while(sqlQuery.next())
    {
        if(sqlQuery.value(1).toString() == "处理完成")
        {
            QMessageBox::information(this, "infor", "该意见已处理完成,不用处理");
            return;
        }
        ui->user_opinion->setText(sqlQuery.value(0).toString());
    }
    sqlQuery.finish();
    ui->deal->hide();
    ui->opinion_rec_num->hide();
    ui->confirm->show();

点击确认按钮,检验处理结果文本是否在100字内,如果超过100字,弹框提示太长,结束函数;创建sqlQuery,使用manager连接,获取文本框的意见编号和内容,自动获取用户名,一起传递给提交函数,如果提交函数执行失败,弹框提示执行失败,结束函数;否则弹框提示提交成功,关闭sqlQuery,关闭和释放处理页面。

if(ui->result->toPlainText().size() > 100)
    {
        QMessageBox::information(this, "infor", "太长了,不能超过100字");
        return;
    }
    QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
    QString sql;
    extern QString user_name;
    sql = QObject::tr(" call insert_opinion_result('%1','%2','%3',curdate())").arg
            (ui->opinion_rec_num->text(),ui->result->toPlainText(),user_name);

    if(!sqlQuery.exec(sql))
    {
        QMessageBox::information(this, "infor", "提交处理结果sql执行出错");
        return;
    }
    QMessageBox::information(this, "infor", "提交成功");
    sqlQuery.finish();
    extern give_feedback *gf;
    gf->hide();
    delete  gf;
    gf = nullptr;

运行测试

系统管理员测试

运行系统,用户名输入sys_manager 密码sys_managerpassword 选择系统管理员登录

点击查询图书管理员,输入18,点击查询

 

点击修改,账号状态改为注销1,点击确认,提示不合法

改成注销,点击确认,修改成功 

 关闭查询页面,回到主菜单,选择添加图书管理员,输入信息如下,点击确认注册,提示身份证长度不对。 (检查的内容有 两次密码长度6位以上,两次密码相同,手机号11位,身份证15/18位,用户名是否存在 )

输入正确的信息。点击确认注册,提示注册成功 

点击删除图书管理员,输入用户名123456,点击确认删除,提示没有这个管理员 输入111,点击确认,删除成功

读者测试

系统管理员菜单点击退出登录,回到登录界面,点击注册,输入注册信息,提示密码不一致(同样在读者注册页也有密码一致检验,密码长度检验,身份证、手机号长度检验,用户名已存在检验)

将两次密码都改为123456,点击注册,提示成功

 使用注册的账户进行登录,选择读者类型,输入用户名和密码.进入读者菜单后选择查询个人信息,可以看到查询到我们刚才提交的注册信息,修改与系统管理员修改图书馆管理员账户类似,但是允许修改的项目有姓名,身份证号,手机号

关闭个人信息查询页面,点击查询图书,输入图书名,点击查询,会显示查到多少条数据

点击ok,之后查到的信息会展示在表格里,查询是模糊查询,只要书名含有输入的关键字,就会被查出来,不区分大小写

 

关闭图书查询页面,回到主菜单点击修改密码,输入旧密码和新密码,点击确认修改

原密码输入错误12345,提示密码错误  (检验旧密码,新密码一致性,新密码长度6位以上)

 

 输入旧密码123456,新密码1234567,重复1234567,点击确认修改,提示成功

回到主菜单,点击意见反馈,弹出意见提交页,输入意见文本后点击提交,如果输入超过100字会提示太长

缩短后重新提交,提示成功 回到主菜单点击查询反馈结果,可以看到刚才提交的意见,点击一个格子可以查看详细内容,会在下方显示

该账号没有借阅记录查询到的内容为空,我们退出登录,切换一个账号,用户名AB,密码123456 读者账号,再次查询,可以看到借阅记录,点击表头某一栏可以进行排序 

 

图书管理员测试

退出登录,使用刚才系统管理员注册的图书管理员账户,用户名111 ,密码1234567,选择图书管理员登录,提示用户名或密码错误,使用正确的密码123456,登录,提示账号已注销 

使用一个正常的图书管理员账户,用户名1234 密码1234567, 登录,在主菜单选择查询借阅信息,输入用户名yuning7 ,提示查到的借阅记录数目

 点击ok,借阅记录展示到表格中

关闭借阅记录页面,回到主菜单,点击添加图书,输入一个无效的价格,提示执行失败,可能价格不正确  (使用正则表达只限制了输入为0-9的数字和小数点)

输入一个有效价格 ,提示添加成功 查询添加结果,成功 

 

关闭查询页面,点击删除图书,输入刚才添加的书的编号33,点击确认删除,提示成功 

 再次查询,发现图书变为不可借,馆藏位置变空

关闭查询页面,回到主菜单点击修改图书,输入图书编号33,点击选择,展示出图书信息

 点击修改,图书名,价格,图书状态,馆藏位置变为可修改

添加馆藏位置,点击确认,提示修改成功 重新查询,发现变为可借

 关闭查询页,回到主菜单,点击图书借阅,输入不存在的读者用户名,提示读者不存在

 输入不存在的图书编号,提示图书不存在

输入不可借状态的图书,提示不可借 输入正确,提示办理成功 

选择办理归还,输入图书编号33,点击选择,显示借阅信息,显示归还按钮 

点击办理正常归还,提示费用0 

 

在主菜单点击归还,再次输入图书编号28,提示没有待归还的借阅信息 输入图书编号21,点击选择,然后点击丢失归还,提示费用45.66

 在主菜单点击待处理反馈,提示有5条待处理的反馈(最近的是刚才AB用户提交的)

 点击ok进入反馈处理页面,输入待处理意见编号1,点击处理

提示该意见已经处理完毕,不需要处理了

点击ok,然后输入意见编号8,点击处理,会将用户意见显示到用户意见文本框,同时隐藏意见编号输入框和处理按钮,显示提交按钮 

 输入处理结果文本后点击提交,如果处理结果文本超过100字,提示太长了,缩短后点击提交,提示提交成功

 

猜你喜欢

转载自blog.csdn.net/ass133755/article/details/128655713