Ruslan Polupan
Ruslan Polupan25. Januar 2020 07:50

MposWebReport-Projekt. Teil 01.

Aufgaben festlegen.

Das Projekt soll die Möglichkeit implementieren, Berichte über den Betrieb von Einrichtungen (Tankstellen) für Kunden zu erhalten, die keinen vollwertigen Teil der Implementierung der Back-Office-Komponente haben, um Betriebsinformationen zu überwachen und zu erhalten Betrieb von Tankstellen.

Für die Umsetzung des Projektes wurde folgende Lösung gewählt:

  • Erstellung eines WEB-Servers, der sich in einem Netzwerksegment mit Zugriff auf die Tankstellendatenbank befindet, um Abfragen zu erstellen und Berichte basierend auf Vorlagen anzuzeigen, der Server muss auch mit Zugriff auf Endkunden zum Empfangen von Berichten versehen sein;
  • Erstellung einer Datenbank und Organisation auf der Grundlage eines persönlichen Kontos des Benutzers;
  • Erstellen eines Dienstprogramms zum Einrichten und Verwalten eines Webservers und des persönlichen Kontos eines Benutzers.

Als Datenbanken werden Firebird in der aktuellen Version 3.0.4 verwendet. Zur Entwicklung und Verwaltung der Datenauswahl und -änderung verwenden wir die GUI-Shell IBExpert . Die neueste kostenlose Vollversion kann unter link. heruntergeladen werden.

Die Version ist für Windows-Betriebssysteme, funktioniert aber gut unter Linux mit WINE .

Um mit der Datenbank in Qt zu arbeiten, verwenden wir den [QIBASE]-Datenbanktreiber (https://doc.qt.io/qt-5/sql-driver.html#qibase), die Treiber-Assemblierung wird [hier] beschrieben ( https://evileg.com/post/356/).

Um den WEB-Server zu implementieren, verwenden wir die Bibliothek QtWebApp . Beschreibung der Bibliothek, Schulungsmaterialien zu ihrer Verwendung sind auf der Website von [Entwickler] verfügbar (http://stefanfrings.de/qtwebapp/index-de.html).

Erstellen Sie ein Projekt.

Da das Projekt aus zwei Anwendungen bestehen wird, erstellen wir ein neues Projekt mit Unterverzeichnissen.

Unterprojekte hinzufügen. Konsolenanwendung MPosWebReport .

Jetzt fügen wir ein Unterprojekt hinzu, um den Server und das persönliche Konto des Benutzers MPosWebAdmin zu verwalten. Eine typische Qt-Widgets-Anwendung, die auf QMainWindow basiert.

Die Projektstruktur sieht jetzt so aus.

Erstellen Sie ein Repository auf GitHub und laden Sie dort ein leeres Projekt hoch.

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

Hinzufügen der QtWebApp-Bibliothek.

Laden Sie QtWebApp herunter, entpacken Sie das Archiv und kopieren Sie den QtWebApp-Ordner in den Projektordner. Wir erhalten folgende Ordnerstruktur:

Wir fügen der Projektdatei MPosWebServer.pro Zeilen hinzu, um das Netzwerk zu unterstützen und den Quellcode der Bibliothek zu verbinden.

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

Außerdem erstellen wir gemäß den Empfehlungen des Bibliotheksentwicklers die Konfigurationsdatei ../etc/MPosWebServer.ini und fügen sie beiden Teilprojekten hinzu.
MPosWebServer.ini

[listener]
;host=192.168.0.100
port=8080
minThreads=4
maxThreads=100
cleanupInterval=60000
readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=10000000
  • Host und Port - IP und Port, auf dem Anfragen verarbeitet werden. Wenn Sie den Host-Parameter auskommentieren, werden alle Netzwerkschnittstellen des Servers abgehört.

  • minThread minimale Anzahl von Worker-Threads im Leerlauf, um HTTP-Anforderungen zu verarbeiten.

  • maxThread maximale Anzahl von Worker-Threads, die erstellt werden, wenn HTTP-Anforderungen eintreffen.

  • cleanupInterval in Millisekunden gibt an, wie lange der kostenlose Stream geschlossen wird.

  • readTimeout Zeit in Millisekunden, nach der eine unbenutzte Verbindung zum Server geschlossen wird.

  • maxRequestSize maximale Größe einer einfachen Anfrage.

  • maxMultiPartSize ist der maximale mehrteilige Anforderungswert, der auftritt, wenn ein Webbrowser eine Datei auf den Server hochlädt.

Lassen Sie uns den Quellcode der mit der Bibliothek gelieferten Beispiele sowie Beispiele aus der Dokumentation verwenden, um die Leistung zu überprüfen.

Hinzufügen der HelloWorldController-Klasse zum MPosWebReport-Projekt
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);
}

Ändern Sie 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();
}

Wir starten das Projekt.

Folgen Sie im Browser dem Link http://localhost:8080

Wir bekommen:

In diesem Teil wurden hauptsächlich die Inhalte der QtWebApp-Bibliotheks-Tutorials verwendet.

Das Thema ist neu für mich und daher interessant. Für Kommentare und Anmerkungen bin ich sehr dankbar.

Projektarchiv
MposWebServer01.zip MposWebServer01.zip

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

s
  • 26. Januar 2020 14:51

Чего не webassembly?

Ruslan Polupan
  • 27. Januar 2020 01:01

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken