examtestpage.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. }
  79. void ExamTestPage::beginExam()
  80. {
  81. // 题目获取]
  82. QString examsQuestion;
  83. {
  84. ExamsQuestionModel exams(storage);
  85. CWF::SqlQueryManager queryManager(storage);
  86. queryManager.select("*", exams.getTableName()).where("isSelect = ?");
  87. queryManager.prepare();
  88. queryManager.addBindValue(1);
  89. queryManager.exec();
  90. QJsonArray jsonArray = queryManager.toJson();
  91. if (!jsonArray.isEmpty()) {
  92. QString dir;
  93. QString name;
  94. for (const QJsonValue &json : jsonArray) {
  95. if (json.isObject()) {
  96. QJsonObject obj = json.toObject();
  97. dir = obj["fileDir"].toString();
  98. name = obj["name"].toString();
  99. examsQuestion = QString("%1(%2)").arg(name).arg(dir);
  100. break;
  101. }
  102. }
  103. }
  104. }
  105. if (examsQuestion.isEmpty()) {
  106. QMessageBox msgBox;
  107. msgBox.setText(tr("info"));
  108. msgBox.setInformativeText(tr("Please set exam questions first"));
  109. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  110. msgBox.setDefaultButton(QMessageBox::Ok);
  111. msgBox.setButtonText(QMessageBox::Ok, tr("OK"));
  112. msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
  113. msgBox.exec();
  114. return;
  115. }
  116. QMessageBox msgBox;
  117. msgBox.setInformativeText(QString(tr("The current exam question is:%1")).arg(examsQuestion));
  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. int ret = msgBox.exec();
  123. if (ret == QMessageBox::Ok) {
  124. const QString &examRoom = examRoomLineEdit->text();
  125. const QString &examNumber = examNumberLineEdit->text();
  126. AppEvent::instance()->setExam(examRoom, examNumber);
  127. qint64 time = QDateTime::currentSecsSinceEpoch();
  128. QList<QWebSocket *> clients = WebSocketServer::getInstance()->clients();
  129. for (auto client : clients) {
  130. QJsonObject param;
  131. param.insert("method", "notice"); // 获取方式
  132. param.insert("notice", "startExam"); //
  133. param.insert("time", time); //
  134. QJsonObject object;
  135. object.insert("status", true);
  136. object.insert("message", true);
  137. object.insert("code", 200);
  138. object.insert("data", param);
  139. QJsonDocument jsonDoc(object);
  140. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  141. client->sendTextMessage(jsonString);
  142. }
  143. }
  144. }
  145. void ExamTestPage::unLockScreen()
  146. {
  147. QList<QWebSocket *> clients = WebSocketServer::getInstance()->clients();
  148. for (auto client : clients) {
  149. QJsonObject param;
  150. param.insert("method", "notice"); // 获取方式
  151. param.insert("notice", "unLockScreen"); //
  152. QJsonObject object;
  153. object.insert("status", true);
  154. object.insert("message", true);
  155. object.insert("code", 200);
  156. object.insert("data", param);
  157. QJsonDocument jsonDoc(object);
  158. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  159. client->sendTextMessage(jsonString);
  160. }
  161. }