当前位置:   article > 正文

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

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

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

各个页面主要代码实现

系统启动

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

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. w = new MainWindow;
  5. if(!build_checker()) //建立checker失败
  6. {
  7. QMessageBox::information(w,"infor" ,"checker连接建立失败");
  8. exit(1); //退出程序
  9. }
  10. w->show(); //显示登录页
  11. return a.exec();
  12. }

读者注册

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

  1. if(password != ui->sigh_up_password2->text())
  2. {
  3. QMessageBox::information(this, "infor", "两次密码不一致");
  4. return;
  5. }
  6. if(password.size() < 6 )
  7. {
  8. QMessageBox::information(this, "infor", "密码太短");
  9. return;
  10. }
  11. if(id_num.size() != 15 and id_num.size() != 18 )
  12. {
  13. QMessageBox::information(this, "infor", "身份证长度不正确");
  14. return;
  15. }
  16. if(phone_num.size() != 11 )
  17. {
  18. QMessageBox::information(this, "infor", "手机号长度不正确");
  19. return;
  20. }
  21. // 指定使用checker连接
  22. QSqlQuery sqlQuery(QSqlDatabase::database("checker_connection"));
  23. QString sql = QObject::tr(" call check_reader_sigh_up('%1','%2',@result)").arg(reader_name,id_num);
  24. qDebug() << "执行结果 " << sqlQuery.exec(sql) << endl; //检查用户注册信息是否已存在
  25. qDebug() << "结果size " << sqlQuery.size() << endl;
  26. while(sqlQuery.next())
  27. {
  28. if(sqlQuery.value(0).toString() != "OK")
  29. {
  30. QMessageBox::information(this, "infor", sqlQuery.value(0).toString());
  31. return;
  32. }
  33. }
  34. password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex(); //求md5
  35. sql = QObject::tr(" call insert_reader('%1','%2','%3','%4','%5')").arg
  36. (reader_name,password,name,id_num,phone_num);
  37. if(sqlQuery.exec(sql) ) //注册用户账号
  38. {
  39. QMessageBox::information(this, "infor", "注册成功");
  40. }
  41. sqlQuery.finish();
  42. s->hide();
  43. delete s;

用户登录

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

  1. if(user_type == "读者")
  2. {
  3. QSqlQuery sqlQuery(QSqlDatabase::database("checker_connection")); // 指定使用checker连接
  4. QString sql;
  5. password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex(); //求md5
  6. sql = QObject::tr(" call check_reader('%1','%2',@result)").arg(user_name,password);
  7. qDebug() << "用户正确 " << sqlQuery.exec(sql) << endl; //检查用户信息是否正确
  8. while(sqlQuery.next())
  9. {
  10. if(sqlQuery.value(0).toString() != "正确") // sql检验用户不正确
  11. {
  12. QMessageBox::information(this, "infor", user_type+"用户名或密码错误");
  13. return;
  14. }
  15. }
  16. sqlQuery.finish();
  17. QSqlDatabase::database("checker_connection").close(); //关闭checker连接
  18. QSqlDatabase::removeDatabase("checker_connection"); //从列表删除
  19. if(!build_reader()) //建立reader连接
  20. {
  21. QMessageBox::information(this, "infor", "reader连接失败");
  22. exit(1);
  23. }
  24. rm = new reader_mainmenu; //创建读者菜单
  25. w->hide();
  26. delete w; //删除登录界面
  27. w = nullptr;
  28. rm->show(); //显示读者菜单
  1. //图书管理员
  2. password = QCryptographicHash::hash(password.toLatin1(),QCryptographicHash::Md5).toHex(); //求md5
  3. sql = QObject::tr(" call check_manager('%1','%2',@result)").arg(user_name,password);
  4. if(!build_manager()) //建立manager连接
  5. {
  6. QMessageBox::information(this, "infor", "manager连接失败");
  7. exit(1);
  8. }
  9. mm = new manager_mainmenu; //创建图书管理员菜单
  10. w->hide();
  11. delete w; //删除登录界面
  12. w = nullptr;
  13. mm->show(); //显示图书管理员菜单
  1. else if(user_type == "系统管理员") //使用输入的用户名和密码尝试建立mysql连接,没有检查阶段,因为不存储系统管理员账户
  2. {
  3. //建立sysmanager连接
  4. QSqlDatabase sysmanager_db = QSqlDatabase::addDatabase("QMYSQL","sysmanager_connection");
  5. sysmanager_db.setHostName("127.0.0.1");
  6. sysmanager_db.setPort(3306);
  7. sysmanager_db.setUserName(user_name); //这里使用的账户密码是 mysql创建的用户的账户密码
  8. sysmanager_db.setPassword(password);
  9. sysmanager_db.setDatabaseName("library_db");//数据库名
  10. if(!sysmanager_db.open()) //sysmanager连接失败
  11. {
  12. QMessageBox::information(this, "infor","登录数据库账户有误!\n sysmanager连接数据库失败 ");
  13. return;
  14. }
  15. smm = new sysmanager_mainmenu; //创建系统管理员菜单
  16. w->hide();
  17. delete w; //删除登录界面
  18. w = nullptr;
  19. smm->show(); //显示系统管理员菜单
  20. }

读者查询个人信息

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

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

读者修改个人信息

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

  1. if(id_num.size() != 15 and id_num.size() != 18 )
  2. {
  3. QMessageBox::information(this, "infor", "身份证长度不正确");
  4. return;
  5. }
  6. if(phone_num.size() != 11 )
  7. {
  8. QMessageBox::information(this, "infor", "手机号长度不正确");
  9. return;
  10. }
  11. QSqlQuery sqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
  12. QString sql;
  13. extern QString user_name;
  14. sql = QObject::tr(" call update_reader_message('%1','%2','%3','%4')").arg(user_name,name,id_num,phone_num);
  15. if(!sqlQuery.exec(sql))
  16. {
  17. QMessageBox::information(this, "infor", "修改出错");
  18. return;
  19. }
  20. QMessageBox::information(this, "infor", "修改成功");
  21. sqlQuery.finish();
  22. extern reader_message *r;
  23. r->hide();
  24. delete r;
  25. r = nullptr;

查询图书信息

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

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

查询借阅信息

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

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

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

  1. ui->tableWidget->clearContents(); //清除表格内容
  2. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  3. QString sql;
  4. sql = QObject::tr(" call select_return_message('%1')").arg(ui->reader_name->text());
  5. if(!sqlQuery.exec(sql))
  6. {
  7. QMessageBox::information(this, "infor", "借阅信息查询sql执行出错");
  8. return;
  9. }
  10. QMessageBox::information(this, "infor", "借阅信息查询sql执行成功\n查到" + QString::number(sqlQuery.size()) + "条数据" );
  11. for(int i = 0; sqlQuery.next();i++)
  12. {
  13. for(int j = 0; j < 12 ;j++)
  14. {
  15. ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
  16. }
  17. }
  18. sqlQuery.finish();

提交意见反馈

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

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

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

查询意见反馈结果

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

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

修改密码

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

  1. if(ui->password->text() != ui->password2->text())
  2. {
  3. QMessageBox::information(this, "infor", "两次密码不一致");
  4. return;
  5. }
  6. if(ui->password->text().size() < 6)
  7. {
  8. QMessageBox::information(this, "infor", "新密码太短,至少要6位");
  9. return;
  10. }
  11. if(!build_checker()) //建立checker连接
  12. {
  13. QMessageBox::information(this, "infor", "checker连接建立失败");
  14. return;
  15. }
  16. QSqlQuery *sqlQuery = new QSqlQuery(QSqlDatabase::database("checker_connection")); // 指定使用checker连接
  17. QString sql;
  18. extern QString user_name;
  19. QString password = QCryptographicHash::hash(ui->old_password->text().toLatin1(),QCryptographicHash::Md5).toHex(); //求旧密码md5
  20. if(user_type == "读者")
  21. {
  22. sql = QObject::tr(" call check_reader('%1','%2',@result)").arg(user_name,password);
  23. }
  24. else if(user_type == "图书管理员")
  25. {
  26. sql = QObject::tr(" call check_manager('%1','%2',@result)").arg(user_name,password);
  27. }
  28. qDebug() << "用户检查sql执行成功 " << sqlQuery->exec(sql) << endl; //检查用户信息是否正确
  29. // qDebug() << "结果size " << sqlQuery.size() << endl;
  30. while(sqlQuery->next())
  31. { // sql检验用户不正确
  32. if(sqlQuery->value(0).toString() == "错误")
  33. {
  34. QMessageBox::information(this, "infor", "原密码错误");
  35. return;
  36. }
  37. if(sqlQuery->value(0).toString() == "注销")
  38. {
  39. QMessageBox::information(this, "infor", "账号已注销");
  40. return;
  41. }
  42. }
  43. sqlQuery->finish();
  44. delete sqlQuery;
  45. QSqlDatabase::database("checker_connection").close(); //关闭checker连接
  46. QSqlDatabase::removeDatabase("checker_connection"); //从列表删除
  47. password = QCryptographicHash::hash(ui->password->text().toLatin1(),QCryptographicHash::Md5).toHex(); //求新密码md5
  48. if(user_type == "读者")
  49. {
  50. sqlQuery = new QSqlQuery(QSqlDatabase::database("reader_connection")); // 指定使用reader连接
  51. sql = QObject::tr(" call update_reader_password('%1','%2')").arg(user_name,password);
  52. }
  53. else if(user_type == "图书管理员")
  54. {
  55. sqlQuery = new QSqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  56. sql = QObject::tr(" call update_manager_password('%1','%2')").arg(user_name,password);
  57. }
  58. if(!sqlQuery->exec(sql))
  59. {
  60. QMessageBox::information(this, "infor", "执行出错");
  61. return;
  62. }
  63. QMessageBox::information(this, "infor", "修改成功");
  64. extern change_password *c;
  65. c->hide();
  66. delete c;
  67. c = nullptr;

添加图书

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

  1. 正则
  2. QRegExp exp("[0-9\\.]+$");
  3. QValidator *Validator = new QRegExpValidator(exp);
  4. ui->book_price->setValidator(Validator);
  5. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  6. QString sql;
  7. if(ui->book_position->text() == "")
  8. {
  9. sql = QObject::tr(" call insert_book('%1','%2',null)").arg
  10. (ui->book_name->text(),ui->book_price->text());
  11. }
  12. else
  13. {
  14. sql = QObject::tr(" call insert_book('%1','%2','%3')").arg
  15. (ui->book_name->text(),ui->book_price->text(),ui->book_position->text());
  16. }
  17. if(!sqlQuery.exec(sql))
  18. {
  19. QMessageBox::information(this, "infor", "执行出错,可能价格有误");
  20. return;
  21. }
  22. QMessageBox::information(this, "infor", "添加成功");
  23. sqlQuery.finish();
  24. extern insert_book *ib;
  25. ib->hide();
  26. delete ib;
  27. ib = nullptr;

删除图书

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

  1. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  2. QString sql;
  3. sql = QObject::tr(" call delete_book('%1',@result)").arg(ui->book_num->text());
  4. if(!sqlQuery.exec(sql))
  5. {
  6. QMessageBox::information(this, "infor", "执行删除失败");
  7. sqlQuery.finish();
  8. return;
  9. }
  10. while(sqlQuery.next())
  11. {
  12. if(sqlQuery.value(0).toString() == "图书不存在")
  13. {
  14. QMessageBox::information(this, "infor", "图书不存在");
  15. sqlQuery.finish();
  16. return;
  17. }
  18. QMessageBox::information(this, "infor",sqlQuery.value(0).toString() );
  19. }
  20. sqlQuery.finish();
  21. db->hide();
  22. delete db;
  23. db = nullptr;

修改图书

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

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

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

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

  1. if(ui->book_state->text() != "不可借" && ui->book_state->text() != "可借")
  2. {
  3. QMessageBox::information(this, "infor", "书籍状态有误\n可借/不可借");
  4. return;
  5. }
  6. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  7. QString sql;
  8. sql = QObject::tr(" call update_book('%1','%2','%3','%4','%5')").arg(ui->book_num_display->text(),
  9. ui->book_name->text(),ui->book_price->text(),ui->book_state->text(),ui->book_position->text());
  10. if(!sqlQuery.exec(sql))
  11. {
  12. QMessageBox::information(this, "infor", "修改图书信息sql执行出错,可能价格有误");
  13. return;
  14. }
  15. QMessageBox::information(this, "infor", "修改成功");
  16. sqlQuery.finish();
  17. extern update_book *ub;
  18. ub->hide();
  19. delete ub;
  20. ub = nullptr;

图书借阅

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

  1. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  2. QString sql;
  3. sql = QObject::tr(" call insert_borrow('%1','%2','%3',curdate(),@result)").arg
  4. (ui->reader_name->text(),ui->book_num->text(), user_name);
  5. if(!sqlQuery.exec(sql))
  6. {
  7. QMessageBox::information(this, "infor", "办理借阅sql执行出错");
  8. return;
  9. }
  10. while(sqlQuery.next())
  11. {
  12. if(sqlQuery.value(0).toString() != "成功")
  13. {
  14. QMessageBox::information(this, "infor", sqlQuery.value(0).toString());
  15. return;
  16. }
  17. }
  18. QMessageBox::information(this, "infor", "办理成功");
  19. sqlQuery.finish();
  20. extern borrow_book *bb;
  21. bb->hide();
  22. delete bb;
  23. bb = nullptr;

归还

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

  1. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  2. QString sql;
  3. sql = QObject::tr(" call select_borrow_by_booknum('%1')").arg
  4. (ui->book_num->text());
  5. if(!sqlQuery.exec(sql))
  6. {
  7. QMessageBox::information(this, "infor", "查询书籍sql执行出错");
  8. return;
  9. }
  10. if(!sqlQuery.size())
  11. {
  12. QMessageBox::information(this, "infor", "没有此书的待还借阅信息");
  13. return;
  14. }
  15. while(sqlQuery.next())
  16. {
  17. ui->borrow_rec_num->setText(sqlQuery.value(0).toString());
  18. ui->reader_name->setText(sqlQuery.value(1).toString());
  19. ui->book_num_display->setText(sqlQuery.value(2).toString());
  20. ui->book_name->setText(sqlQuery.value(3).toString());
  21. ui->borrow_state->setText(sqlQuery.value(6).toString());
  22. }
  23. sqlQuery.finish();
  24. ui->return_button->show();
  25. ui->return_button_bad->show();

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

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

反馈处理

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

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

  1. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  2. QString sql;
  3. sql = QObject::tr(" call select_pending_opinion()");
  4. if(!sqlQuery.exec(sql))
  5. {
  6. QMessageBox::information(this, "infor", "意见信息查询sql执行出错");
  7. return;
  8. }
  9. if(!sqlQuery.size()) //没有待处理反馈
  10. {
  11. QMessageBox::information(this, "infor", "没有待处理反馈");
  12. return;
  13. }
  14. QMessageBox::information(this, "infor", "查询到"+QString::number(sqlQuery.size())+"条待处理反馈");
  15. for(int i = 0; sqlQuery.next();i++)
  16. {
  17. for(int j = 0; j < 4 ;j++)
  18. {
  19. ui->tableWidget->setItem(i,j,new QTableWidgetItem(sqlQuery.value(j).toString()));
  20. }
  21. }
  22. sqlQuery.finish();

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

  1. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  2. QString sql;
  3. sql = QObject::tr(" call select_opinion('%1')").arg(ui->opinion_rec_num->text());
  4. if(!sqlQuery.exec(sql))
  5. {
  6. QMessageBox::information(this, "infor", "意见信息查询sql执行出错");
  7. return;
  8. }
  9. if(!sqlQuery.size())
  10. {
  11. QMessageBox::information(this, "infor", "意见不存在");
  12. return;
  13. }
  14. while(sqlQuery.next())
  15. {
  16. if(sqlQuery.value(1).toString() == "处理完成")
  17. {
  18. QMessageBox::information(this, "infor", "该意见已处理完成,不用处理");
  19. return;
  20. }
  21. ui->user_opinion->setText(sqlQuery.value(0).toString());
  22. }
  23. sqlQuery.finish();
  24. ui->deal->hide();
  25. ui->opinion_rec_num->hide();
  26. ui->confirm->show();

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

  1. if(ui->result->toPlainText().size() > 100)
  2. {
  3. QMessageBox::information(this, "infor", "太长了,不能超过100字");
  4. return;
  5. }
  6. QSqlQuery sqlQuery(QSqlDatabase::database("manager_connection")); // 指定使用manager连接
  7. QString sql;
  8. extern QString user_name;
  9. sql = QObject::tr(" call insert_opinion_result('%1','%2','%3',curdate())").arg
  10. (ui->opinion_rec_num->text(),ui->result->toPlainText(),user_name);
  11. if(!sqlQuery.exec(sql))
  12. {
  13. QMessageBox::information(this, "infor", "提交处理结果sql执行出错");
  14. return;
  15. }
  16. QMessageBox::information(this, "infor", "提交成功");
  17. sqlQuery.finish();
  18. extern give_feedback *gf;
  19. gf->hide();
  20. delete gf;
  21. 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字,提示太长了,缩短后点击提交,提示提交成功

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/695767
推荐阅读
相关标签
  

闽ICP备14008679号