У нас появилось понимание каким образом сделать механизмы для расширения веб-интерфейсе. Как доказательство концепции сделали внешний модуль удалённого пульта КМ-5.
Как это будет работать
Наш веб-интерфейс - это SPA angular приложение, которое раздаётся сервером ЛЭРС УЧЁТ на всех маршрутах, кроме некоторых зарезервированных. Мы сделаем в сервере возможность раздавать не только веб-интерфейс, но и другие SPA-приложения. Для этого будет зарезервирован маршут _plugin/ИМЯ_МОДУЛЯ
. Например, если наш веб-интерфейс работает на адресе https://my.lers.ru
, то установленный внешний модуль будет открываться по пути https://my.lers.ru/_plugin/km5-remote-console
.
Каким образом модуль будет встроен в веб
Точно так же, как и в АРМ оператора будет возможность встроить модуль в список объектов, точек и в меню “Сервис”. Для этого нужно будет разместить в папке с вашим SPA-приложением json-файл с манифестом, в котором будет указано куда будут встроены пункты меню модуля.
После того как пользователь выбрал этот пункт, веб-интерфейс откроет новую вкладку с адресом веб-интерфейса и идентификатором точки или объекта в качестве параметра запроса. Например, внешний модуль удалённого пульта со списка точек или объектов откроется с адресом https://my.lers.ru/_plugin/km5-remote-console?measurePointId=123
SPA-приложение должно получить идентификатор точки или объекта из строки запроса и работать с ним.
Как быть с авторизацией
Так как, с точки зрения браузера, оба этих приложения это один сайт, им доступно локальное хранилище браузера, в котором уже сохранён рабочий токен для выполнения запросов к серверу. Ваш внешний модуль после загрузки должен обратиться к локальному хранилищу, запросить этот токен и использовать для дальнейших запросов к серверу.
Как быть с REST API
Как и в предыдущем пункте, браузер считает, что это тот же самый сайт, так что внешний модуль может без проблем отправлять запросы к REST API сервера, используя маршруты вида /api/v1/serverInfo
. Адрес сервера указывать не нужно, достаточно относительного маршрута.
Кроме того, вы можете сгенерировать классы для работы с REST API, так как наш сервер предоставляет спецификацию OpenAPI.
Как обновлять такой плагин
Достаточно будет скопировать новые файлы в папку с внешним модулем. Скорее всего, даже не потребуется перезапуск сервера.
Будет ли каталог
Скорее всего, мы сделаем каталог внешних модулей для веб-интерфейса, чтобы вы могли установить его на сервере одним щелчком. Кроме того, в дальнейшем будет реализовано автоматическое обновление.
Что это даёт
Вы сможете написать своё SPA-приложение на любом фреймворке. Это может быть Angular, Vue, React, Svetle, или что угодно другое. Ссылка на это приложение будет автоматически встроена в наш веб-интерфейс, что позволит вам расширить своими функциями.
Скорее всего, мы опубликуем библиотеку для того, чтобы проще писать внешние модули, но она будет только под angular, так как мы пишем веб-интерфейс на нём, и наши внешние модули так же будут основаны на нём.
В общем, идеи примерно такие. Хотелось бы выслушать мнения и предложения пользователей, которым это интересно.