Подключаемые модули
Подключаемые модули
Перед тем как перейти к описанию структуры и функциональности модулей, стоит посмотреть на то, как происходит запуск системы. Файл /static/index.js.
Если попытаться описать словами, что происходит для запуска системы, то получится следующее:
Система дожидается пока загрузятся все необходимые js файлы и файлы шаблонов (библиотечные файлы, прописанные в index.html, и файлы модулей) - includeReady.
После этого загружает список модулей с сервера (конфигурации включенных модулей) - ModuleManager.Load
Происходит инициализация модулей - ModuleManager.Init
В зависимости от того, зарегистрирован пользователь в системе или нет, запускаются модули:
доступные только для гостя
доступные для гостя и авторизованного пользователя.
Структура и функционал модуляLogin.
Структура файлов выглядит следующим образом:
Чем занимается модуль:
Авторизация пользователя (Login+Пароль)
Восстановлении пароля через электронную почту
Регистрация пользователя
Редактирование Профиля
Возможность изменения пароля
Проверка пароля на надежность
Предоставление остальным модулям системы информации о том, зарегистрирован пользователь или нет
Отображение в правом верхнем углу системы информации о текущем пользователе
Остановимся на списке файлов:
api.js
серверный код необходимый для работы модуля. На выходе система ожидает от этого файла - Express router. Все маршруты которые описываются в модуле будут автоматически получать prefix /api/modules/{id модуля}. То есть, если мы пишем в маршруте /signup, то на самом деле api вызов будет находится по адресу /api/modules/login/signup.
При написании серверного кода стоит обратить внимание на следующие особенности:
Система обработки ошибок предполагает, что если возникнут ошибки внутри маршрута, то идентификатор ошибки будет передаваться в функцию next. Например, return next("passwordisempty"), приведет к тому, что в ответ на ajax запрос, придет информация об ошибке в виде {err:"passwordisempty"}.
Записи в системе не удаляются - им ставится атрибут IsActive в значение false. Поэтому при обращении к базе данных стоит указывать .isactive()
Если вы хотите получить модель из базы данных в режиме только по чтению - необходимо использовать модификатор .lean() для ускорения работы.
config.json
конфигурационный файл описывающий поведение модуля
Стоит обратить внимание на следующие поля в файле настройки:
is_enabled
флаг, который предполагает возможность отключение модуля без его удаления из репозитория
initial_load, guest_load, start_load
places и sort_index
места в верстке, где предполагается отображение модуля. У одного модуля может быть несколько значений. Сортировка модулей при отображении происходит по полю sort_index. Включение некоторых флагов, предполагает наличие шаблона с определенным названием. Шаблоны, обычно, располагаются в файле template.html.
На данный момент поддерживаются:
topmenu
предполагается наличие шаблона {id}_top_menu
toolbutton
предполагает наличие шаблона tb_{id}
adminplugin
предполагает наличие шаблона app_{id}
adminpage
предполагает наличие index.html с кодом страницы
documentpage
предполагает наличие index.html
leftmenu
предполагает наличие шаблона {id}_left_menu
rightmenu
Страницы отображаемые аналогично leftmenu, только справа. Пока в системе - нет
homepage
Страницы отображаемые аналогично adminplugin, только на главной странице. Пока в системе - нет
pages
описание дополнительных страниц. Обратите внимание на параметр breadcrumbs (хлебные крошки) если вы хотите, чтобы у вас создавалась дополнительная навигация на страницах, нужно это поле заполнять.
Для каждой страницы, описанной в пункте pages, создастся страница, доступная для навигации через pagerjs.
permissions и permissionsModels
Массив кодов привелегий. Например, для редактора колонок (модуль columns) выделяются отдельные привелегии для редактирования колонок, колсетов и заголовков: IsColumnEditor, IsColsetEditor, IsHeaderEditor.
template.html
Содержит шаблоны, которые могут использоваться в страницах модулей. Ниже приведен шаблон выводящий информацию о текущем пользователе в системе: Аватар, имя, должность. Кроме информации о пользователе выводится информация о состоянии соединения с сервером (используется флажок из модуля Socket - IsOnline) и при нажатии на блок - отображается выпадающее меню, с возможностью перехода на персональную страницу пользователя и возможностью выйти из системы (закрытия сессии)
index.css
Дополнительные стили, используемые в модуле
index.html
Код страницы, отображаемой если у модуля установлен флаг, что он является страницей администрирования или страницей документа -documentpageилиadminpage. Для нашего примера - index.html может быть пустым или отсутствовать
lang.json
Список идентификаторов, используемых в модуле с переводами
Все файлы переводов принимают участие в работе модуля Lang. Система, встречая ссылку, которую необходимо перевести - сначала ищет перевод в файле lang.json модуля и если не находит, использует переводы из других модулей.
login.html, profile.html ...
Реализация дополнительных страниц, объявленных в конфигурационном файле модуля. Ниже - пример персональной страницы - profile.html
index.js
Основной файл с логикой запускаемый в браузере. Кроме основной модели представления (View Model), в нашем примере MLogin, в файле могут содержаться расширения для knockout-а (custom binding)
В большинстве случаев общение между модулями происходит через события. Так в нашем примере, при инициализации модели (Init) мы подписываемся на событие от системы: MSite.Events.on("initialnavigate",self.ForceRedirect). При запуске системы, мы можем проверить, что пользователю необходимо сменить пароль и перенаправить его на страницу модуля Login. Любой модуль может объявить внутри себя интерфейс для отправки событий, на который смогут подписаться другие модули self.Events = new EventEmitter(). Следует избегать использование других способов взаимодействия между модулями (исключение могут составлять базовые модули, описанные в следующей главе)
Last updated
Was this helpful?