Ruslan Polupan
Ruslan Polupan25 січня 2020 р. 07:50

Проект MposWebReport. Частина 01

Постановка завдань.

Проект покликаний реалізувати можливість отримання звітності про роботу об'єктів (АЗС) для клієнтів, які не мають повноцінної частини реалізації Бек-офісної складової, моніторити та отримувати будь-які оперативні відомості про роботу АЗС.

Для реалізації проекту було обрано таке рішення:

  • створення WEB сервера, який розміщуватиметься з сегменту мережі, що має доступ до бази даних АЗС для побудови запитів та відображення звітів на підставі шаблонів, до сервера також повинен бути наданий доступ кінцевим клієнтам для отримання звітності;
  • Створення бази даних та організації на її основі особистого кабінету користувача;
  • створення утиліти для налаштування та керування web-сервера та особистим кабінетом користувача.

Як база даних використовується Firebird поточної версії 3.0.4. Для розробки та адміністрування вибору та зміни даних використовуємо GUI-оболонку IBExpert . Останню безкоштовну повнофункціональну версію можна завантажити за посиланням (http://www.ibexpert.com/ukr/ibe_sfx.exe)

Версія призначена для OS Windows, проте чудово працює в Linux з використанням WINE .

Для роботи з базою в Qt будемо використовувати драйвер баз даних QIBASE , збирання драйвера описано тут .

Для реалізації WEB-сервера скористаємося бібліотекою QtWebApp . Опис бібліотеки навчальні матеріали щодо її використання розміщено на сайті розробника .

Створення проекту.

Оскільки проект складатиметься з двох додатків, то створюємо новий проект з піддиректоріями.

Додаємо підпроекти. Консольний додаток MPosWebReport .

Тепер додаємо підпроект для керування сервером та особистим кабінетом користувача MPosWebAdmin . Звичайна програма Qt Widgets на основі QMainWindow.

Структура проекту тепер виглядає так.

Створюємо репозиторій на GitHub та завантажуємо туди порожній проект.

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

Додавання бібліотеки QtWebApp.

Качаємо QtWebApp , розпаковуємо архів і копіюємо папку QtWebApp в папку з проектом. Отримуємо наступну структуру папок:

Додаємо рядки у файл проекту MPosWebServer.pro підтримку мережі та підключаємо вихідні джерела бібліотеки.

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

Далі згідно з рекомендаціями розробника бібліотеки створюємо конфігураційний файл ../etc/MPosWebServer.ini і додаємо його в обидва підпроекти.
MPosWebServer.ini

[listener]
;host=192.168.0.100
port=8080
minThreads=4
maxThreads=100
cleanupInterval=60000
readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=10000000
  • host та port - IP та порт за якими будуть оброблятися запити. Якщо закоментувати параметр host, то будуть прослуховуватися всі мережеві інтерфейси сервера.

  • minThread мінімальна кількість не зайнятих робочих потоку для обробки HTTP запитів.

  • maxThread максимальна кількість робочих потоків, що створюються при надходженні HTTP запитів.

  • cleanupInterval у мілісекундах вказує через скільки буде закриватися вільний потік.

  • readTimeout час у мілісекундах, через який закривається не використовуване з'єднання з сервером.

  • maxRequestSize максимальний розмір простого запиту.

  • maxMultiPartSize максимальне значення багатоскладового запиту, що відбувається, коли веб-браузер завантажує файл на сервер.

Скористаємося вихідниками прикладів, що постачаються з бібліотекою, а також прикладів з документації для перевірки працездатності.

Додаємо до проекту MPosWebReport клас HelloWorldController
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);
}

Змінюємо 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();
}

Запускаємо проект.

У браузері переходимо за посиланням http://localhost:8080

Отримуємо:

У цій частині переважно використовувався вміст навчальних матеріалів бібліотеки QtWebApp.

Тема для мене нова і тому цікава. Буду дуже вдячний за коментарі та зауваження.

Архів проекту
MposWebServer01.zip MposWebServer01.zip

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

s
  • 26 січня 2020 р. 14:51

Чего не webassembly?

Ruslan Polupan
  • 27 січня 2020 р. 01:01

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

Коментарі

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

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 08:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall15 листопада 2024 р. 03:03
Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 листопада 2024 р. 19:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 17:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в 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
innorwall14 листопада 2024 р. 12:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 11:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 18:55
Всё ещё разбираюсь с кешем. 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
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 11:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах