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
AD

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
Last comments
i
innorwallNov. 14, 2024, 5:09 p.m.
Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwallNov. 14, 2024, 12:05 p.m.
EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
i
innorwallNov. 14, 2024, noon
PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
i
innorwallNov. 14, 2024, 10:54 a.m.
Django - Tutorial 003. Model, Template, View on Django Hair follicles are believed to produce approximately 20 individual hair shafts over the life of the follicle as the follicle progresses through cycles of hair production, shedding ejection, invo…
i
innorwallNov. 14, 2024, 7:03 a.m.
How to make game using Qt - Lesson 3. Interaction with other objects what is priligy tablets What happens during the LASIK surgery process
Now discuss on the forum
i
innorwallNov. 14, 2024, 11:39 a.m.
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwallNov. 11, 2024, 6:55 p.m.
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9AnonimOct. 25, 2024, 4:10 p.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Follow us in social networks