Постановка завдань.
Проект покликаний реалізувати можливість отримання звітності про роботу об'єктів (АЗС) для клієнтів, які не мають повноцінної частини реалізації Бек-офісної складової, моніторити та отримувати будь-які оперативні відомості про роботу АЗС.
Для реалізації проекту було обрано таке рішення:
- створення WEB сервера, який розміщуватиметься з сегменту мережі, що має доступ до бази даних АЗС для побудови запитів та відображення звітів на підставі шаблонів, до сервера також повинен бути наданий доступ кінцевим клієнтам для отримання звітності;
- Створення бази даних та організації на її основі особистого кабінету користувача;
- створення утиліти для налаштування та керування web-сервера та особистим кабінетом користувача.
Як база даних використовується Firebird поточної версії 3.0.4. Для розробки та адміністрування вибору та зміни даних використовуємо GUI-оболонку IBExpert . Останню безкоштовну повнофункціональну версію можна завантажити за посиланням (http://www.ibexpert.com/ukr/ibe_sfx.exe)
Версія призначена для OS Windows, проте чудово працює в Linux з використанням WINE .
Для роботи з базою в Qt будемо використовувати драйвер баз даних QIBASE , збирання драйвера описано тут .
Для реалізації WEB-сервера скористаємося бібліотекою QtWebApp . Опис бібліотеки навчальні матеріали щодо її використання розміщено на сайті розробника .
Створення проекту.
Оскільки проект складатиметься з двох додатків, то створюємо новий проект з піддиректоріями.
Додаємо підпроекти. Консольний додаток MPosWebReport .
Тепер додаємо підпроект для керування сервером та особистим кабінетом користувача MPosWebAdmin . Звичайна програма Qt Widgets на основі QMainWindow.
Структура проекту тепер виглядає так.
Створюємо репозиторій на GitHub та завантажуємо туди порожній проект.
git remote add origin git@github.com:rust3128/MposWebServer.git git commit git push -u origin master
Додавання бібліотеки QtWebApp.
Качаємо QtWebApp , розпаковуємо архів і копіюємо папку QtWebApp в папку з проектом. Отримуємо наступну структуру папок:
Додаємо рядки у файл проекту MPosWebServer.pro підтримку мережі та підключаємо вихідні джерела бібліотеки.
QT += network include(../QtWebApp/httpserver/httpserver.pri)
Далі згідно з рекомендаціями розробника бібліотеки створюємо конфігураційний файл
../etc/MPosWebServer.ini
і додаємо його в обидва підпроекти.
MPosWebServer.ini
[listener] ;host=192.168.0.100 port=8080 minThreads=4 maxThreads=100 cleanupInterval=60000 readTimeout=60000 maxRequestSize=16000 maxMultiPartSize=10000000
host та port - IP та порт за якими будуть оброблятися запити. Якщо закоментувати параметр host, то будуть прослуховуватися всі мережеві інтерфейси сервера.
minThread мінімальна кількість не зайнятих робочих потоку для обробки HTTP запитів.
maxThread максимальна кількість робочих потоків, що створюються при надходженні HTTP запитів.
cleanupInterval у мілісекундах вказує через скільки буде закриватися вільний потік.
readTimeout час у мілісекундах, через який закривається не використовуване з'єднання з сервером.
maxRequestSize максимальний розмір простого запиту.
maxMultiPartSize максимальне значення багатоскладового запиту, що відбувається, коли веб-браузер завантажує файл на сервер.
Скористаємося вихідниками прикладів, що постачаються з бібліотекою, а також прикладів з документації для перевірки працездатності.
Додаємо до проекту MPosWebReport клас HelloWorldController
helloworldcontroller.h:
#ifndef HELLOWORLDCONTROLLER_H #define HELLOWORLDCONTROLLER_H #include "httprequesthandler.h" using namespace stefanfrings; class HelloWorldController : public HttpRequestHandler { Q_OBJECT public: HelloWorldController(QObject *parent = nullptr); // HttpRequestHandler interface public: void service(HttpRequest &request, HttpResponse &response); }; #endif // HELLOWORLDCONTROLLER_H
helloworldcontroller.cpp:
#include "helloworldcontroller.h" HelloWorldController::HelloWorldController(QObject *parent) : HttpRequestHandler(parent) { } void HelloWorldController::service(HttpRequest &request, HttpResponse &response) { response.write("Hello World",true); }
Змінюємо main.cpp:
#include <QCoreApplication> #include <QDir> #include <QFile> #include "httplistener.h" #include "httprequesthandler.h" #include "helloworldcontroller.h" using namespace stefanfrings; /** Функция поиска конфигурационного файла */ QString searchConfigFile() { QString binDir=QCoreApplication::applicationDirPath(); QString appName=QCoreApplication::applicationName(); QString fileName(appName+".ini"); QStringList searchList; searchList.append(binDir); searchList.append(binDir+"/etc"); searchList.append(binDir+"/../etc"); searchList.append(binDir+"/../../etc"); // for development without shadow build searchList.append(binDir+"/../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../../../"+appName+"/etc"); // for development with shadow build searchList.append(QDir::rootPath()+"etc/opt"); searchList.append(QDir::rootPath()+"etc"); foreach (QString dir, searchList) { QFile file(dir+"/"+fileName); if (file.exists()) { // Файл нашли fileName=QDir(file.fileName()).canonicalPath(); qDebug("Using config file %s",qPrintable(fileName)); return fileName; } } // не нашли foreach (QString dir, searchList) { qWarning("%s/%s not found",qPrintable(dir),qPrintable(fileName)); } qFatal("Cannot find config file %s",qPrintable(fileName)); return nullptr; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); a.setApplicationName("MPosWebServer"); a.setOrganizationName("RustSoft"); // Ищем конфигурационный файл QString configFileName=searchConfigFile(); // Читаем настройки сервера QSettings* listenerSettings=new QSettings(configFileName, QSettings::IniFormat, &a); listenerSettings->beginGroup("listener"); // Запуск HTTP сервера new HttpListener(listenerSettings,new HelloWorldController(&a),&a); return a.exec(); }
Запускаємо проект.
У браузері переходимо за посиланням http://localhost:8080
Отримуємо:
У цій частині переважно використовувався вміст навчальних матеріалів бібліотеки QtWebApp.
Тема для мене нова і тому цікава. Буду дуже вдячний за коментарі та зауваження.
Архів проекту
MposWebServer01.zip
Чего не webassembly?
Да так, посмотрел библиотеку попробовал примеры...