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

这篇具有很好参考价值的文章主要介绍了数据库课程设计-图书馆管理系统(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 选择系统管理员登录

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

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

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

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

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

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

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

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

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

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

点击删除图书管理员,输入用户名123456,点击确认删除,提示没有这个管理员数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 输入111,点击确认,删除成功

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

读者测试

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

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

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

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

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

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

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

数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)点击ok,之后查到的信息会展示在表格里,查询是模糊查询,只要书名含有输入的关键字,就会被查出来,不区分大小写

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

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

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

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

 输入旧密码123456,新密码1234567,重复1234567,点击确认修改,提示成功数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

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

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

缩短后重新提交,提示成功数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 回到主菜单点击查询反馈结果,可以看到刚才提交的意见,点击一个格子可以查看详细内容,会在下方显示数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

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

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

图书管理员测试

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

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

数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)使用一个正常的图书管理员账户,用户名1234 密码1234567, 登录,在主菜单选择查询借阅信息,输入用户名yuning7 ,提示查到的借阅记录数目

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

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

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

关闭借阅记录页面,回到主菜单,点击添加图书,输入一个无效的价格,提示执行失败,可能价格不正确  (使用正则表达只限制了输入为0-9的数字和小数点)数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

输入一个有效价格 ,提示添加成功数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 查询添加结果,成功 

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

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

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

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

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

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

数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 点击修改,图书名,价格,图书状态,馆藏位置变为可修改

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

添加馆藏位置,点击确认,提示修改成功数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 重新查询,发现变为可借数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

 关闭查询页,回到主菜单,点击图书借阅,输入不存在的读者用户名,提示读者不存在数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

 输入不存在的图书编号,提示图书不存在数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

输入不可借状态的图书,提示不可借数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 输入正确,提示办理成功 

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

选择办理归还,输入图书编号33,点击选择,显示借阅信息,显示归还按钮 数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

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

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

在主菜单点击归还,再次输入图书编号28,提示没有待归还的借阅信息数据库课程设计-图书馆管理系统(3. 用户软件,基于QT) 输入图书编号21,点击选择,然后点击丢失归还,提示费用45.66数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

 在主菜单点击待处理反馈,提示有5条待处理的反馈(最近的是刚才AB用户提交的)数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

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

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

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

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

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

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

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

 数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)文章来源地址https://www.toymoban.com/news/detail-487162.html

到了这里,关于数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java连接数据库实现图书馆管理系统(详细教程)

    该功能用到的软件为 IDEA 、Navicat 、云服务器(非必须) 源码下载 https://www.aliyundrive.com/s/UTz8pNxobGK 在自己的服务器或者电脑本机安装数据库系统,本次系统演示的数据库版本为5.6。 1.创建图书管理数据库library 字符集为:utf8 -utf8_general_ci 2.设计好将要使用的sql语句 视图、存储

    2024年02月06日
    浏览(37)
  • c语言课程设计(图书馆管理系统)

    大一c语言课程设计:图书馆管理系统。 图书管理系统,功能齐全拿来就能用 1.主界面   代码段  2.图书录入界面 运用文件录入多次使用   代码段  3.图书查询界面 根据输入书的数据与文件中数据进行比对 ,查找后输出。 代码段 4.图书修改 输入修改图书数据并在文件中查找

    2024年02月11日
    浏览(28)
  • vue图书馆书目推荐数据分析与可视化-计算机毕业设计python-django-php

    建立本图书馆书目推荐数据分析是为了通过系统对图书数据根据算法进行的分析好推荐,以方便用户对自己所需图书信息的查询,根据不同的算法机制推荐给不同用户不同的图书,用户便可以从系统中获得图书信息信息。 对用户相关数据进行分析,为相似度较高的用户建立邻

    2024年02月06日
    浏览(37)
  • 图书馆座位预约小程序系统设计与实现

    目的 :本课题主要目标是设计并能够实现一个基于微信小程序预约订座小程序,前台用户使用小程序,后台管理使用Java+Mysql开发,后台使用了springboot框架;通过后台添加座位类型、座位号,用户通过小程序登录,查看座位、提交座位预约信息。 意义 :微信小程序预约订座

    2024年02月09日
    浏览(31)
  • 基于JAVA图书馆管理系统设计与实现

    【后台管理员功能】 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信息,支持删除 资讯分类:录入、修改、查看、删除资讯分类 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列

    2024年02月13日
    浏览(39)
  • 学校图书馆管理系统的架构设计与实现

    随着大学生越来越多,学校图书馆的管理变得愈发复杂。为了更好地管理和服务于学生和教职工,学校需要建立一个高效的图书馆管理系统。本文将介绍学校图书馆管理系统的架构设计与实现。 1. 架构设计 学校图书馆管理系统的架构设计主要分为三个部分: 展示层:展示层

    2024年02月22日
    浏览(39)
  • java毕业设计——基于java+Java Swing+sqlserver的图书馆书库管理系统设计与实现(毕业论文+程序源码)——图书馆书库管理系统

    大家好,今天给大家介绍基于java+Java Swing+sqlserver的图书馆书库管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦 文章目录: 毕业

    2024年02月03日
    浏览(33)
  • 【计算机毕业设计】图书馆管理系统设计与实现

            以往的图书馆管理事务处理主要使用的是传统的人工管理方式,这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点,长期的人工管理模式会产生大量的文本借书与文本数据,这对事务的查询、更新以及维护带来不少困难。随着互联网时代的到来,现如

    2024年02月04日
    浏览(34)
  • 【计算机毕业设计】图书馆借阅管理系统

    一、系统截图(需要演示视频可以私聊)         摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、

    2024年02月09日
    浏览(63)
  • 微信图书馆座位预约小程序系统设计与实现,

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包