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
OI

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

  • Result:40points,
  • Rating points-8
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
Last comments
ИМ
Игорь МаксимовNov. 22, 2024, 10:51 p.m.
Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEOct. 19, 2024, 6:19 p.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 9:02 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Now discuss on the forum
WD
Weave DecorDec. 28, 2024, 2:18 p.m.
Weave & Decor Weave Decor Where passion for textiles meets innovative design. We specialize in manufacturing a diverse range of high-quality bed sheets, from classic to contemporary, using premium fa…
n
nklyDec. 27, 2024, 10:41 p.m.
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. У меня есть Представление QTreeView и древовидная модель QStandardItemModel подключенная к представлению. Итемы в модели QStandardItem. В разных ветках дерева могут быть элементы с одинаковым им…
Evgenii Legotckoi
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Nov. 15, 2024, 5:04 p.m.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectJune 4, 2022, 1:49 p.m.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Follow us in social networks