Link

KateJS - концепция.

Идея

Приложения для бизнеса (CRM, PM, системы учета и т.п.) имеют похожую структуру, а при их разработке приходится выполнять множество однотипных задач (работа с СУБД, разработка интерфеса и т.п.).

Данный фреймворк разрабатывается для того, чтобы избавить разработчика от рутины, позволить заниматься реализацией только бизнес логики и тем самым ускорить и упростить процесс создания бизнес ПО.

Цели

Фреймворк KateJS стремится к тому, чтобы разработка бизнес ПО была:

  1. Быстрой.

Разработчик должен тратить основное время на бизнес логику. Временные затраты на сопутствующие вопросы (верстка, работа с СУБД и т.п.) должны быть сведены к нулю или минимальны.

  1. Простой.

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

  1. Удобной.

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

Концепция

Приложения на фреймворке KateJS разрабатываются на языке Javascript и являются клиент-серверными web-приложениями: сервер работает на платформе Node.JS, для использования клиента требуется устройство (компьютер, планшет, смартфон) с одним из современных браузеров.

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

Клиент представляет собой одностраничное приложение, описываемое набором Форм. Каждая форма описывается набором элементов и кода. Форма может отображать список элементов, быть формой редактирования и т.п. В общем случае Форма не связана с какими либо данными и может реализовывать любой функционал.

Фреймворк предоставляет возможность создания CRUD API и интерфейса с помощью определения одной только структуры - набора полей и табличных частей. При этом создается как Сущность с необходимым набором методов (т.е. API), так и две формы - форма списка элементов и форма создания/редактирования элемента, которые используют методы созданной Сущности. Созданные Сущность и Формы могут использоваться как есть, расширены/изменены или заменены.

Компоненты фреймворка

Сервер использует koa в качестве http сервера и ORM Sequelize для работы с СУБД. Основной используемой базой данных является MySQL.

Интерфейс строится на React, используя стилизацию material-kit-react компонентов material-ui.

Структура

Структура хранения данных определяется в процессе разработки со следующими ограничениями:

  • каждый объект может иметь одно или несколько полей с типами данных описанных в разделе Структура
  • каждый объект может иметь ноль или несколько “табличных частей” - подчиненных один-ко-многим записей, каждая из которых может состоять из одного или более полей с типами данных описанных в разделе Структура.

Клиент

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

Клиентское приложение представляет собой совокупность форм и меню.

Каждая Форма описывается классом в синтаксисе ES6 и представляет собой набор элементов (поле воода, переключатель, таблица и т.п.), который задается в декларативном стиле в конструкторе и кода, описывающего ее поведение, который задается в методах класса.

Сервер

Сервер описывается Серверным приложением и представляет собой набор Сущностей.

Сущность - структурная единица, описывающая работу с однотипными объектами предметной области (“Товары”, “Контрагенты”) или реализующая некоторый функционал (“Отчет по продажам”).

Сущности описываются классом в синтаксисе ES6 и создаются в единственном экземпляре при запуске приложения. В контексте данной особенности в описании не применяются термины класс и экземпляр по отношению к Сущности.

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

Сущность может наследоваться от базового класса, который предоставляет методы работы с СУБД.

API

Все запросы от клиента к серверу выполняются единым методом POST по единому адресу /api/:entity/:method с передачей параметров и приеме ответа в JSON формате.

В запросе к API указывается сущность (entity), метод (method), который надо вызвать и параметры, которые нужно передать методу:

POST /api/Task/get

{
  id: '123'
}

Приложения

Приложения (и клиентское и серверное) по сути являются модулями. Любое разработанное приложение можно использовать как основу для другого. Можно создать новое приложение комбинацией из существующих или разработать модификацию или надстройку к существующему приложению не меняя его код напрямую.

Так как в Javascript отсутствует возможность множественного наследования, Приложения оформляются комбинированием подхода классов и миксинов.

В конструкторе Приложения в том числе определяется его структура - список Форм для клиентского и список Сущностей для серверного. Этим можно воспользоваться для массовой модификации созданных классов, для модификаций родительских классов в конструкторе дочернего приложения и прочих целей.

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