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 р. 01:37

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

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

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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