QT手把手打造預約系統——學生用戶
效果展示
學生用戶界面介紹
- 左上角顯示機房的餘量信息,默認週一,可以通過預約日期的通過自動調整。
- 右側爲預約提交區域,選擇好相應的預約信息,點擊申請即可完成預約。
- 下方顯示預約信息,點擊查看自己預約顯示自己的預約信息,查看所有就會顯示所有人的預約信息。
- 在自己的預約信息中選擇一項後點擊取消則出現如下圖所示提示,點擊確認後即完成取消。
頁面UI設計
- 將需要的控件拖到指定的位置調整好大小即可。
- 機房信息的表頭可以雙擊TableWidget進行設置。
功能邏輯實現
-
申請預約
/************************************************ * 函數名:Student::on_pushButton_applyOrder_clicked() * 參數:無 * 返回值:無 * 描述:申請預約 ************************************************/ void Student::on_pushButton_applyOrder_clicked() { // 獲取系統時間,存日誌的時候需要 QDateTime current_date_time =QDateTime::currentDateTime(); QString current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd"); // 拼接日誌信息 QString orderInfoStr = current_date + "," + userID + "," + userName + "," + orderDate + "," + orderTime + "," + orderRoom + "," + QString("待審覈") + "\n"; qDebug() << orderInfoStr; QSqlQuery query; // 檢查該時間段是否已經有預約 QString queryStr = QString("select order_id from order_info where " "user_id = '%1' and order_date = %2 and order_time = %3") .arg(userID).arg(orderDateIndex+1).arg(orderTimeIndex+1); qDebug() << queryStr; query.exec(queryStr); query.next(); if(query.value(0).toString() != ""){ // 不爲空則說明在預約數據庫中有數據,那麼同一時間段就無法再次預約 QMessageBox::information(NULL, "Title", "對不起,您無法預約該時間段!"); } else { // 爲空則可以預約,將預約信息添加到數據庫 bool exec_flag = query.exec(QString("insert into order_info " "(user_id,order_date, order_time, order_room, state_id) " "values(%1, %2, %3, %4, %5)") .arg(userID).arg(orderDateIndex+1).arg(orderTimeIndex+1).arg(orderRoomIndex+1).arg(1)); if(exec_flag){ qDebug() << "添加成功"; // 預約成功則需要把機房餘量減掉一個 margin[orderDateIndex][orderTimeIndex][orderRoomIndex]--; // 跟新數據庫 updateRoomInfo(); // 提示信息 QMessageBox::information(NULL, "Title", "預約成功!"); // 把操作存放到日誌文件中 GlobalFunc::saveLog(LOGFILEPATH, orderInfoStr); // 顯示一下自己的預約情況 on_pushButton_checkSelfOrder_clicked(); } else { qDebug() << "添加失敗"; QMessageBox::information(NULL, "Title", "數據庫錯誤!"); } } }
- 獲取系統時間並拼接成日誌格式。
- 通過
QSqlQuery
查詢數據庫檢查相同時間段是否有預約。 - 如果沒有預約則可以將預約信息放進預約表,並將相應機房的相應時間的餘量更新,最後將操作記錄到日誌。
-
查看預約
/************************************************ * 函數名:Student::on_pushButton_checkSelfOrder_clicked() * 參數:無 * 返回值:無 * 描述:查看自己的預約 ************************************************/ void Student::on_pushButton_checkSelfOrder_clicked() { showOrderInfo(1); } /************************************************ * 函數名:Student::on_pushButton_checkAllOrder_clicked() * 參數:無 * 返回值:無 * 描述:查看所有人的預約 ************************************************/ void Student::on_pushButton_checkAllOrder_clicked() { showOrderInfo(0); } /************************************************ * 函數名:Student::showOrderInfo(int lookFlag) * 參數:無 * 返回值:無 * 描述:顯示預約信息 ************************************************/ void Student::showOrderInfo(int lookFlag) { QSqlRelationalTableModel *orderModel; orderModel = new QSqlRelationalTableModel(this); orderModel->setEditStrategy(QSqlTableModel::OnFieldChange); // 屬性變化時寫入數據庫 // 設置操作的表 orderModel->setTable("order_info"); // 設置顯示外鍵對應的內容 orderModel->setRelation(2, QSqlRelation("date_info", "date_id", "date_str")); orderModel->setRelation(3, QSqlRelation("time_info", "time_id", "time_str")); orderModel->setRelation(4, QSqlRelation("room_info", "room_id", "room_name")); orderModel->setRelation(5, QSqlRelation("state_info", "state_id", "state_str")); // 設置表字段的顯示 orderModel->setHeaderData(0, Qt::Horizontal, QObject::tr("預約ID")); orderModel->setHeaderData(1, Qt::Horizontal, QObject::tr("用戶ID")); orderModel->setHeaderData(2, Qt::Horizontal, QObject::tr("日期(工作日)")); orderModel->setHeaderData(3, Qt::Horizontal, QObject::tr("時間")); orderModel->setHeaderData(4, Qt::Horizontal, QObject::tr("機房")); orderModel->setHeaderData(5, Qt::Horizontal, QObject::tr("狀態")); if(lookFlag != 0){ // 添加篩選的內容relTblAl_5表示第五個關聯 orderModel->setFilter(QObject::tr("user_id = %1").arg(userID)); } orderModel->select(); ui->tableView->setModel(orderModel); }
- 查看所有預約和查看自己的預約在邏輯上一致,只是查看自己的預約時多一條限定條件,所以將兩個功能整合,通過標誌位區分。
- 通過
QSqlRelationalTableModel
來顯示外鍵關聯,這樣更方面數據庫的可視化。 orderModel->setTable
設置需要操作的數據庫。orderModel->setRelation
設置外鍵的顯示。orderModel->setHeaderData
設置表頭。orderModel->setFilter
添加過濾條件。
-
取消預約
/************************************************ * 函數名:Student::on_pushButton_cancleOrder_clicked() * 參數:無 * 返回值:無 * 描述:取消預約 ************************************************/ void Student::on_pushButton_cancleOrder_clicked() { // 獲取選中行的數據 int curRow = ui->tableView->currentIndex().row(); QAbstractItemModel *model = ui->tableView->model (); QModelIndex index = model->index(curRow,1); QString user_id = model->data(index).toString(); index = model->index(curRow,2); QString order_date = model->data(index).toString(); index = model->index(curRow,3); QString order_time = model->data(index).toString(); index = model->index(curRow,4); QString order_room = model->data(index).toString(); qDebug() << user_id << order_date << order_time << order_room; // 如果ID不是當前用戶的則表明實在查看所有預約時選擇取消,且選中的是別人的數據 if(user_id != userID){ QMessageBox::information(NULL, "Title", "只能取消自己的預約信息!"); return; } // 將獲取行的內容裝換爲id便於後續操作 int date_id = getID(QString("select date_id from date_info where date_str = '%1'").arg(order_date)); int time_id = getID(QString("select time_id from time_info where time_str = '%1'").arg(order_time)); int room_id = getID(QString("select room_id from room_info where room_name = '%1'").arg(order_room)); qDebug() << date_id << time_id << room_id; int ok = QMessageBox::warning(this,tr("確認取消該預約?"), tr("確認取消該預約? "),QMessageBox::Yes, QMessageBox::No); if(ok == QMessageBox::No) { // 如果不刪除, 則撤銷 return; } else { // 否則提交, 在數據庫中刪除該行 QSqlQuery query; QString queryStr = QString("delete from order_info where user_id = '%1' " "and order_date = %2 " "and order_time = %3 " "and order_room = %4") .arg(userID).arg(date_id).arg(time_id).arg(room_id); qDebug() << queryStr; query.exec(queryStr); // 機房對應的餘量增加 margin[date_id-1][time_id-1][room_id-1]++; // 將機房餘量數據寫入數據庫 updateRoomInfo(); // 更新一下顯示 on_pushButton_checkSelfOrder_clicked(); // 取消的記錄記錄到本地日誌 QDateTime current_date_time =QDateTime::currentDateTime(); QString current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd"); QString logInfoStr = current_date + "," + userID + "," + userName + "," + order_date + "," + order_time + "," + order_room + "," + QString("取消") + "\n"; qDebug() << logInfoStr; GlobalFunc::saveLog(LOGFILEPATH, logInfoStr); } }
- 獲取選中行的內容。
- 表中讀到的內容是外鍵關聯後顯示的內容,所以通過
getID
來獲取預約信息表中真正存放的值。 - 彈框提示是否確認刪除。
- 確認刪除則需要更新預約表,機房餘量表,並將記錄存放到日誌。
系統其它功能連接:
[QT手把手打造預約系統——登錄界面]:https://blog.csdn.net/wtzhu_13/article/details/106530895
[QT手把手打造預約系統——管理員]:https://blog.csdn.net/wtzhu_13/article/details/106530981
[QT手把手打造預約系統——學生用戶]:https://blog.csdn.net/wtzhu_13/article/details/106531057
[QT手把手打造預約系統——教師用戶]:https://blog.csdn.net/wtzhu_13/article/details/106531134