目的、要求:
1.输入账号和密码来登陆,账号为admin,密码为admin
2.进货:输入新买入的影碟的信息(上面数据中影碟的部分),如果新买入的影碟和原有影碟相同,则直接将新的影碟数量加到原有数量上
3.查询影碟信息并输出符合条件结果:提供三种查询方式(1)根据影碟名字来查询;(2)输入价格区间来查询;(3)根据类型来查询
4.对影碟排序:提供两种排序方式:(1)价格(升序及降序);(2)编号顺序
5.提供显示所有影碟的信息的功能
6.租借:在查询影碟信息之后,可以选择租借,此时记录租借者相关信息(上面数据中租借者的部分)
7.查询租借者信息并输出结果:提供两种查询方式:(1)租借者姓名;(2)出借影碟的名字
8.可以显示所有租借者的信息,分为两部分:(1)未超期的 (2)已经超期的,对每一位超期的租借者能产生一份包含租借者的信息的邮件内容(例如:xxx,您好!您租借的xxx影碟于xxx日期过期,请及时归还,感谢您的合作!)
9.比较是否超期:可以获取系统时间来设定为当前时间,和归还日期作比较,只要能判定是否超期并生成相应邮件内容就ok,什么方式都可以
10.在界面的右下角或者其他地方,显示着当前的时间,时间精准到秒(通过获取系统时间之类的)
数据:
(1)影碟:名称、编号、价格、类型、总数量、剩余数量(编号按照进货顺序自动排为1,2,3,4……)
(2)租借者:租借者姓名、联系电话、租借影碟的名称、租借数量、租借日期(年月日)、租借天数、归还日期(归还日期最好能根据租借日期和天数自动生成)
简介:
使用qt5 sqlite进行上述功能开发,数据的增查,tableview右键菜单实现租借功能,超期功能实现的逻辑是这样的:在程序开启后2秒启动定时器对租借的信息进行处理,如果超时,就修改对应字段数据信息,并发送邮件给对应租借者(生成一条数据存到邮件表)。处理完成后,关闭定时器,然后设置定时器时间间隔为24小时,再次开启定时器。
效果:
代码:
//用来判断是否超时
void MainForm::overTimeTimerSlot()
{
//触发定时器的时候,直接获取当前系统日期,与应还日期进行对比,如果小于应还日期,那就不超时,反之亦然
//如果出租表没有数据,直接返回
//判断数据里是否有数据
int dataCount;
QSqlQuery sqlQuery11;
//判断数据库是否存在数据
QString strInst = QString("select count(*) from hirerTable where currentStatus = '%1'").arg("未超期");
qDebug() << "strInst" << strInst;
if(!sqlQuery11.exec(strInst))
{
qDebug() << sqlQuery11.lastError().text();
QMessageBox::information(this,QStringLiteral("判断是否超时"),sqlQuery11.lastError().text(),QMessageBox::Ok);
return;
}
while(sqlQuery11.next())
{
//如果存在,就直接修改
qDebug() << "sqlQuery11.isActive()" << sqlQuery11.isActive();
if(sqlQuery11.isActive())
{
dataCount = sqlQuery11.value(0).toInt();
qDebug() << "dataCount" << dataCount;
}
}
//如果不存在未超时的数据
if(!dataCount)
{
return;
}
//取出全部未超时的数据
//保存价格信息
QString rentNumber;
QString returnDate;
QString hirerName;
QString rentVdName;
QStringList rentNumberList;
QStringList returnDateList;
QStringList hirerNameList;
QStringList rentVdNameList;
QSqlQuery sqlQuery1111;
sqlQuery1111.exec(QString("select * from hirerTable where currentStatus = '%1'").arg("未超期"));
while(sqlQuery1111.next())
{
rentNumber = sqlQuery1111.value(0).toString();
returnDate = sqlQuery1111.value(8).toString();
hirerName = sqlQuery1111.value(1).toString();
rentVdName = sqlQuery1111.value(5).toString();
rentNumberList.append(rentNumber);
returnDateList.append(returnDateList);
hirerNameList.append(hirerName);
rentVdNameList.append(rentVdName);
}
//获取当前系统日期
QString dateStr = QDateTime::currentDateTime().toString("yyyy-MM-dd");
for(int i = 0;i < returnDateList.count();i++)
{
QString returnDate = returnDateList[i];
QDateTime dateCurrent = QDateTime::fromString(dateStr,"yyyy-MM-dd");
QDateTime dateReturn = QDateTime::fromString(returnDate,"yyyy-MM-dd");
qint64 nSecs = dateReturn.secsTo(dateCurrent);
//如果超时
if(nSecs > 0)
{
//更新对应数据的状态信息
//修改数量
QSqlQuery query;
QString afterSql = "update hirerTable set currentStatus = :currentStatus,residueVdCount = :residueVdCount where rentNumber = :rentNumber";
query.prepare(afterSql);
query.bindValue(":currentStatus","已超期");
query.bindValue(":rentNumber",rentNumberList[i]);
//对执行进行判断
if(!query.exec())
{
qDebug() << query.lastError().text();
QMessageBox::information(this,QStringLiteral("判断是否超时"),query.lastError().text(),QMessageBox::Ok);
return;
}
QString emailContent = hirerNameList[i] + " ,您好!您租借的" + rentVdNameList[i] + "影碟于"
+ returnDateList[i] + " 日期过期,请及时归还,感谢您的合作!";
//编辑邮件内容,存到邮件表
QSqlQuery query4;
QString insertSql = "insert into emailTable values(?,?,?)";
query4.prepare(insertSql);
query4.addBindValue(QDateTime::currentDateTime().toString("yyyyMMddhhmmss"));
query4.addBindValue(rentNumberList[i]);
query4.addBindValue(emailContent);
//对执行进行判断
if(!query4.exec())
{
qDebug() << query4.lastError().text();
QMessageBox::information(this,QStringLiteral("判断是否超时"),query4.lastError().text(),QMessageBox::Ok);
return;
}
}
}
//设置1天触发一次定时器,这个状态更新1天更新一次就行了,所以这个地方,在更新完成后,直接设置更新间隔时间为1天
if(m_overTimeTimer->isActive())
{
m_overTimeTimer->stop();
m_overTimeTimer->setInterval(1000 * 24 * 60 * 60);
m_overTimeTimer->start();
}
}