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.youkuaiyun.com/wtzhu_13/article/details/106530895
[QT手把手打造预约系统——管理员]:https://blog.youkuaiyun.com/wtzhu_13/article/details/106530981
[QT手把手打造预约系统——学生用户]:https://blog.youkuaiyun.com/wtzhu_13/article/details/106531057
[QT手把手打造预约系统——教师用户]:https://blog.youkuaiyun.com/wtzhu_13/article/details/106531134

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

GitHub有时太慢,同步一下国内链接:https://gitee.com/wtzhu13/CPPOrCProectDemo.git

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值