目的、要求:
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();
}
}