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.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