Ruslan Polupan
25 января 2020 г. 18:50

Проект MposWebReport. Часть 01.

Постановка задачи.

Проект призван реализовать возможность получения отчетности о работе объектов (АЗС) для клиентов которые не имеют полноценной части реализации Бэк-офисной составляющей, мониторить и получать любые оперативные сведения о работе АЗС.

Для реализации проекта было выбрано следующее решение:

  • создание WEB сервера, который будет размещаться с сегменте сети имеющей доступ к базе данных АЗС для построения запросов и отображения отчетов на основании шаблонов, к серверу также должен быть предоставлен доступ конечным клиентам для получения отчетности;
  • создание базы данных и организации на ее основе личного кабинета пользователя;
  • создание утилиты для настройки и управления web сервера и личным кабинетом пользователя.

В качестве баз данных используется Firebird текущей версии 3.0.4. Для разработки и администрирования выбора и изменения данных используем GUI-оболочку IBExpert . Последнюю бесплатную полнофункциональную версию можно скачать по ссылке.

Версия предназначена для ОS Windows, однако прекрасно работает в Linux с использованием WINE .

Для работы с базой в Qt будем использовать драйвер баз данных QIBASE , сборка драйвера описана здесь .

Для реализации WEB сервера воспользуемся библиотекой QtWebApp . Описание библиотеки обучающие материалы по ее использованию размещены на сайте разработчика .

Создание проекта.

Поскольку проект будет состоять из двух приложений то создаем новый проект с поддиректориями.

Добавляем подпроекты. Консольное приложение MPosWebReport .

Теперь добавляем подпроект для управления сервером и личным кабинетом пользователя MPosWebAdmin . Обычное приложение Qt Widgets на основе QMainWindow.

Структура проекта выглядит теперь так.

Создаем репозиторий на GitHub и загружаем туда пустой проект.

  1. git remote add origin git@github.com:rust3128/MposWebServer.git
  2. git commit
  3. git push -u origin master

Добавление библиотеки QtWebApp.

Качаем QtWebApp , распаковываем архив и копируем папку QtWebApp в папку с проектом. Получаем следующую структуру папок:

Добавляем строки в файл проекта MPosWebServer.pro поддержку сети и подключаем исходники библиотеки.

  1. QT += network
  2. include(../QtWebApp/httpserver/httpserver.pri)

Далее согласно рекомендациям разработчика библиотеки создаем конфигурационный файл ../etc/MPosWebServer.ini и добавляем его в оба подпроекта.
MPosWebServer.ini

  1. [listener]
  2. ;host=192.168.0.100
  3. port=8080
  4. minThreads=4
  5. maxThreads=100
  6. cleanupInterval=60000
  7. readTimeout=60000
  8. maxRequestSize=16000
  9. maxMultiPartSize=10000000
  • host и port - IP и порт по которым будут обрабатываться запросы. Если закомментировать параметр host то будут прослушиваться все сетевые интерфейсы сервера.

  • minThread минимальное количество не занятых рабочих потока для обработки HTTP запросов.

  • maxThread максимальное количество рабочих потоков создающихся при поступлении HTTP запросов.

  • cleanupInterval в миллисекундах указывает через сколько будет закрываться свободный поток.

  • readTimeout время в миллисекундах через которое закрывается не используемое соединение с сервером.

  • maxRequestSize максимальный размер простого запроса.

  • maxMultiPartSize максимальное значение многосоставного запроса, которые происходят, когда веб-браузер загружает файл на сервер.

Воспользуемся исходниками примеров поставляемыми с библиотекой а также примеров из документации для проверки работоспособности.

Добавляем в проект MPosWebReport класс HelloWorldController
helloworldcontroller.h:

  1. #ifndef HELLOWORLDCONTROLLER_H
  2. #define HELLOWORLDCONTROLLER_H
  3.  
  4. #include "httprequesthandler.h"
  5.  
  6. using namespace stefanfrings;
  7.  
  8. class HelloWorldController : public HttpRequestHandler
  9. {
  10. Q_OBJECT
  11. public:
  12. HelloWorldController(QObject *parent = nullptr);
  13.  
  14. // HttpRequestHandler interface
  15. public:
  16. void service(HttpRequest &request, HttpResponse &response);
  17. };
  18.  
  19. #endif // HELLOWORLDCONTROLLER_H

helloworldcontroller.cpp:

  1. #include "helloworldcontroller.h"
  2.  
  3. HelloWorldController::HelloWorldController(QObject *parent) :
  4. HttpRequestHandler(parent)
  5. {
  6.  
  7. }
  8. void HelloWorldController::service(HttpRequest &request, HttpResponse &response)
  9. {
  10. response.write("Hello World",true);
  11. }
  12.  

Изменяем main.cpp:

  1. #include <QCoreApplication>
  2. #include <QDir>
  3. #include <QFile>
  4. #include "httplistener.h"
  5. #include "httprequesthandler.h"
  6. #include "helloworldcontroller.h"
  7.  
  8. using namespace stefanfrings;
  9.  
  10. /** Функция поиска конфигурационного файла */
  11. QString searchConfigFile()
  12. {
  13. QString binDir=QCoreApplication::applicationDirPath();
  14. QString appName=QCoreApplication::applicationName();
  15. QString fileName(appName+".ini");
  16.  
  17. QStringList searchList;
  18. searchList.append(binDir);
  19. searchList.append(binDir+"/etc");
  20. searchList.append(binDir+"/../etc");
  21. searchList.append(binDir+"/../../etc"); // for development without shadow build
  22. searchList.append(binDir+"/../"+appName+"/etc"); // for development with shadow build
  23. searchList.append(binDir+"/../../"+appName+"/etc"); // for development with shadow build
  24. searchList.append(binDir+"/../../../"+appName+"/etc"); // for development with shadow build
  25. searchList.append(binDir+"/../../../../"+appName+"/etc"); // for development with shadow build
  26. searchList.append(binDir+"/../../../../../"+appName+"/etc"); // for development with shadow build
  27. searchList.append(QDir::rootPath()+"etc/opt");
  28. searchList.append(QDir::rootPath()+"etc");
  29.  
  30. foreach (QString dir, searchList)
  31. {
  32. QFile file(dir+"/"+fileName);
  33. if (file.exists())
  34. {
  35. // Файл нашли
  36. fileName=QDir(file.fileName()).canonicalPath();
  37. qDebug("Using config file %s",qPrintable(fileName));
  38. return fileName;
  39. }
  40. }
  41.  
  42. // не нашли
  43. foreach (QString dir, searchList)
  44. {
  45. qWarning("%s/%s not found",qPrintable(dir),qPrintable(fileName));
  46. }
  47. qFatal("Cannot find config file %s",qPrintable(fileName));
  48. return nullptr;
  49. }
  50.  
  51.  
  52. int main(int argc, char *argv[])
  53. {
  54. QCoreApplication a(argc, argv);
  55. a.setApplicationName("MPosWebServer");
  56. a.setOrganizationName("RustSoft");
  57.  
  58. // Ищем конфигурационный файл
  59. QString configFileName=searchConfigFile();
  60. // Читаем настройки сервера
  61. QSettings* listenerSettings=new QSettings(configFileName, QSettings::IniFormat, &a);
  62. listenerSettings->beginGroup("listener");
  63.  
  64. // Запуск HTTP сервера
  65. new HttpListener(listenerSettings,new HelloWorldController(&a),&a);
  66.  
  67. return a.exec();
  68. }
  69.  

Запускаем проект.

В браузере переходим по ссылке http://localhost:8080

Получаем:

В этой части в основном использовалось содержимое обучающих материалов библиотеки QtWebApp.

Тема для меня новая и поэтому интересная. Буду очень благодарен за комментарии и замечания.

Архив проекта
MposWebServer01.zip MposWebServer01.zip

По статье задано0вопрос(ов)

3

Вам это нравится? Поделитесь в социальных сетях!

s
  • 27 января 2020 г. 1:51

Чего не webassembly?

Ruslan Polupan
  • 27 января 2020 г. 12:01

Да так, посмотрел библиотеку попробовал примеры...

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь