examtestpage.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "examtestpage.h"
  2. #include "qdatetime.h"
  3. #include "qlineedit.h"
  4. #include "websocketserver.h"
  5. #include "appevent.h"
  6. #include "tmodel.h"
  7. #include "widgets/examsmodel.h"
  8. #include "widgets/pagination.h"
  9. #include <QCheckBox>
  10. #include <QComboBox>
  11. #include <QDialog>
  12. #include <QHeaderView>
  13. #include <QLabel>
  14. #include <QLineEdit>
  15. #include <QMessageBox>
  16. #include <QStatusBar>
  17. #include <QTableView>
  18. #include <QJsonArray>
  19. #include <layoutbuilder.h>
  20. #include "cwf/sqlquery.h"
  21. #include <cwf/constants.h>
  22. #include <cwf/cppwebapplication.h>
  23. #include <cwf/filter.h>
  24. #include <cwf/sqldatabasestorage.h>
  25. static CWF::SqlDatabaseStorage storage("QSQLITE", "localhost", "data.db", "", "");
  26. ExamTestPage::ExamTestPage(QWidget *parent)
  27. : QWidget{parent}
  28. {
  29. using namespace Layouting;
  30. examRoomLineEdit = new QLineEdit;
  31. examNumberLineEdit = new QLineEdit;
  32. Column{Form{
  33. tr("exam room"),
  34. examRoomLineEdit,
  35. tr("exam number"),
  36. examNumberLineEdit,
  37. },
  38. br,
  39. Grid{
  40. PushButton{text(tr("send exam text")), onClicked([this]() { sendExamText(); })},
  41. PushButton{text(tr("Begin the exam")), onClicked([this]() { beginExam(); })},
  42. PushButton{text(tr("un Lock Screen")), onClicked([this]() { unLockScreen(); })},
  43. }}
  44. .attachTo(this);
  45. connect(examRoomLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  46. const QString &test = examRoomLineEdit->text();
  47. AppEvent::instance()->setConfigValue("examRoom", test);
  48. });
  49. connect(examNumberLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  50. const QString &test = examNumberLineEdit->text();
  51. AppEvent::instance()->setConfigValue("examNumber", test);
  52. });
  53. const QVariant examRoomValue = AppEvent::instance()->configValue("examRoom");
  54. const QVariant examNumberValue = AppEvent::instance()->configValue("examNumber");
  55. examRoomLineEdit->setText(examRoomValue.toString());
  56. examNumberLineEdit->setText(examNumberValue.toString());
  57. AppEvent::instance()->setExam(examRoomValue.toString(), examNumberValue.toString());
  58. }
  59. void ExamTestPage::updateExamView()
  60. {
  61. }
  62. void ExamTestPage::sendExamText()
  63. {
  64. QList<QWebSocket *> clients = WebSocketServer::getInstance()->clients();
  65. for (auto client : clients) {
  66. QJsonObject param;
  67. param.insert("method", "request"); // 获取方式
  68. param.insert("request", "examContent"); // 请求数据
  69. QJsonObject object;
  70. object.insert("status", true);
  71. object.insert("message", true);
  72. object.insert("code", 200);
  73. object.insert("data", param);
  74. QJsonDocument jsonDoc(object);
  75. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  76. client->sendTextMessage(jsonString);
  77. }
  78. QMessageBox msgBox;
  79. msgBox.setText(tr("info"));
  80. msgBox.setInformativeText("考试信息已推送到学生端");
  81. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  82. msgBox.setDefaultButton(QMessageBox::Ok);
  83. msgBox.setButtonText(QMessageBox::Ok, tr("OK"));
  84. msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
  85. msgBox.exec();
  86. return;
  87. }
  88. void ExamTestPage::beginExam()
  89. {
  90. // 题目获取]
  91. QString examsQuestion;
  92. {
  93. ExamsQuestionModel exams(storage);
  94. CWF::SqlQueryManager queryManager(storage);
  95. queryManager.select("*", exams.getTableName()).where("isSelect = ?");
  96. queryManager.prepare();
  97. queryManager.addBindValue(1);
  98. queryManager.exec();
  99. QJsonArray jsonArray = queryManager.toJson();
  100. if (!jsonArray.isEmpty()) {
  101. QString dir;
  102. QString name;
  103. for (const QJsonValue &json : jsonArray) {
  104. if (json.isObject()) {
  105. QJsonObject obj = json.toObject();
  106. dir = obj["fileDir"].toString();
  107. name = obj["name"].toString();
  108. examsQuestion = QString("%1(%2)").arg(name).arg(dir);
  109. break;
  110. }
  111. }
  112. }
  113. }
  114. if (examsQuestion.isEmpty()) {
  115. QMessageBox msgBox;
  116. msgBox.setText(tr("info"));
  117. msgBox.setInformativeText(tr("Please set exam questions first"));
  118. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  119. msgBox.setDefaultButton(QMessageBox::Ok);
  120. msgBox.setButtonText(QMessageBox::Ok, tr("OK"));
  121. msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
  122. msgBox.exec();
  123. return;
  124. }
  125. QMessageBox msgBox;
  126. msgBox.setInformativeText(QString(tr("The current exam question is:%1")).arg(examsQuestion));
  127. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  128. msgBox.setDefaultButton(QMessageBox::Ok);
  129. msgBox.setButtonText(QMessageBox::Ok, tr("OK"));
  130. msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
  131. int ret = msgBox.exec();
  132. if (ret == QMessageBox::Ok) {
  133. const QString &examRoom = examRoomLineEdit->text();
  134. const QString &examNumber = examNumberLineEdit->text();
  135. AppEvent::instance()->setExam(examRoom, examNumber);
  136. qint64 time = QDateTime::currentSecsSinceEpoch();
  137. QList<QWebSocket *> clients = WebSocketServer::getInstance()->clients();
  138. for (auto client : clients) {
  139. QJsonObject param;
  140. param.insert("method", "notice"); // 获取方式
  141. param.insert("notice", "startExam"); //
  142. param.insert("time", time); //
  143. QJsonObject object;
  144. object.insert("status", true);
  145. object.insert("message", true);
  146. object.insert("code", 200);
  147. object.insert("data", param);
  148. QJsonDocument jsonDoc(object);
  149. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  150. client->sendTextMessage(jsonString);
  151. }
  152. }
  153. emit AppEvent::instance()->beginExam();
  154. }
  155. void ExamTestPage::unLockScreen()
  156. {
  157. QList<QWebSocket *> clients = WebSocketServer::getInstance()->clients();
  158. for (auto client : clients) {
  159. QJsonObject param;
  160. param.insert("method", "notice"); // 获取方式
  161. param.insert("notice", "unLockScreen"); //
  162. QJsonObject object;
  163. object.insert("status", true);
  164. object.insert("message", true);
  165. object.insert("code", 200);
  166. object.insert("data", param);
  167. QJsonDocument jsonDoc(object);
  168. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  169. client->sendTextMessage(jsonString);
  170. }
  171. }