⽤QT+MySQL编写图书管理系统(三)——借书还书(涉及⽤QT显⽰多表查询
结果⽇期计算)
图书管理系统(三)——借书还书
本项⽬以及配套数据库已经上传到CSDN,⼤家可根据需要下载:
1. 项⽬
2. 数据库
需求分析
1. 若⽤户有超期未归还书籍的⾏为则不准再借书
2. ⽤户要借的这本书需在馆
3. 假定⼀条数据是⼀本书(也可以加⼀个字段⽤于描述书本的数量,这⾥我简略操作了)
4. ⽤户还的书,必须是TA已经借出去的书
5. 如果还书时发现有超期⾏为,则需要提⽰⽤户超期了多少天
上⾯说了那么多,说⽩了就是要符合实际情况,满⾜数据库的基本性质。⼤家也可以⾃⾏增加更多需求。
mysql语句多表查询分析完上⾯的需求后,我们发现,在⽤户端需要有⼀个表格⽤户显⽰“我借的书”,其中的字段包括了书籍的基本信息、借书时间、应归时间、是否归还,⽤户id这些字段。⽽在我们的数据库设计中,并没有⼀个表格完全包含了这些字段,我们要怎么显⽰呢?
使⽤视图可以帮助我们解决这个问题。
视图
1. 在navicat中右击视图,点击新建。
2. 看到这个“视图创建⼯具”,打开以后,就可以勾选我们所需要的字段了,注意这⾥不能勾选表的主键。同时要特别注意你的勾选顺
序,⽣成的视图中的字段顺序就是勾选顺序。如果发现顺序有误,还可以通过下⾯框进⾏拖动调整。我将这个视图命名为mybooks。
借书
1. 在程序启动时⾸先检查数据库⾥的借书记录,是否随着时间的推移出现了超期未归还的⾏为。
void checkwarning1(){
perl语言中的aref
//在程序启动时检查,随着时间的推移,⽤户是否有超期记录,如果有,则将warning字段设置为yes
QSqlQuery query;
QString sql=QString("select user_id from userbooks where is_return='否' and return_date-now()<0");//未归还且超期了
<(sql);
if(query.size()!=0){//存在超期的⽤户
()){
QString sql1=QString("update users set warning='yes' where id=%0").arg(query.value(0).toInt());//将这些⽤户的warning改为yes
<(sql1);
}
}
}
我们就只需要把对应的数据进⾏修改,其他的东西都是⼀环扣⼀环。把上⾯这个checkwarning1()放到main函数⾥⾯,就可以实现在程序启动时检查⽤户超期⾏为这个功能了。
2. 借书成功的话,userbooks中需要增加⼀条信息,books中对应的书籍需要更改状态。
参考界⾯:
⽤户登录进去将看到以下界⾯,查询部分和管理员端是差不多的,可以直接套⽤。⾄于其他按钮的实
现⽅法,都很简单,看了前两章后就可以掌握。
这个界⾯需要新建ui⽂件,我命名为“userinterface”
点击“我的”按钮,进⼊个⼈空间,下⾯表中显⽰的就是“我借的书”。
这个界⾯需要新建ui⽂件,我命名为“myinformation”
void myinformation::on_borrowButton_clicked()//对应借书按钮
{
ui->label_9->clear();
QString id=ui->lineEdit->text();
int int_Int();
QSqlQuery query;
QString status;
if(isid(int_id)){//判断⽤户输⼊的确实是个数据库中存在的id
QString sql0=QString("select * from books where id=%0").arg(int_id);
<(sql0);
())
{
status=query.value(7).toString();
}//到该书的状态
if(status=="未借出"){
QString sql=QString("select warning from users where number='%1'").arg(login::number);
/
/和上⾯的checkwarning1扣起来了,这⾥就在检查warning的情况
<(sql);
())
{
if(query.value(0).toString()!="yes"){
QString sql1=QString("insert into userbooks(user_id,book_id,borrow_date,return_date,is_return) values(%1,%2,now(),date_add(now(),interval  1 month),'否')").arg(login::id).arg(int_id);
//往userbooks中插⼊⼀条记录,注意⽇期的⽤户,这⾥设置归还书籍的时间间隔为⼀个⽉
QString sql2=QString("update books set status='已借出' where id=%0").arg(int_id);
//修改书籍的状态
(sql1)&&(sql2)){//执⾏上⾯这些sql语句
model->submitAll();
javaswitch语句格式
model->setTable("mybooks");//显⽰我们更改新建的视图
setTitle();
model->select();
model->removeColumn(10);
QMessageBox::information(NULL,"借书成功","借书成功!");
}
else{
QMessageBox::warning(NULL,"数据库出错","数据库出错!");
}
}
else{
QMessageBox::warning(NULL,"借书失败","您有超期的图书还未归还,不能借书!");
}
}
}
else{
QMessageBox::warning(NULL,"借书失败","该图书已被借出!");
}
}
bmob后端云是服务器端吗else{
QMessageBox::warning(NULL,"借书失败","填写的id不符合规定!");
}
}
//检查输⼊id确实是存在于数据库⾥⾯
bool myinformation::isid(int id)
{
bool res=false;
bool res=false;
QString sql=QString("select id from books");
QSqlQuery query;
<(sql);
())
{
if(id==query.value(0).toInt()){
res=true;
break;
}
}
return res;
}
还书
1. 还书后,userbooks中的记录并不会被删除,只需将其中is_return字段修改为‘是’。书籍的状态需要修改。⽤户的warning状态可
能会被修改。
void myinformation::on_returnButton_clicked()
{
QString id=ui->lineEdit_2->text();
int int_Int();//书的id
QSqlQuery query;
QString sql=QString("update userbooks set is_return='是' where book_id=%2").arg(int_id);
QString sql2=QString("update books set status='未借出' where id=%0").arg(int_id);
if(isid2(int_id)){//检查输⼊的合理性
QDateTime current_date_time =QDateTime::currentDateTime();
int timeT = current_Time_t();
int ndaysec =24*60*60;
QString sql3=QString("select * from userbooks where book_id=%2 and return_date-now()<0 and is_return='否'").arg(int_id);
//出即将操作的那⼀条记录
<(sql3);
())
{
if(query.size()==1){
QDateTime return_date=query.value(4).toDateTime();//获取应归还⽇期,算出超期天数
int timeT2=Time_t();
int day=(timeT-timeT2)/(ndaysec)+((timeT-timeT2)%(ndaysec)+(ndaysec-1))/(ndaysec)-1;
QString str_day=QString::number(day);
ui->label_9->setText("本书归还时间已超期"+str_day+"天!");
编程课涉及到什么领域break;
}
}
(sql)&&(sql2)){
checkwarning2();//在还书后进⾏的check
model->submitAll();
指针变量是指
model->setTable("mybooks");
setTitle();
model->select();
model->removeColumn(10);
QMessageBox::information(NULL,"还书成功","还书成功!");
}
else
QMessageBox::warning(NULL,"数据库出错","数据库出错!");
}
else{
QMessageBox::warning(NULL,"还书失败","所填写的id不符合规定!");
}
}
void myinformation::checkwarning2(){
//在⽤户还书完成后检查,看此时,⽤户的warning是否将改动为no
QSqlQuery query;
QString sql=QString("select * from userbooks where user_id=%1 and is_return='否' and return_date-now()<0").arg(login::id);
QString sql=QString("select * from userbooks where user_id=%1 and is_return='否' and return_date-now()<0").arg(login::id);
<(sql);
if(query.size()==0){
QString sql1=QString("update users set warning ='no' where id=%0").arg(login::id);
<(sql1);
}
}
//判断⽤户输⼊的id确实是TA借出的书,并且还没有归还
bool myinformation::isid2(int id)
{
bool res=false;
QString sql=QString("select book_id from userbooks where user_id=%1 and is_return='否'").arg(login::id);
QSqlQuery query;
<(sql);
()){
if(id==query.value(0).toInt()){
res=true;
break;
}
}
return res;
}
⾄此,我们就实现了⽤户借书还书的过程。整个系统已经可以跑通。
当然,系统依然存在很多其他的需求:
1. ⽤户要查看、修改⾃⼰的个⼈信息或密码
2. 注册时对证号和密码有格式要求
3. 在注册添加学院字段时,使⽤下拉框的样式
4. 在管理员添加书籍的“借还状态”等字段时,需要使⽤下拉框的样式;添加⽤户的“性别”等字段时,也需要使⽤下拉框的样式
5. 表格的形式看着不舒服,特别是当书籍摘要部分很多时看着更不⽅便,我想要双击这⼀⾏就能看到该⾏数据的详情
6. 我还想直接在表格中添加按钮来操作这⼀⾏
7. 在⽤户界⾯加⼀个按钮筛选出⽤户没有还的书
8. 在⽤户界⾯⾼亮或⽤红⾊颜⾊标出TA没有还的书
还有很多的需求都可以被提出并且实现,今后的章节我将挑选其中⼏点进⾏更新。当然,能看到这⾥的你,相信已经具备了完成以上功能的能⼒。有任何问题欢迎评论~ 如果觉得这篇⽂章有帮到你的话,不妨点个赞哦~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。