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
Чего не webassembly?
Да так, посмотрел библиотеку попробовал примеры...