Ruslan Polupan
Ruslan PolupanҚаң. 25, 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, 2:51 Т.Қ.

Чего не webassembly?

Ruslan Polupan
  • Қаң. 27, 2020, 1:01 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

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

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз