数据库课程设计-图书馆管理系统(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字,提示太长了,缩短后点击提交,提示提交成功

 

  • 15
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
数据库系统原理》课程设计—图书馆管理系统 一、课程设计的目的及意义 本课程设计是在学习《数据库原理》课程后,进行的一次全面的综合训练,其目的在于 加深对数据库原理的理解,掌握运用数据库应用系统开发软件的使用方法。通过此次课 程设计,将理论联系实际,可以增强自己的实践动手能力。 二、项目背景 随着现代科学技术的进步,人类社会正逐步走向信息化。图书馆拥有丰富的文献信息 资源,是社会信息系统的重要组成部分,在信息社会中的作用愈来愈重要。我国图书馆 计算机等信息技术的应用起步于20世纪70年代末期,随着改革开放的步伐得以迅速发展 ,特别是90年代以后,我国图书馆信息网络建设取得了较大发展,图书馆信息化建设迈 上了一个新台阶。 某高校图书馆的要求就是藏书全部开放,师生共享、开架借阅。这种借阅方式是发挥 图书馆应有作用的最佳方式,也是素质教育的最好体现。它充分发挥了图书馆的功效, 最大限度地为师生服务,这也是图书馆自动化管理的最终目标。实现这一目标,必须有 现代化的管理手段和体制,图书馆管理的信息化是一个必然趋势。图书馆的信息化管理 ,就是将传统图书馆业务的手工操作转变成由计算机管理,即将图书馆的图书期刊、音 像资料等各种载体文献的采编、典藏、流通、检索及常规业务管理工作,利用计算机技 术,进行高效、准确的信息化管理。 某高校图书馆管理系统总的实现目标是:建立以馆藏目录为基础的机读书目数据库, 实现馆内采购、编目、流通、文献检索等信息化管理;建立图书馆动态网站;接入校园 网为广大师生及时提供馆内的最新信息。长期的目标还要实现直接浏览电子图书以及馆 际间的图书互借等。 三、可行性研究及需求分析、概要设计 1、可行性研究 随着信息时代的到来,人们对知识的需要日益增长,图书馆的藏书、管理人员、读者 的数量也越来越多。图书馆管理涉及大量的数据处理,如果用手工来完成庞大的数据处 理,将费时费力,还容易出错,为了满足图书馆管理的需要,急需要一套图书馆管理系 统来完成这项工作。作为计算机应用的一部分,使用计算机对图书馆信息进行管理,有 着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保 密性好、寿命长、成本低等。这些优点能够极大地提高图书馆管理的效率,也是企业的 科学化、正规化管理的重要条件。 2、需求分析和概要设计 一般通用的图书馆管理系统包括系统管理、读者管理、编目、图书流通、统计、查询 等功能。比较先进的图书馆管理系统能够在一个界面下实现图书、音像、期刊的管理、 设置假期、设置暂离锁(提高安全性)、暂停某些读者的借阅权、导入导出读者、升级 辅助编目等。此外随着Internet应用的发展,一个完善的系统还应提供无缝接入Intern et的功能,通过IE浏览器让读者使用借阅资料查询、修改密码、预约、资料检索等功能 。有些系统还提供读者自助服务,可以开放一些客户机让读者自行管理密码、查询自己 的借阅情况、预约资料、检索资料等。 下面介绍的是通用图书馆管理系统所必备的功能,如图1所示,包括基本信息维护、 读者管理、图书管理、期刊管理、图书流通管理、期刊流通管理、统计分析管理和系统 管理功能模块,其中每个功能都由若干相关联的子功能模块组成。除此之外系统还应包 括信息系统必须具备的通用功能,例如用户登陆、权限管理、权限设置、数据备份与恢 复等,由于有很多数据库应用方面的书籍对此均有介绍,这里就不再详细介绍了。 图1 图书馆管理系统应包括的基本功能 2.1、基本信息维护模块 "基本信息维护"用于对图书馆信息、书籍信息、常用词库等项目进行初始化设置,这 些设置一般不能轻易改动,包含的子功能模块如图2所示。 图2 "基础信息维护"功能模块 "图书馆信息"用于设置图书馆的基本信息,包括图书馆名称、管长、负责人、电话、说 明等。 "系统参数设置"用于设置系统运行所需的参数,包括办证费用、证件有效期、图书超期 罚款金额、期刊超期罚款金额等。 "书架设置"用于设置书架的基础信息,内容包括书架编号、书架名称等。 "管理员设置"用于设置使用的人员及权限。 "图书期刊词库设置"用于设置系统常用的词库,内容包括供应商、分级、附件、尺寸、 语系、印刷等信息的预先设定值。 2.2、读者管理模块 "读者管理"用于管理与读者有关的信息,包含的子功能模块如图3所示。 图3 "读者管理"功能模块 "读者类型设置"用于设置读者的类型及相关的信息,内容包括图书类型、图书册数、期 刊册数、续借次数、限制图书、限制期刊等。 "读者档案管理"用于设置读者相关的信息,内容包括编号、条形码、姓名、性别、类型 、出生日期、有效证件、证件号码、联系方式、登记日期、有效期至、操作员、备注、 图书借阅次数、期刊借阅次数、是否挂失等。 "借书证挂失与恢复"用于挂失和恢复读者的借书证,挂失
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛_Lin~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值