Ruslan Polupan
Ruslan Polupan25 января 2020 г. 7:50

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

Постановка задачи.

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

Для реализации проекта было выбрано следующее решение:

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

В качестве баз данных используется Firebird текущей версии 3.0.4. Для разработки и администрирования выбора и изменения данных используем GUI-оболочку IBExpert . Последнюю бесплатную полнофункциональную версию можно скачать по ссылке.

Версия предназначена для ОS 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 г. 1:01

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

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

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

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

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

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

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

Следите за нами в социальных сетях