QT手把手打造預約系統——學生用戶

QT手把手打造預約系統——學生用戶

效果展示

功能演示

學生用戶界面介紹

在這裏插入圖片描述

  • 左上角顯示機房的餘量信息,默認週一,可以通過預約日期的通過自動調整。
  • 右側爲預約提交區域,選擇好相應的預約信息,點擊申請即可完成預約。
  • 下方顯示預約信息,點擊查看自己預約顯示自己的預約信息,查看所有就會顯示所有人的預約信息。
  • 在自己的預約信息中選擇一項後點擊取消則出現如下圖所示提示,點擊確認後即完成取消。
    在這裏插入圖片描述

頁面UI設計

在這裏插入圖片描述

  • 將需要的控件拖到指定的位置調整好大小即可。
  • 機房信息的表頭可以雙擊TableWidget進行設置。

功能邏輯實現

  1. 申請預約

    /************************************************
    * 函數名: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查詢數據庫檢查相同時間段是否有預約。
    • 如果沒有預約則可以將預約信息放進預約表,並將相應機房的相應時間的餘量更新,最後將操作記錄到日誌。
  2. 查看預約

    /************************************************
    * 函數名: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添加過濾條件。
  3. 取消預約

    /************************************************
    * 函數名: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

項目完整源代碼:https://github.com/wtzhu13/CPPOrCProectDemo/tree/master/OrderSysV2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章