main.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include <QCommandLineParser>
  4. #include <QTranslator>
  5. #include <QWebSocket>
  6. #include <QWebSocketServer>
  7. #include <cwf/constants.h>
  8. #include <cwf/cppwebapplication.h>
  9. #include <cwf/filter.h>
  10. #include <cwf/sqldatabasestorage.h>
  11. #include "appevent.h"
  12. #include "qglobal.h"
  13. #include "tcontroller.h"
  14. #include "tlogin.h"
  15. #include "tmodel.h"
  16. #include "websocketserver.h"
  17. #include "qtsingleapplication.h"
  18. void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
  19. {
  20. QString txt;
  21. switch (type) {
  22. case QtDebugMsg:
  23. txt = QString("Debug: %1").arg(msg);
  24. break;
  25. case QtInfoMsg:
  26. txt = QString("Info: %1").arg(msg);
  27. break;
  28. case QtWarningMsg:
  29. txt = QString("Warning: %1").arg(msg);
  30. break;
  31. case QtCriticalMsg:
  32. txt = QString("Critical: %1").arg(msg);
  33. break;
  34. case QtFatalMsg:
  35. txt = QString("Fatal: %1").arg(msg);
  36. break;
  37. }
  38. QFile outFile("log.txt");
  39. outFile.open(QIODevice::WriteOnly | QIODevice::Append);
  40. QTextStream ts(&outFile);
  41. ts << QDateTime::currentDateTime().toString(Qt::ISODate) << " " << txt << " (" << context.file
  42. << ":" << context.line << ")" << Qt::endl;
  43. }
  44. CWF::SqlDatabaseStorage storage("QSQLITE", "localhost", "data.db", "", "");
  45. //中间件 做 jwt 校验等处理
  46. class MiddlewareFilter : public CWF::Filter
  47. {
  48. public:
  49. void doFilter(CWF::Request &request, CWF::Response &response, CWF::FilterChain &chain) override
  50. {
  51. const CWF::HttpParser &httpParser = request.getHttpParser();
  52. const QByteArray websocket = httpParser.getHeaderField("Upgrade");
  53. if (websocket.isEmpty()) {
  54. chain.doFilter(request, response);
  55. } else {
  56. }
  57. }
  58. };
  59. int main(int argc, char *argv[])
  60. {
  61. // QApplication a(argc, argv);
  62. SharedTools::QtSingleApplication a("teacher server", argc, argv);
  63. if (a.isRunning()) {
  64. a.sendMessage("", 1000);
  65. return 0;
  66. }
  67. QObject::connect(&a,
  68. &SharedTools::QtSingleApplication::messageReceived,
  69. &a,
  70. &SharedTools::QtSingleApplication::activateWindow);
  71. QCoreApplication::setApplicationName("teacher server");
  72. QCoreApplication::setApplicationVersion("1.0");
  73. QCommandLineParser parser;
  74. parser.addHelpOption();
  75. parser.addVersionOption();
  76. QCommandLineOption debugOption("debug", "Enable debug mode");
  77. parser.addOption(debugOption);
  78. parser.process(a);
  79. if (parser.isSet(debugOption)) {
  80. qInstallMessageHandler(customMessageHandler);
  81. }
  82. AppEvent::instance()->configLoad();
  83. WebSocketServer::getInstance();
  84. QTranslator translator;
  85. const QStringList uiLanguages = QLocale::system().uiLanguages();
  86. for (const QString &locale : uiLanguages) {
  87. const QString baseName = "teacherServer_" + QLocale(locale).name();
  88. if (translator.load(":/i18n/" + baseName)) {
  89. a.installTranslator(&translator);
  90. break;
  91. }
  92. }
  93. UserModel{storage}.updateDB();
  94. ExamsQuestionModel{storage}.updateDB();
  95. ExamsTestModel{storage}.updateDB();
  96. MiddlewareFilter middlewareFilter;
  97. CWF::CppWebApplication server("/server", &middlewareFilter);
  98. server.addController<HelloController>("/hello");
  99. server.addController<ConfigController>("/api/v1/config");
  100. server.addController<LoginController>("/api/v1/user/login");
  101. server.addController<UserInfoController>("/api/v1/user/userInfo");
  102. server.addController<LoginOutController>("/api/v1/user/loginOut");
  103. server.addController<ExamsController>("/api/v1/exams/content");
  104. server.addController<ExamsFilesController>("/api/v1/exams/files");
  105. server.addController<UploadedFilesController>("/api/v1/exams/uploaded");
  106. server.addController<ExamsAnswerTimeController>("/api/v1/exams/answerTime");
  107. server.addController<TableDataController>("/api/v1/tableData");
  108. server.addController<TableDataExamRoomController>("/api/v1/tableDataRoom");
  109. TLogin login;
  110. std::unique_ptr<MainWindow> mainWindow = nullptr;
  111. QObject::connect(&login, &TLogin::loginSuccessful, [&]() {
  112. mainWindow = std::make_unique<MainWindow>();
  113. mainWindow->show();
  114. });
  115. login.exec();
  116. if (!mainWindow) {
  117. return 0;
  118. }
  119. // MainWindow w;
  120. // w.show();
  121. a.setActivationWindow(mainWindow.get());
  122. const QString ip = AppEvent::instance()->configValue("serverIP").toString();
  123. const int port = AppEvent::instance()->configValue("serverPort").toInt();
  124. QSettings settings("./server/config/CPPWeb.ini", QSettings::Format::IniFormat);
  125. settings.beginGroup("config");
  126. settings.setValue("host", ip);
  127. settings.setValue("port", port);
  128. server.start(QHostAddress(ip), port);
  129. // return a.exec();
  130. return a.exec();
  131. }