Ruslan Polupan
Ruslan PolupanJan. 25, 2020, 7:50 a.m.

MposWebReport project. Part 01.

Setting tasks.

The project is designed to implement the possibility of obtaining reporting on the operation of facilities (gas stations) for customers who do not have a full-fledged part of the implementation of the Back-office component, to monitor and receive any operational information about the operation of gas stations.

The following solution was chosen for the implementation of the project:

  • creation of a WEB server, which will be located on a network segment with access to the gas station database for building queries and displaying reports based on templates, the server must also be provided with access to end clients to receive reports;
  • creation of a database and organization on its basis of a personal account of the user;
  • creating a utility for setting up and managing a web server and a user's personal account.

The databases used are Firebird of the current version 3.0.4. To develop and administer data selection and modification, we use the [IBExpert] GUI shell (https://ru.wikipedia.org/wiki/IBExpert). The latest free full-featured version can be downloaded from link.

The version is for Windows OS, but works fine on Linux using WINE .

To work with the database in Qt, we will use the [QIBASE] database driver (https://doc.qt.io/qt-5/sql-driver.html#qibase), the driver assembly is described here .

To implement the WEB server, we will use the [QtWebApp] library (https://github.com/msrd0/QtWebApp). Description of the library, training materials on its use are available on the [developer's] website (http://stefanfrings.de/qtwebapp/index-en.html).

Create a project.

Since the project will consist of two applications, we create a new project with subdirectories.

Adding subprojects. Console application MPosWebReport .

Now we add a subproject to manage the server and the user's personal account MPosWebAdmin . A typical Qt Widgets application based on QMainWindow.

The project structure looks like this now.

Create a repository on GitHub and upload an empty project there.

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

Adding the QtWebApp library.

Download QtWebApp , unpack the archive and copy the QtWebApp folder to the project folder. We get the following folder structure:

We add lines to the project file MPosWebServer.pro to support the network and connect the source code of the library.

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

Further, according to the recommendations of the library developer, we create the configuration file ../etc/MPosWebServer.ini and add it to both subprojects.
MPosWebServer.ini

[listener]
;host=192.168.0.100
port=8080
minThreads=4
maxThreads=100
cleanupInterval=60000
readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=10000000
  • host and port - IP and port on which requests will be processed. If you comment out the host parameter, then all network interfaces of the server will be listened on.

  • minThread minimum number of idle worker threads to process HTTP requests.

  • maxThread maximum number of worker threads created when HTTP requests arrive.

  • cleanupInterval in milliseconds specifies how long the free stream will be closed.

  • readTimeout time in milliseconds after which an unused connection to the server is closed.

  • maxRequestSize maximum size of a simple request.

  • maxMultiPartSize is the maximum multipart request value that occurs when a web browser uploads a file to the server.

Let's use the source code of the examples supplied with the library, as well as examples from the documentation to check the performance.

Adding the HelloWorldController class to the MPosWebReport project
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);
}

Change 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();
}

We start the project.

In the browser, follow the link http://localhost:8080

We get:

This part mainly used the contents of the QtWebApp library tutorials.

The topic is new to me and therefore interesting. I will be very grateful for comments and remarks.

Project archive
MposWebServer01.zip MposWebServer01.zip

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

s
  • Jan. 26, 2020, 2:51 p.m.

Чего не webassembly?

Ruslan Polupan
  • Jan. 27, 2020, 1:01 a.m.

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

Comments

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

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
B

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
FL

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
AC
Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCTDec. 27, 2023, 8:57 a.m.
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
ДмитрийJan. 10, 2024, 4:18 a.m.
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii LegotckoiDec. 12, 2023, 6:48 a.m.
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Follow us in social networks