赞
踩
如果对你有帮助,可以给卑微的博主留个赞、关注、收藏 (不是)
用户软件的实现根据自己所用语言选择对应开发工具,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字,提示太长了,缩短后点击提交,提示提交成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。