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
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42бали,
  • Рейтинг балів-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов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 аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

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