Хабрахабр

[Из песочницы] Опенсорсное приложение учета связи в регионе

0. Недавно мы опубликовали приложение для учета связи в регионе под свободной лицензией Apache 2. Framework – опенсорсном решении на основе node.js для быстрой разработки веб-приложений. реализованной на IONDV. И хотя речь пойдет о примере на основе Хабаровского края — территории сопоставимой с Испанией и Португалией вместе взятых и ещё останется на всю Прибалтику (шутить про медведей на улицах города Хабаровска мы не будем — сами найдете ролики на Youtube)). Связь в регионах это важное условие развития территории и комфортной жизни. Приложение применимо где угодно и доступно для использования без ограничений. Сотовая связь и интернет у нас все еще недоступны в отдаленных населенных участках края, либо их качество оставляет желать лучшего.

Как быстро понять проблемные зоны? Как проанализировать текущее состояние связи? Созданием решения реестрового типа для ведения информации об отрасли, подготовки аналитической отчетности на их основе и формирования планов развития. Как спланировать последующее развитие связи в регионе?

Веб-приложение "Связь"

Telecom или как мы его в команде называем Связь — это программное решение на основе IONDV. IONDV. Приложение опубликовано в открытом доступе на GitHub. Framework, реализованное для организации, учета, хранения и отображения данных о наличии услуг связи (интернет, сотовая связь, телевидение, почта и др.) в населенных пукнтах региона, в том числе наличие связи по объектам отраслей "Здравоохранение", "Образование". Традиционно для всех репозиториев на github есть инструкция в README репозитория, но мы развернули для ознакомления демо систем, без регистрации: https://telecom-ru.iondv.com.

Можно также посмотреть краткое видео снятое как раз на этой демо.

Немного технических деталей

И на этой виртуалке таких демо приложений ещё десяток. Демо развернуто на сервере 2 ядрами CPU и 2 Гб памяти в яндекс облаке. У системы Связи метаданные сложнее — до 3-4-х уровней глубины.
Например объект связи имеет 10 связанных сущностей (сотовая связь, интернет, почта, телевидение и т.п.). Мы тестировали подобную систему на этом же ресурсе в другой статье — «Опыт вывода программной реализации социального проекта «Вспомнить каждого» в опенсорс
» https://habr.com/ru/post/451092/ — получалось до 400 запросов с секунду. А оператор тоже имеет вложенность. Каждая их которых ещё по 3-5 — для сотовой связи это — стандарт, тип подключения, оператор, населенный пункт и т. п.

Мы снимали метрики — для получения 10 объектов в списке (в котором отображались в том числе связанны данные), делалось до 1000-1500 запросов к базе данных. Но и на этих ресурсах она ведет себя достаточно отзывчиво, хотя MongoDb для выборки связанных данных подходит не очень хорошо. При этом стандартное время для пользователя в браузере получается в районе 600-700 ms.

О разработке приложения Связь на платформе IONDV. Framework

Framework. Приложение реализовано на основе технологии IONDV. Основа фреймворка это независимая модель данных, API ядра, функциональные модули и шаблоны представлений. Это опенсорс фреймворк на node.js по созданию высокоуровневых веб-приложений на основе метаданных, что не требует серьезных навыков программирования. Фреймворк запускается в среде Node.js. Для СУБД используется MongoDb — в ней хранятся настройки приложения, метаданные и сами данные. Все вместе обеспечивает кроссплатформенность фреймворка.

В общей сложности, разработка компонентов фреймворка для проекта (геомодуль, доработки модуля отчетов) и метаданных приложения заняли 2643 часа. Кстати, для фреймворка это приложение ключевое — с него началась продуктивная эксплуатация новой версии на node.js с использованием mongoDB.

Всё очень просто — фреймворк + модули + метаданные = приложение.  Подход rapid application development в разработке. Немного о принципе создания приложения на фреймворке.

Framework составляет реестр данных — модуль Регистри. Основу функциональности большинства приложений IONDV. Это ключевой модуль, предназначенный непосредственно для работы с данными на основе структур метаданных.

Он же отлично подходит для быстрого прототипирования приложения — реализации базовой бизнес-логики. По сути каркаc приложения — это те структуры метаданных, которые инициируются для модуля регистри.

При этом есть типовой модуль портала в котором удобнее делать специализированные интерфейсы используя любой удобный фронтенд фреймворк. При этом все, что не укладывается в типовое поведение системы расширяется через шаблоны HTML или написание новых модулей на JavaScript.

Также в этом приложении используются: 

  • модуль аналитики для построения отчетов, 
  • модуль дашборда для отображения информации в виде виджетов, 
  • модуль геоданных для отображения на карте населенных пунктов с данными об отраслях, которые регулируются вручную, 
  • административный модуль для управления пользователями и ролями доступа. Контрольная панель администратора. 

Telecom модуль регистри служит для создания и работы над ключевыми сущностями системы — в метаданных они называются классами: населенный пункт, связь, здравоохранение и образование, а также основные и дополнительные сведения. В приложении IONDV.

Примеры ключевых сущностей

На скриншоте приведена экранная форма.  Например Населенный пункт, который содержит в себе информацию о населенном пункте и в последующем используется для связки всех учетных сущностей — например связи или объектов образования.

А вот так выглядит фрагмент метаданных в формате JSON.

{ "isStruct": false, "key": [ "okato" ], "semantic": "name", "name": "naselenniyPunkt", "version": "", "caption": "Населенный пункт", "ancestor": null, "container": "", "creationTracker": "", "changeTracker": "", "history": 0, "journaling": true, "compositeIndexes": null, "properties": [
{ "orderNumber": 10, "name": "okato", "caption": "ОКАТО", "type": 0, "size": 11, "decimals": 0, "allowedFileTypes": null, "maxFileCount": 0, "nullable": false, "readonly": true, "indexed": true, "unique": true, "autoassigned": false, "hint": null, "defaultValue": null, "semantic": null, "selConditions": [], "selSorting": [], "selectionProvider": null, "indexSearch": false, "eagerLoading": false, "formula": null
},
{ "orderNumber": 30, "name": "name", "caption": "Наименование", "type": 0, "size": 128, "decimals": 0, "allowedFileTypes": null, "maxFileCount": 0, "nullable": true, "readonly": false, "indexed": true, "unique": false, "autoassigned": false, "hint": null, "defaultValue": null, "semantic": null, "selConditions": [], "selSorting": [], "selectionProvider": null, "indexSearch": false, "eagerLoading": false, "formula": null
},

Для них отдельно задаются представления, отличающиеся по разным шагам бизнес-процессов и многое другое. Кстати классы метаданных могут наследоваться. Подробнее о метаданных. В свойстве properties перечислен список атрибутов. 0. Создавать метаданные можно и в приложении Студия или развернув локально с гитхаб – доступна также под свободной лицензией Apache 2.

Например для образовательного учреждения, после ввода данных в основных атрибутах и создания объекта, появляется вкладка «Дополнительные сведения». Данные о сущностях легко дополняются. На скриншоте карточки объекта Образование — это карта. Адрес объекта подставляется из формы и система автоматически определит координаты. На наш взгляд наиболее интересным является реализация атрибута типа «Геоданные». могут быль любым объектом в этом формате — не только точкой, но и полигоном или линией. Данные а этом атрибуте хранятся в GeoJSON – т.е.

Можно потестить демо здесь, а мы расскажем что он показывает.  Проиллюстрируем работу самого наглядного модуля — Geomap или модуля геоданных — он использует для отображения данных API Яндекса.

На карте можно кликнуть на иконку с населенным пунктом. Слева представлены слои карты, где по умолчанию выбран слой "Населенные пункты". В результате, справа появляется карточка с информацией о наличии инфо- и телекоммукации в нем. 

Если два раза кликнуть на район — то отобразятся данные только района — включится фильтр. Можно перейти на слой "Связь по населенным пунктам" и справа отобразятся сводные данные по районам края, рассчитанные в аналитическом модуле. Если кликнуть два раза на район ещё раз — вернется общая карта.

А способ отображения в виде шаблона html
Пример фрагмента о всплывающем окне с краткой информацией из метаданных для слоя 2G. Информация о слоях а также способах получения данных задаются в виде метаданных в JSON.

"balloonContentLayoutClass" : "<div class='map-ajax-balloon' data-url='geomap/render/khv-svyaz-info/2gMobileKray/0/}?template=geo/balloon/2gMobile'><i class='fa fa-refresh fa-spin'></i></div>"

В нём доступ к данным обеспечивается работой с объектом item и его свойствами: Пример шаблона EJS со всеми данными по мобильной связи отображающегося в правом окне.

<%
let result = {
title: item.get('name')
} if (item.get('chislennost')) {
result.title += ' (' + item.property('chislennost').evaluate() + ' чел.)';
} let itemSvyaz = item.property('svyaz').evaluate();
if (itemSvyaz) {
%> <ul class='balloon-attrlist' style='width:225px'>
<li><%- result.title %></li>
</ul>
<ul class='mt10'>
<table>
<%
let coll = itemSvyaz.property('mobile').evaluate();
if (coll && coll.length) {
for (let elem of coll) {
let collOp = elem.get('mobileOperator');
let collSt = elem.property('mobileStandart').evaluate();
if (collOp) {
%>
<tr>
<td>
<li><%- elem.property('mobileOperator').evaluate() %></li>
</td>
<td><%
for (let element of collSt) { %>
<%- element %>
<% } %>
</a></td>
</tr>
<% } } } } %>
</table>
</ul>

Например мы делали интеграцию с QlickView. Данные из системы можно выгружать для аналитики в системе BI. Для упрощения работы аналитиков использовали не REST-API системы, а напрямую подключали QlickView к СУБД через MongoDB Connector — эмуляция SQL достаточно качественная для этих задач.

Как получить?

Скрипт поставит зависимости окружения, склонирует все необходимые репоизтории фреймворка, модулей и приложения из GitHub, соберет, инициирует и запустит приложение: Под линуксом установить приложением можно одной строкой, если локально стоит git, node.js и mongodb с использованием установщика iondv-app.

bash <(curl -sL https://raw.githubusercontent.com/iondv/iondv-app/master/iondv-app) -q -i -m localhost:27017 telecom-ru

Где вместо localhost:27017 нужно указать адрес MongoDb.

Также можно запустить докер контейнер:

# Запустите СУБД mongodb: docker run --name mongodb -v mongodb_data:/data/db -p 27017:27017 -d mongo
# Запустите IONDV. Telecom docker run -d -p 80:8888 --link mongodb iondv/telecom-ru

А по адресу http://localhost:8888/registy будет доступен бек офиса с учетной записью demo, пароль ion-demo. После запуска открыть ссылку http://localhost:8888 где отобразятся демо данные на геослое.

Смотрите также руководство пользователя приложения.

Каковы плюсы?

Telecom — наглядное представление состояния развития сферы телекоммуникации в регионе, что позволяет планировать улучшение качества инфраструктуры связи, а также предоставлять эти данные в открытом доступе. Главное преимущество реестра связи IONDV.

Framework, а это открытый исходный код на JavaScript и открытая структура метаданных в JSON, что подразумевает полную свободу доработки. Решение по учету связи основано на опенсорсном фреймворке IONDV. 0). Почти, в рамках Apache 2. При том, что движок не требователен к ресурсами — он отлично подходит для разработки надежных бизнес приложений разного масштаба. Подправить, улучшить и продать точно можно.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть