Подключаемые модули

Подключаемые модули

Перед тем как перейти к описанию структуры и функциональности модулей, стоит посмотреть на то, как происходит запуск системы. Файл /static/index.js.

var MSite = (new function(){

    var self = this;

    self.Events = new EventEmitter();

    self.Init = function(done) {
        ModuleManager.Load(function(){
            ModuleManager.Init(function(){
                self.Events.emit("initauth");
                return done && done();
            })                
        })    
    }

    self.Start = function(){
        self.Init(function () {
            self.Events.emit("inited");
            // ...
        });
        History.Adapter.bind(window,'statechange',function(){
            self.Events.emit("navigate");
            window.scrollTo(0,0);
        });
        window.onbeforeunload =function(){
            self.Events.emit("unload");
        };
    }
})


$(document).includeReady(function () {
    MSite.Start();
});

Если попытаться описать словами, что происходит для запуска системы, то получится следующее:

  1. Система дожидается пока загрузятся все необходимые js файлы и файлы шаблонов (библиотечные файлы, прописанные в index.html, и файлы модулей) - includeReady.

  2. После этого загружает список модулей с сервера (конфигурации включенных модулей) - ModuleManager.Load

  3. Происходит инициализация модулей - ModuleManager.Init

В зависимости от того, зарегистрирован пользователь в системе или нет, запускаются модули:

  1. доступные только для гостя

  2. доступные для гостя и авторизованного пользователя.

Структура и функционал модуляLogin.

Структура файлов выглядит следующим образом:

Чем занимается модуль:

  1. Авторизация пользователя (Login+Пароль)

  2. Восстановлении пароля через электронную почту

  3. Регистрация пользователя

  4. Редактирование Профиля

  5. Возможность изменения пароля

  6. Проверка пароля на надежность

  7. Предоставление остальным модулям системы информации о том, зарегистрирован пользователь или нет

  8. Отображение в правом верхнем углу системы информации о текущем пользователе

Остановимся на списке файлов:

api.js

серверный код необходимый для работы модуля. На выходе система ожидает от этого файла - Express router. Все маршруты которые описываются в модуле будут автоматически получать prefix /api/modules/{id модуля}. То есть, если мы пишем в маршруте /signup, то на самом деле api вызов будет находится по адресу /api/modules/login/signup.

При написании серверного кода стоит обратить внимание на следующие особенности:

  1. Система обработки ошибок предполагает, что если возникнут ошибки внутри маршрута, то идентификатор ошибки будет передаваться в функцию next. Например, return next("passwordisempty"), приведет к тому, что в ответ на ajax запрос, придет информация об ошибке в виде {err:"passwordisempty"}.

  2. Записи в системе не удаляются - им ставится атрибут IsActive в значение false. Поэтому при обращении к базе данных стоит указывать .isactive()

  3. Если вы хотите получить модель из базы данных в режиме только по чтению - необходимо использовать модификатор .lean() для ускорения работы.

config.json

конфигурационный файл описывающий поведение модуля

Стоит обратить внимание на следующие поля в файле настройки:

is_enabled

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

initial_load, guest_load, start_load

означает, что модуль предполагает начальную загрузку данных с сервера. guest_load - модуль работает и не для авторизованных пользователей. start_load - пока только у 1 го модуля Models (про него подробнееМодули системы) - предполагается, что без загрузки этих модулей - совсем ничего не сможет работать - даже обычные модули. Флаг используется очень редко.

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.md)

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?