Ruslan Polupan
25 січня 2020 р. 18:50

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

Постановка завдань.

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

Для реалізації проекту було обрано таке рішення:

  • створення 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 MposWebServer01.zip

По статті запитували0питання

3

Вам це подобається? Поділіться в соціальних мережах!

s
  • 27 січня 2020 р. 01:51

Чего не webassembly?

Ruslan Polupan
  • 27 січня 2020 р. 12:01

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up