diff --git a/_data/sidebars/flexberry-ember-3_sidebar.yml b/_data/sidebars/flexberry-ember-3_sidebar.yml index c3f910168..078c4f3ae 100644 --- a/_data/sidebars/flexberry-ember-3_sidebar.yml +++ b/_data/sidebars/flexberry-ember-3_sidebar.yml @@ -25,11 +25,26 @@ entries: output: web, pdf folderitems: + - title: Generation of Flexberry Ember Application + title_ru: Генерация приложений + url: /efd3_app-generation.html + output: web, pdf + - title: Structure of Flexberry Ember Application title_ru: Обзор структуры сгенерированных приложений url: /efd3_generated-app-structure.html output: web, pdf + - title: Start of Flexberry Ember Application + title_ru: Запуск сгенерированных приложений + url: /efd3_generated-app-start.html + output: web, pdf + + - title: Regeneration of Flexberry Ember Application + title_ru: Перегенерация приложений + url: /efd3_generated-app-regeneration.html + output: web, pdf + - title: Forms and routing title_ru: Формы и роутинг output: web, pdf diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-plugin.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-plugin.png new file mode 100644 index 000000000..bba8ca74c Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-plugin.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend-choise.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend-choise.png new file mode 100644 index 000000000..3747f24b7 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend-choise.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend.png new file mode 100644 index 000000000..85c6b2b6e Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend-full.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend-full.png new file mode 100644 index 000000000..09f88e004 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend-full.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend.png new file mode 100644 index 000000000..041943ec1 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addexistingproject.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addexistingproject.png new file mode 100644 index 000000000..ae6517491 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addexistingproject.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addodataconfig.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addodataconfig.png new file mode 100644 index 000000000..29fabae6c Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addodataconfig.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addprojectreference.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addprojectreference.png new file mode 100644 index 000000000..50b070da2 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addprojectreference.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-chooseprojecttype.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-chooseprojecttype.png new file mode 100644 index 000000000..71b84cf10 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-chooseprojecttype.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-createproject.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-createproject.png new file mode 100644 index 000000000..3b342d529 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-createproject.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-forbidden.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-forbidden.png new file mode 100644 index 000000000..6df3c918a Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-forbidden.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedflexberry.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedflexberry.png new file mode 100644 index 000000000..c8ae40d3d Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedflexberry.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedunity.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedunity.png new file mode 100644 index 000000000..7b8b73672 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedunity.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeextras.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeextras.png new file mode 100644 index 000000000..67fd04dcb Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeextras.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeoracle.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeoracle.png new file mode 100644 index 000000000..f11d0931c Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeoracle.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-viewodata.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-viewodata.png new file mode 100644 index 000000000..b6f46fa68 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-viewodata.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-webapi.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-webapi.png new file mode 100644 index 000000000..aedfe3197 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-webapi.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/backend-API.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/backend-API.png new file mode 100644 index 000000000..0a5f47456 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/backend-API.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-build-success.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-build-success.png new file mode 100644 index 000000000..a8a8940e9 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-build-success.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-details.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-details.png new file mode 100644 index 000000000..cef3bc33e Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-details.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-enum.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-enum.png new file mode 100644 index 000000000..8061a2681 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-enum.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-empty-listform.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-empty-listform.png new file mode 100644 index 000000000..f9136c6d5 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-empty-listform.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-menu.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-menu.png new file mode 100644 index 000000000..b71227686 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-menu.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-master.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-master.png new file mode 100644 index 000000000..bfaadb92e Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-master.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-masters.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-masters.png new file mode 100644 index 000000000..42211e273 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-masters.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-start-terminal.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-start-terminal.png new file mode 100644 index 000000000..a626e64cd Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-start-terminal.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-started.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-started.png new file mode 100644 index 000000000..61a4bf7f6 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-started.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-validation.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-validation.png new file mode 100644 index 000000000..850e5be16 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-validation.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-cors-enabling.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-cors-enabling.png new file mode 100644 index 000000000..ae5012930 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-cors-enabling.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-url-changing.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-url-changing.png new file mode 100644 index 000000000..d9d2bf768 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-url-changing.png differ diff --git a/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-frontend-config.png b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-frontend-config.png new file mode 100644 index 000000000..99fb03c12 Binary files /dev/null and b/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-frontend-config.png differ diff --git a/pages/products/flexberry-ember/3.x/app-generation/efd3_app-generation.md b/pages/products/flexberry-ember/3.x/app-generation/efd3_app-generation.md new file mode 100644 index 000000000..8aca5a287 --- /dev/null +++ b/pages/products/flexberry-ember/3.x/app-generation/efd3_app-generation.md @@ -0,0 +1,687 @@ +--- +title: Генерация приложений +sidebar: flexberry-ember-3_sidebar +keywords: Flexberry Ember +toc: true +permalink: ru/efd3_app-generation.html +lang: ru +summary: Настройка и генерация метаданных приложения, генерация разными способами фронтенда и бакэнда. +--- + +## Подготовка к генерации + +Для того, чтобы сгенерировать приложение Flexberry Ember, необходимо во [Flexberry Designer](fd_flexberry-designer.html) представить предметную область в виде [диаграммы классов](gpg_class-diagram.html). + +{% include note.html content="[Построение других UML-диаграмм](gpg_practical-guides-uml.html) также необходимо для глубокого анализа и проработки предметной области, однако непосредственно генерация производится по [диаграмме классов](gpg_class-diagram.html)." %} + +{% include important.html content="При разработке приложений на Flexberry Ember [рекомендовано использовать английский язык](gpg_setting-language-and-structure.html) для именования тех элементов модели, с которыми работает разработчик." %} + +В [диаграмме классов](gpg_class-diagram.html) должны быть [сгенерированы](gpg_create-and-configure-application-structure.html) или созданы вручную [представления и формы](gpg_create-and-configure-application-structure.html), [настроены контейнеры](gpg_create-and-configure-application-structure.html) (впоследствии на основании настроек контейнеров в [контроллер](https://guides.emberjs.com/v3.1.0/controllers/) "application" [после генерации будет добавлена структура](efd3_generated-app-structure.html), соответствующая сайтмапу приложения Flexberry Ember). + +## Плагин генерации для Flexberry Ember во Flexberry Designer + +Для корректной работы плагина генерации для Flexberry Ember во [Flexberry Designer](fd_flexberry-designer.html) требуется проверить, что на компьютере установлено [необходимое программное обеспечение](gpg_ember-application-generation.html). + +Далее наобходимо [установить плагин](fd_flexberry-plugins.html) Flexberry Ember CasePlugin в папку [Flexberry Designer](fd_flexberry-designer.html) (или удостовериться, что он уже установлен). + +В конфигурационном файле [Flexberry Designer](fd_flexberry-designer.html) нужно добавить настройку, которая отвечает за версию устанавливаемого ember-аддона: + +```xml + + + ... + + ... + + + ... + +``` + +Или при желании можно указать прямо ссылку на [git-репозиторий](https://github.com/Flexberry/ember-flexberry): + +```xml + +``` + +Вызов плагина происходит из стадии во [Flexberry Designer](fd_flexberry-designer.html), где после вызова контекстного меню стадии нужно выбрать пункт "Ember". + +### Меню плагина генерации + +Плагин генерации для Flexberry Ember во [Flexberry Designer](fd_flexberry-designer.html) предоставляет следующие возможности посредством меню: + +![Меню плагина генерации для Flexberry Ember во Flexberry Designer](/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-plugin.png) + +* `Свойства модели` - основные настройки генерации: расположение генерируемого кода, название продукта, общепроектные настройки, [карта типов](fd_types-map.html). + +В процессе генерации типы .NET из карты типов будут автоматически заменены на соответствующие типы Javascript согласно этой таблицы: + +| Типы .NET | Типы Javascript +|-----------|---------------- +| bool, bool? | boolean +| decimal, decimal?, double, double?, short, short?, int, int?, long, long?, float, float?, ushort, ushort?, uint, uint?, ulong, ulong?, NullableInt, NullableDecimal | number +| DateTime, DateTime?, NullableDateTime | date +| Все остальные типы | number + +* `Создать представления, формы и приложение` - создание быстрого прототипа на базе реализованной [диаграммы классов](gpg_class-diagram.html) (часть созданных элементов может потребоваться [донастроить вручную](gpg_create-and-configure-application-structure.html)). + +* `Frontend` - подменю, связанное с генерацией фронтенда. + * `EmberJS` - генерация фронтенда на EmberJS + * `Генерировать всё` - генерация + * `Генерировать метаданные` - генерация метаданных, об этом ниже. + * `Компилировать` - сборка сгенерированного приложения (в общем случае это приводит к запуску команды [Ember CLI](https://cli.emberjs.com/release/) [`ember build -e development`](https://cli.emberjs.com/release/basic-use/cli-commands/)). + * `Запустить сервер` - запуск сгенерированного приложения (в общем случае это приводит к запуску команды [Ember CLI](https://cli.emberjs.com/release/) [`ember serve`](https://cli.emberjs.com/release/basic-use/cli-commands/)). + * `Открыть каталог` - открытие папки со сгенерированным кодом. + * `Apache Cordova` - генерация фронтенда на Apache Cordova + * `Генерировать проект Apache Cordova` + * `Собрать мобильное приложение` + +* `Backend` - подменю, связанное с генерацией бакенда. + * `ASP.NET` - генерация бакенда для [ASP.NET](https://dotnet.microsoft.com/apps/aspnet). + * `Генерировать` + * `Открыть каталог` + * `Открыть в Visual Studio...` + * `ASP.NET Core 3.1` - генерация бакенда для [ASP.NET Core 3.1](https://dotnet.microsoft.com/learn/aspnet/what-is-aspnet-core). + * `Генерировать` + * `Открыть каталог` + * `Открыть в Visual Studio...` + * `JAVA` - в настоящий момент данный пункт меню находится в разработке. + * `PHP` - в настоящий момент данный пункт меню находится в разработке. + +* `Docker` - работа с [Docker](gbt_deployment_docker.html). + * `Создать Dockerfile` + * `Создать Dockerfile для автоматической сборки` + * `Создать скрипт сборки образов` + * `Создать Swarn-конфигурацию и скрипт запуска Swarn-конфигурации` + * `Запустить Swarn-конфигурацию` + +* `Storage` - подменю, связанное с генерацией скриптов для приложения для разных СУБД (пункты меню у разных СУБД аналогичны, поэтому указаны только для Postgre SQL). + * `Microsoft SQL server` - настройки и генерация скриптов для [Microsoft SQL server](https://ru.wikipedia.org/wiki/Microsoft_SQL_Server). + * `Postgre SQL` - настройки и генерация скриптов для [Postgre SQL](https://www.postgresql.org/). + * `Настройка БД` + * `Привести БД в соответствие с моделью` + * `Сгенерировать SQL` + * `Полномочия` + * `Создать полномочия` + * `Создать пользователя по умолчанию` + * `ClickHouse` - настройки и генерация скриптов для [ClickHouse](https://clickhouse.tech/docs/ru/). + * `Oracle` - настройки и генерация скриптов для [Oracle](https://www.oracle.com/ru/index.html). + * `Microsoft Access` - настройки и генерация БД для [Microsoft Access](https://ru.wikipedia.org/wiki/Microsoft_Access). + +* `Утилиты` - [вспомогательные утилиты](fo_orm-case-plugin.html) для работы со стадией. + * `Менеджер классов` + * `Менеджер ассоциаций` + * `Менеджер наследований` + * `Менеджер представлений` + * `Менеджер запусков генерации` + * `Обновить представления` + * `Найти ошибки в модели` + * `Экспорт стадии` + * `Сохранить диаграммы в формате wmf` + * `Генерация документации по диаграммам` + * `Переместить...` + * `История изменений стадии` + * `Создать бекап` + +* `Информация о лицензии` + +## Генерация метаданных приложения + +Генерация приложений Flexberry Ember основана на [технологии Blueprints](https://ember-cli.com/api/classes/blueprint), встроенной в EmberJS, для чего требуются специального вида метаданные. Под метаданными понимаются файлы определённого формата, содержащие некоторое описание моделей, перечислений, форм и т.д. Генерация приложений Flexberry Ember выполняется итеративно, т.е. предполагается, что в первую очередь изменяются метаданные и именно в них содержится правильное описание структуры приложения. После изменения метаданных выполняется повторная генерация приложения. + +Метаданные могут быть получены при помощи плагина генерации для Flexberry Ember во [Flexberry Designer](fd_flexberry-designer.html). Сгенерированнае с помощью плагина метаданные располагаются в папке `vendor/flexberry/`. После генерации структура метаданных следующая: + +* application + * sitemap.json +* edit-forms + * "название формы редактирования".json + * ... +* enums + * "название перечислимого типа".json + * ... +* list-forms + * "название списковой формы".json + * ... +* models + * "название модели".json + * ... +* objects + +### Метаданные уровня приложения + +На уровне приложения к метаданным относится описание навигационного меню (`sitemap.json`), основанное на [настройках контейнеров во Flexberry Designer](gpg_create-and-configure-application-structure.html). Пример такого сайтмапа: + +```json +{ + "applicationCaption": "Проверка генерации", + "applicationTitle": "Ember3 gen", + "items": [ + { + "link": null, + "menuName": "базовая-часть", + "caption": "Базовая часть", + "title": "Базовая часть", + "children": [ + { + "link": "neo-platform-gen-test-child1-l", + "menuName": null, + "caption": "Первый потомок", + "title": "", + "children": null + }, + ... + ] + }, + ... + ], + "mobile": true +} +``` + +### Метаданные форм редактирования + +Для каждой формы редактирования в приложении создаётся свой файл метаданных. Имя файла с метаданными должно соответствовать имени [будущей формы в приложении](efd3_editform.html). Пример метаданных формы редактирования: + +```json +{ + "propertyLookup": [ // Описание ссылок из класса на мастера и детейлы. + { // Описание мастеровых ссылок. + "master": null, + "displayAttributeName": null, + "required": false, + "relationName": "MasterForAgregator", + "projection": "MasterForAgregatorL", + "detailModelName": null + }, + ... + { // Описание детейловых ссылок. + "master": "masterForAgregator", + "displayAttributeName": "enum2Field", + "required": true, + "relationName": "DetailForAgregator.MasterForAgregator", + "projection": "MasterForAgregatorL", + "detailModelName": "neo-platform-gen-test-detail-for-agregator" + }, + ... + ], + // Непосредственно описание формы. + "external": false, + "caption": "Агрегатор", + "name": "NeoPlatformGenTestAgregatorClassE", + "className": "AgregatorClassE", + "attrs": [], + "projections": [ + { + "modelName": "neo-platform-gen-test-agregator-class", + "modelProjection": "AgregatorClassE" + } + ] +} +``` + +### Метаданные перечислений + +Пример метаданных для перечислимого типа: + +```json +{ + "nameSpace": "NeoPlatform.GenTest", + "className": "Enum1Type", + "enumObjects": { + "FirstValue": "Первый", + "SecondValue": "Второй", + "ThirdValue": "Третий" + } +} +``` + +### Метаданные списковых форм + +Для каждой списковой формы в приложении создаётся свой файл метаданных. Имя файла с метаданными должно соответствовать имени [будущей формы в приложении](efd3_listform.html). Пример метаданных списковой формы: + +```json +{ + "newForm": "neo-platform-gen-test-master-for-agregator-e", + "editForm": "neo-platform-gen-test-master-for-agregator-e", + "external": false, + "caption": "Мастера агрегаторов", + "name": "NeoPlatformGenTestMasterForAgregatorL", + "className": "MasterForAgregatorL", + "attrs": [], + "projections": [ + { + "modelName": "neo-platform-gen-test-master-for-agregator", + "modelProjection": "MasterForAgregatorL" + } + ] +} +``` + +### Метаданные моделей + +Метаданные [моделей](efd3_model.html) располагаются в каталоге `models`. Пример метаданных модели: + +```json +{ + "name": "NeoPlatformGenTestAgregatorClass", // Полное название класса в CASE-инструментарии. + "modelName": "neo-platform-gen-test-agregator-class", // Название модели в ember-приложении. + "className": "AgregatorClass", // Краткое название класса в CASE-инструментарии. + "nameSpace": "NeoPlatform.GenTest", // Пространство имён в CASE-инструментарии. + "parentModelName": null, // Название родительской модели. + "parentClassName": null, // Название родительского класса в CASE-инструментарии. + "attrs": [ // Описание атрибутов модели. + { + "name": "enum1Field", // Название атрибута. + "type": "neo-platform-gen-test-enum1-type", // Тип атрибута (в данном случае это перечисление). + "flexberryType": "Enum1Type", // Тип атрибута в CASE-инструментарии. + "notNull": true, // Допустимы ли null-значения. + "defaultValue": "FirstValue", // Значение атрибута по умолчанию. + "stored": true, // Хранимый ли атрибут. + "ordered": false // Является ли данный атрибут order-атрибутом. + } + ], + "belongsTo": [ // belongsTo связи (мастера). + { + "polymorphic": false, + "presence": true, + "name": "masterForAgregator", // + "relatedTo": "neo-platform-gen-test-master-for-agregator", + "inverse": null + }, + ... + ], + "hasMany": [ // hasMany связи (детейлы). + { + "name": "detailForAgregator", + "relatedTo": "neo-platform-gen-test-detail-for-agregator", + "inverse": "myAgregator" + } + ], + "projections": [ // Описание проекций (представлений). + { + "name": "AgregatorClassE", + "modelName": "neo-platform-gen-test-agregator-class", + "attrs": [ + { + "name": "enum1Field", + "caption": "Перечисление 1", + "hidden": false, + "index": 0 + } + ], + "belongsTo": [ + { + "lookupValue": "DateTimeField", + "lookupValueField": "dateTimeField", + "relationName": "Child2", + "belongsTo": [], + "hidden": false, + "attrs": [ + { + "name": "dateTimeField", + "caption": "~", + "hidden": true, + "index": 2 + } + ], + "index": 1, + "type": "standard", + "caption": "Мастер потомок", + "name": "child2", + "relatedTo": "neo-platform-gen-test-child2", + "inverse": null + }, + ... + ], + "hasMany": [ + { + "projectionName": "DetailForAgregatorE", + "caption": "Детейл агрегатора", + "name": "detailForAgregator", + "relatedTo": "neo-platform-gen-test-detail-for-agregator", + "inverse": null + } + ] + }, + ... + ], + "stored": true, + "offline": true, + "external": false +} +``` + +## Генерация фронтенда. Блюпринты для генерации. Дефолтные блюпринты + +Как уже отмечалось, генерация приложений Flexberry Ember основана на [технологии Blueprints](https://ember-cli.com/api/classes/blueprint), встроенной в EmberJS, для чего требуются специального вида метаданные. Блюпринты - это по сути инструмент для кодогенерации в Ember, также его можно использовать для внесения изменений в код при установке [ember-аддонов](https://cli.emberjs.com/release/writing-addons) и доустановки нужных пакетов. + +Список реализованных блюпринтов для технологии Flexberry Ember можно посмотреть [в исходном коде](https://github.com/Flexberry/ember-flexberry/tree/develop/blueprints). + +[Блюпринт `ember-flexberry`](https://github.com/Flexberry/ember-flexberry/tree/develop/blueprints/ember-flexberry) - это [стандартный блюпринт аддона](https://cli.emberjs.com/release/writing-addons/addon-blueprints/), который вызывается при установке этого аддона в приложение командой. Данный блюпринт вставляет в некоторые файлы код для настройки аддона `ember-flexberry` и устанавливает зависимости аддона. + +```git +ember install ember-flexberry +``` + +Вызов [других блюпринтов для генерации](https://github.com/Flexberry/ember-flexberry/tree/develop/blueprints) рассмотрен ниже. + +### Генерация форм, унаследованных от базового класса + +Если приложение требует генерации форм, унаследованных от их базовых классов, необходимо в папке `vendor/flexberry/` создать директорию с именем `custom-generator-options` и создать в ней файл `generator-options.json` следующего вида: + +```JSON +{ + "editForms": { + "defaultForm": { + "baseRoute": { + "name": "EditFormRoute", + "path": "ember-flexberry/routes/edit-form" + }, + "baseController": { + "name": "EditFormController", + "path": "ember-flexberry/controllers/edit-form" + } + } + }, + "listForms": { + "defaultForm": { + "baseRoute": { + "name": "ListFormRoute", + "path": "ember-flexberry/routes/list-form" + }, + "baseController": { + "name": "ListFormController", + "path": "ember-flexberry/controllers/list-form" + } + } + } +} +``` + +Файл `generator-options.json` определяет имена и расположения файлов, от которых будут наследоваться списковые формы и формы редактирования. + +## Генерация клиентского приложения из командной строки + +Для генерации клиентского приложения из командной строки доступны следующие команды: + +{% include important.html content="В зависимости от используемой операционной системы может потребоваться в командах ниже заменить обратный косой слеш ('\\') на косой слеш ('/')." %} + +* Команды для генерации приложения по метаданным + +```git +ember g flexberry-application app --metadata-dir=vendor\flexberry +``` + +`vendor\flexberry` - это путь до папки с метаданными и может быть иным в конкретном случае. + +Доступные флаги: + +* `--dummy` - генерация [форм](efd3_form.html) и [моделей](efd3_model.html) в аддон (в дамми-приложение). +* `--new-theme=true` - генерация приложения с новой темой оформления (ghost) (доступно, начиная с ember-flexberry@3.4.0). +* `--skip-confirmation` - пропуск запросов на подтверждение перезаписи файлов в случае, когда блюпринт пытается добавить уже существующий файл. + +Алгоритм генерации нового Flexberry Ember приложения из командной строки: + +1.Создать новую папку +2.Выполнить в ней команду [`ember init`](https://cli.emberjs.com/release/advanced-use/cli-commands-reference/#emberinit). + +Если нужно сгенерировать приложение на версии ember, отличной от той, которая установлена глобально, то можно после создания новой папки для приложения сначала установить в нее ember нужной версии (`npm install ember-cli@версия` или `yarn add ember-cli@версия`), а потом уже вызывать [`ember init`](https://cli.emberjs.com/release/advanced-use/cli-commands-reference/#emberinit). + +4.Сгенерировать в эту папку только метаданные из [Flexberry Designer](fd_flexberry-designer.html) +5.Выполнить в этой папке команду: + +```git +ember g flexberry-application app --metadata-dir=<относительный путь к папке с метаданными> --skip-confirmation +``` + +* Генерация навигационного меню (сайтмапа) для приложения + +```git +ember g flexberry-core sitemap --metadata-dir=vendor\flexberry --file=sitemap.json +``` + +* Генерация [модели](efd3_model.html) ([модель](efd3_model.html) и [сериалайзеры](efd3_serializer.html)): + +```git +ember g flexberry-model ${modelName} --metadata-dir=vendor\flexberry --file=${modelName}.json +ember g flexberry-model-init ${modelName} --metadata-dir=vendor\flexberry --file=${modelName}.json +ember g flexberry-serializer-init ${modelName} --metadata-dir=vendor\flexberry --file=${modelName}.json +``` + +В сгенерированно приложении [модели](efd3_model.html) и [сериалайзеры](efd3_serializer.html) [состоят из двух частей](efd3_generated-app-structure.html): одна часть в соответствующей папке (`app/models` или `app/serializers`), а вторая - вынесена в [миксин](https://api.emberjs.com/ember/3.1/classes/Mixin) (`app/mixins/regenerated/models` или `app/mixins/regenerated/serializers`). + +Блюпринт `flexberry-model` генерирует ту часть [моделей](efd3_model.html) и [сериалайзеров](efd3_serializer.html), которые находятся в папке `app/mixins/regenerated/models` и `app/mixins/regenerated/serializers` и постоянно подвергаются [перегенерации](efd3_generated-app-regeneration.html). +Блюпринт `flexberry-model-init` - часть [модели](efd3_model.html) из `app/models`. +Блюпринт `flexberry-serializer-init` - часть [сериалайзера](efd3_model.html) из `app/serializers`. + +* Генерация [списковых форм](efd3_listform.html) (форма и тесты): + +```git +ember g flexberry-list-form ${modelName}-l --metadata-dir=vendor\flexberry --file=${modelName}-l.json +ember g controller-test ${modelName}-l --metadata-dir=vendor\flexberry --file=${modelName}-l.json +ember g route-test ${modelName}-l --metadata-dir=vendor\flexberry --file=${modelName}-l.json +``` + +6.Генерация [форм редактирования](efd3_editform.html) (форма и тесты): + +```git +ember g flexberry-edit-form ${modelName}-e --metadata-dir=vendor\flexberry --file=${modelName}-e.json +ember g controller-test ${modelName}-e --metadata-dir=vendor\flexberry --file=${modelName}-e.json +ember g route-test ${modelName}-e --metadata-dir=vendor\flexberry --file=${modelName}-e.json +``` + +Везде выше в командах `${modelName}` - это имя модели из метаданных. +Например, если модель называется "customer", то последняя команда из списка будет выглядеть так: + +```git +ember g route-test customer-e --metadata-dir=vendor\flexberry --file=customer-e.json +``` + +> В случае, если пользователь изменил названия форм во [Flexberry Designer](fd_flexberry-designer.html) или создал их вручную, то имена форм будут отличаться от ${modelName}-l и ${modelName}-e. + +## Генерация бакенда + +Для генерации бакенда можно воспользоваться меню плагина генерации для Flexberry Ember во [Flexberry Designer](fd_flexberry-designer.html): "вызов контекстного меню стадии -> `Backend` -> `ASP.NET`", при этом будет сгенерирован как проект с объектами данных, так и проект с [ODataService](fo_orm-odata-service.html) на базе ASP.NET Web API (перед генерацией дополнительно нужно проверить, что была настроена [карта типов для бакенда](fd_types-map.html)). + +Чтобы открыть каталог со [сгенерированным проектом](efd3_generated-app-structure.html), нужно в меню выбрать: "вызов контекстного меню стадии -> `Backend` -> `Открыть каталог`" (каталог для генерации определяется, исходя из настроек [Flexberry Designer](fd_flexberry-designer.html) (задаётся общая папка для генерации) и [настроек стадии](fd_project-customization.html) (чаще задаётся относительный путь от общей папки)). + +Можно проект сразу открыть в Visual Studio, для этого: "вызов контекстного меню стадии -> `Backend` -> `Открыть в Visual Studio...`". + +> После открытия [сгенерированного из Flexberry Designer проекта с бакендом](efd3_generated-app-structure.html) может оказаться, что в качестве проекта для запуска настроен проект с объектами данных. Эту настройку следует изменить: найти проект с OData -> вызов контекстного меню проекта -> `Set as startup project`. Также могут потребоваться [другие настройки окружения](efd3_generated-app-start.html), чтобы [запустить бакенд](efd3_generated-app-start.html). Основные особенности настройки ODataService указаны в [этой статье](fo_orm-odata-service.html). + +## Установка пакета ODataService «вручную» в приложение ASP.NET Web API + +Существует возможность [установить пакет ODataService «вручную»](fo_orm-odata-service.html) в приложение ASP.NET Web API (и таким образом получить Flexberry Ember бакенд). Ниже будет рассмотрен пример, когда сгенерированный по диаграмме классов проект с объектами данных будет подключён к приложению ASP.NET Web API и будет настроена работа через OData, чтобы клиентское Flexberry Ember-приложение могло получать с него данные. + +Для этого требуется сделать следующее: + +* Создать приложение ASP.NET Web API. + +![Выбор типа проекта](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-chooseprojecttype.png) + +* Задать название проекта. + +![Задание названия проекта](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-createproject.png) + +{% include important.html content="Поскольку проект с объектами данных сгенерирован для .Net Framework 4.5, то и у создаваемого проекта следует выбрать такой же фреймворк." %} + +* Выбрать тип проекта Web API. + +![Выбор типа проекта](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-webapi.png) + +* Добавить в созданный Solution проект с объектами данных. + +![Добавление в созданный Solution проекта с объектами данных](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addexistingproject.png) + +* Добавить проектную ссылку из проекта ASP.NET Web API на добавленный проект с объектами данных. + +![Добавление проектной ссылки](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addprojectreference.png) + +* Установить необходимые [Flexberry Nuget-пакеты](flexberry-nuget-packages.html). Это можно сделать, например, через менеджер пакетов в студии (версии пакетов должны соответствовать используемым в проекте с объектами). + * [NewPlatform.Flexberry.AspNet.WebApi.Cors](https://www.nuget.org/packages/NewPlatform.Flexberry.AspNet.WebApi.Cors/) + * [NewPlatform.Flexberry.LockService](https://www.nuget.org/packages/NewPlatform.Flexberry.LockService) + * [NewPlatform.Flexberry.LogService](fo_log-service-log4net.html) + * [NewPlatform.Flexberry.LogService.Objects](https://www.nuget.org/packages/NewPlatform.Flexberry.LogService.Objects) + * [NewPlatform.Flexberry.ORM](fo_flexberry-orm.html) + * [NewPlatform.Flexberry.ORM.ODataService](fo_orm-odata-service.html) + * [NewPlatform.Flexberry.UserSettingsService](https://www.nuget.org/packages/NewPlatform.Flexberry.UserSettingsService) + +![Установленные Flexberry Nuget-пакеты](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedflexberry.png) + +* Установить при необходимости проект Unity.AspNet.WebApi. + +![Установленные Unity Nuget-пакеты](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-installedunity.png) + +* Удалить лишние автосгенерированные элементы в проекте. + +![Удаление лишних автосгенерированных элементов в проекте](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeextras.png) + +* Добавить в проект ODataConfig. + +![Выбор типа проекта](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-addodataconfig.png) + +```cs +namespace ManualOdataAddingTest +{ + using System; + using System.Reflection; + using System.Web.Http; + + using ICSSoft.STORMNET; + using ICSSoft.Services; + using IIS.Caseberry.Logging.Objects; + + using NewPlatform.Flexberry; + using NewPlatform.Flexberry.AspNet.WebApi.Cors; + using NewPlatform.Flexberry.ORM.ODataService; + using NewPlatform.Flexberry.ORM.ODataService.Extensions; + using NewPlatform.Flexberry.ORM.ODataService.Functions; + using NewPlatform.Flexberry.ORM.ODataService.Model; + using NewPlatform.Flexberry.Services; + + using Unity; + using Unity.AspNet.WebApi; + + internal static class ODataConfig + { + public static void Configure(HttpConfiguration config, IUnityContainer container, HttpServer httpServer) + { + if (config == null) + { + throw new ArgumentNullException("config"); + } + + if (container == null) + { + throw new ArgumentNullException("container"); + } + + config.EnableCors(new DynamicCorsPolicyProvider()); + config.DependencyResolver = new UnityDependencyResolver(container); + var assemblies = new[] + { + Assembly.Load("GenTest.Objects"), + typeof(ApplicationLog).Assembly, + typeof(UserSetting).Assembly, + typeof(FlexberryUserSetting).Assembly, + typeof(Lock).Assembly + }; + + var builder = new DefaultDataObjectEdmModelBuilder(assemblies); + var token = config.MapODataServiceDataObjectRoute(builder, httpServer); + token.Functions.Register(new Func(Test)); + token.Events.CallbackAfterCreate = CallbackAfterCreate; + } + + private static void CallbackAfterCreate(DataObject dataObject) + { + } + + private static string Test(QueryParameters queryParameters) + { + return "Hello world!"; + } + } +} +``` + +`Assembly.Load("GenTest.Objects")` - загрузка сборки с объектами из подключенного проекта. + +* Изменить содержимое Global.asax.cs + +```cs +namespace ManualOdataAddingTest +{ + using System; + using System.Web; + using System.Web.Http; + + using ICSSoft.STORMNET.Business; + + using Microsoft.Practices.Unity.Configuration; + using Unity; + + public class Global : HttpApplication + { + protected void Application_Start(object sender, EventArgs e) + { + IUnityContainer container = new UnityContainer(); + container.LoadConfiguration(); + container.RegisterInstance(DataServiceProvider.DataService); + GlobalConfiguration.Configure(configuration => ODataConfig.Configure(configuration, container, GlobalConfiguration.DefaultServer)); + } + } +} + +``` + +* Изменить содержимое представления Global.asax + +```cs +<%@ Application Codebehind="Global.asax.cs" Inherits="ManualOdataAddingTest.Global" Language="C#" %> +``` + +* Удалить из файла конфигурации Web.config настройки, связанные с Oracle. + +![Настройки, связанные с Oracle, в файле конфигурации Web.config](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-removeoracle.png) + +* Заменить в файле конфигурации Web.config секцию `appSettings` и добавить секцию `connectionStrings` (в случае, если используется БД, отличная от Postgres, то значения настроек будут несколько отличаться). + +```xml +{% raw %} + + + + + + + +{% endraw %} +``` + +* Заменить в файле конфигурации Web.config секцию `unity` (в случае, если используется БД, отличная от Postgres, то значения настроек будут несколько отличаться). + +```xml +{% raw %} + + + + + + + + +{% endraw %} +``` + +* Запустить проект, который после запуска вернёт сообщение "403" (адрес запуска проекта [можно изменить](efd3_generated-app-start)). + +![Ошибка 403 на запущенном проекте](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-forbidden.png) + +* Перейти по адресу `/odata` и удостовериться, что [OData API](efd3_generated-app-start) функционирует. + +![Получение доступа к OData](/images/pages/products/flexberry-ember/ember-flexberry/generation/FEOdata-viewodata.png) + +> При настройке проекта вручную нужно соблюдть согласованность версий .Net Framework, Nuget-пакетов и прочего. При генерации проекта эти заботы на себя берёт [Flexberry Designer](fd_flexberry-designer.html). diff --git a/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-regeneration.ru.md b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-regeneration.ru.md new file mode 100644 index 000000000..2a33aedbb --- /dev/null +++ b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-regeneration.ru.md @@ -0,0 +1,54 @@ +--- +title: Перегенерация приложений +sidebar: flexberry-ember-3_sidebar +keywords: Flexberry Ember +toc: true +permalink: ru/efd3_generated-app-regeneration.html +lang: ru +summary: Обзор возможностей перегенерации сгенерированных приложений +--- + +> Изменять настройки объектов данных (представления, названия полей, новые классы, связи и прочее), форм и всего приложения настоятельно рекомендуется во [Flexberry Designer](fd_flexberry-designer.html), эти изменения при перегенерации могут идти как в клиентское, так и серверное приложение. Однако изменения средствами [Flexberry Designer](fd_flexberry-designer.html) способны затереть пользовательский код. + +## Правила перегенерации серверного приложения + +Серверное приложение состоит из объектов данных и непосредственно OData-бакенда. +Весь пользовательский код в объектах данных следует располагать в [скобки программиста](fo_programmer-brackets.html), чтобы он не был затёрт при перегенерации. Для OData-бакенда такого механизма не предусмотрено. + +Для перегенерации серверного приложения из меню стадии следует выбрать `Ember -> Backend -> ASP.Net -> Генерировать`. + +![Перегенерация серверного приложения из Flexberry Designer](/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend.png) + +В настоящее время не существует способа перегенерации отдельных классов на бэкенде, поэтому она запускается целиком для всех классов. Однако можно запустить перегенерацию не всего серверного приложения, а исключительно объектов данных или непосредственно OData-бакенда. + +![Выбор перегенерируемой части серверного приложения из Flexberry Designer](/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-backend-choise.png) + +## Правила перегенерации клиентского приложения + +Нужно всегда четко понимать, какие файлы затрагивает перегенерация того или иного класса. + +При перегенерации модели перезаписываются метаданные в папке `vendor/flexberry` сгенерированного Ember-приложения, [модель](efd3_model.html) и [сериализатор](efd3_serializer.html) в папке `mixins/regererated`, а также [модель](efd3_model.html) в папке `app/models`. + +При перегенерации формы изменяются метаданные в папке `vendor/flexberry` сгенерированного Ember-приложения, а также соответствующие [контроллер, роут, шаблон и файлы локализации](efd3_form.html). + +Любые способы перегенерации могут повредить пользовательские изменения в исходном коде. Не рекомендуется производить перегенерацию, особенно, перегенерацию приложения целиком, непосредственно в папку проекта: рекомендуется сгенерировать приложение в стороннюю папку и оттуда перенести нужные изменения в проект, или генерировать только метаданные, а по ним при помощи соответствующих команд генерации из командной строки изменять требуемые файлы приложения. + +> Не запускать перегенерацию клиентского приложения без уверенности, что это не затрет сделанные ранее изменения в исходном коде. В случае, если нужный пользовательский код всё-таки был затерт при перегенерации, рекомендуется откатить соответствующие изменения средствами системы контроля версий и выполнить повторную перегенерацию согласно изложенным инструкциям. + +Для выполнения полной перегенерации клиентского приложения из [Flexberry Designer](fd_flexberry-designer.html), можно воспользоваться контекстным меню стадии `Ember -> Frontend -> EmberJS -> Генерировать всё` (либо выполнить команду `Генерировать метаданные`, после чего [перегенерировать приложение из командной строки](efd3_app_generation.html)). + +![Перегенерация клиентского приложения из Flexberry Designer](/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend-full.png) + +### Перегенерация отдельных моделей и форм + +Средствами [Flexberry Designer](fd_flexberry-designer.html) доступна перегенерация отдельных моделей и форм, для этого у соответствующего элемента на диаграмме трубуется выбрать в контекстном меню пункт `Генерировать frontend`. + +![Перегенерация отдельного класса клиентского приложения из Flexberry Designer](/images/pages/products/flexberry-ember/ember-flexberry/generation/FE-regenerate-frontend.png) + +> Из-за особенностей отображения проекций в [моделях](efd3_model.html) если, например, во [Flexberry Designer](fd_flexberry-designer.html) было изменено представление детейла, то требуется перегенерация как детейлового класса, так и класса-агрегатора. + +Также перегенерация отдельных моделей и форм возможна посредством специальных команд командной строки. + +### Использование дополнительных команд командной строки для перегенерации нескольких моделей и форм + +В настоящий момент, помимо [возможности генерации из командной строки](efd3_app-generation.html), ведётся доработка дополнительных команд командной строки для перегенерации нескольких [моделей](efd3_model.html) и [форм](efd3_form.html) одновременно. diff --git a/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-start.ru.md b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-start.ru.md new file mode 100644 index 000000000..2e7603958 --- /dev/null +++ b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-start.ru.md @@ -0,0 +1,420 @@ +--- +title: Запуск сгенерированных приложений +sidebar: flexberry-ember-3_sidebar +keywords: Flexberry Ember +toc: true +permalink: ru/efd3_generated-app-start.html +lang: ru +summary: Обзор особенностей настройки и запуска сгенерированных приложений. +--- + +## Настройка Flexberry Ember-приложений +Для запуска сгенерированных приложений может потребоваться дополнительная настройка. + +### Настройка OData-бакенда +Для того, чтобы запустить бакенд, нужно открыть сгенерированный файл с расширением `sln`, который находится в папке со сгенерированным из [Flexberry Designer](fd_flexberry-designer.html) решением, в среде разработки Visual Studio. По умолчанию проектом для запуска в сгенерированном решении может являться проект с объектами данных. Чтобы приложение запустилось, требуется назначить проектом для запуска `ODataBackend`. + +Далее в файле `ODataConfig` требуется раскомментировать строчку + +```csharp +config.EnableCors(new DynamicCorsPolicyProvider()); +``` + +![Включение корсов в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-cors-enabling.png) + +По умолчанию проект запустится по адресу `http://localhost:6500/`. Изменить эту настройку можно в свойствах проекта (правая кнопка мыши на проекте `ODataBackend` -> Properties -> Вкладка `Web` -> Раздел `Servers`). + +![Изменение хоста, порта, базового роута для OData-бакенда в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-url-changing.png) + +После генерации OData-бакенд содержит файл конфигурации `Web.config` со следующими настройками, которые можно при необходимости менять + +```xml + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + ... + + + ... + + + + + ... + + + + + + + + + + + + + + + +``` + +{% include important.html content="Более сложные варианты настройки OdataService указаны в [этой статье](fo_orm-odata-service.html)." %} + +### Настройка клиентского приложения +Открыть `фронтенд`-часть приложения можно в `Visual Studio Code`, для этого нужно открыть папку `ember-app` внутри папки со сгенерированным из `Flexberry Designer` приложением (можно это сделать, выбрав пункт меню `File` → `Open folder`). + +После генерации клиентское приложение содержит файл конфигурации `environment.js`. + +![Файлы конфигурации в сгенерированном клиентском `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-frontend-config.png) + +``` js +'use strict'; + +module.exports = function(environment) { + // Адрес OData-бакенда. + var backendUrl = 'http://localhost:6500'; + + // Возможна работа с локальной БД, тогда для запуска следует использовать `ember s -e development-loc`. + if (environment === 'development-loc') { + // Адрес OData-бакенда при работе с локальной БД. + backendUrl = 'http://localhost:6500'; + } + + // Настройки приложения, аналогичны настройкам Ember. + let ENV = { + modulePrefix: 'ember-app', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: ... + }, + + APP: { + // Имя приложения, используется сервисом пользовательских настроек. + name: 'ember-app', + + // Адрес OData-бакенда. + backendUrl: backendUrl, + + // Адрес OData-бакенда, через который непосредственно делаются запросы. + backendUrls: { + root: backendUrl, + api: backendUrl + '/odata' + }, + + // Настройки логирования. + log: { ... }, + + // Настройки сервиса оценки скорости рендеринга компонент. + perf: { ... }, + + // Настройки сервиса блокировок. + lock: { ... }, + + // Флаг, использовать ли сервис пользовательских настроек. + useUserSettingsService: true, + + // Флаг, использовать ли сервис задания ограничений. + useAdvLimitService: true, + + // Настройки для работы в офлайн-режиме. + offline: { ... }, + + // Настройки работы некоторых Flexberry Ember-компонент. + components: { ... }, + } + }; + + // Настройки CSP: + // http://www.ember-cli.com/#content-security-policy + // https://github.com/rwjblue/ember-cli-content-security-policy + // http://content-security-policy.com + ENV.contentSecurityPolicy = { ... }; + + // Настройки ember-i18n: https://github.com/jamesarosen/ember-i18n. + ENV.i18n = { + // Локализация по умолчанию. + defaultLocale: 'ru' + }; + + // Настройки ember-moment: https://github.com/stefanpenner/ember-moment. + ENV.moment = { + outputFormat: 'L' + }; + + // Настройки для режима разработки. + if (environment === 'development') { ... } + + // Настройки для режима тестирования. + if (environment === 'test') { ... } + + // Настройки для режима работы развёрнутого для пользователей приложения. + if (environment === 'production') { ... } + + return ENV; +}; +``` + +* `ENV.locationType` - [режим формирования URL для приложения](efd3_router.html). +* `ENV.APP.log` - настройки [сервиса логирования](efd3_log-service.html). +* `ENV.APP.lock` - настройки [сервиса пессимистических блокировок](efd3_editform.html). +* `ENV.APP.offline` - настройки для работы [в офлайн-режиме](). +* `ENV.APP.useUserSettingsService` - флаг, определяющий работу [сервиса пользовательских настроек](). +* `ENV.APP.useAdvLimitService` - флаг, определяющий работу [сервиса задания ограничений](). + +Файл конфигурации `targets.js` полностью идентичен генерируемому `Ember` файлу, в нём указаны настройки для [транспилятора Babel](https://babeljs.io/). + +Настройку хоста и порта для запуска приложения можно осуществить, как прописав соответствующие опции в файл `.ember-cli`, так и указав их непосредственно в командной строке (доступные опции можно узнать, выполнив команду `ember s --help` в командной строке). + +## Запуск приложений +OData-бакенд и клиентское Ember-приложение можно запускать в произвольном порядке, однако предпочтительнее сначала запустить OData-бакенд, после чего в браузере открывать клиентское приложение. + +### Запуск OData-бакенда +Для запуска настроенного OData-бакенда в `Visual studio` нужно нажать `Ctrl+F5` или выбрать пункт меню `Debug` → `Start Without Debugging`. При успешном запуске приложения в браузере, назначенном по умолчанию в `Visual Studio`, откроется страница с кодом 403.14 - Forbidden. + +Для проверки, что сгенерированный API доступен, можно добавить к URL `/odata`. + +![Проверка доступности OData API в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/backend-API.png) + +### Запуск клиентского приложения +Можно запустить сгенерированное настроенное клиентское приложение в `Visual Studio Code`. Для этого следует открыть терминал `Terminal` -> `New terminal`. + +![Запуск терминала в `Visual Studio Code`](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-start-terminal.png) + +В запущенном терминале следует выполнить команду `ember server`. + +Если сборка приложения завершилась успешно, то в терминале появится соответствующее сообщение, а также ссылка, по которой можно открыть запущенное приложение. + +![Успешный запуск клиентского приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-build-success.png) + +После открытия ссылки можно увидеть примерно следующее: + +![Запущенное клиентское приложение](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-started.png) + +## Обзор функционала клиентского приложения +Сгенерированное клиентское приложение предоставляет следующие возможности. + +* Меню клиентского приложения соответствует структуре, заданной во [Flexberry Designer](fd_flexberry-designer.html) в классе со стереотипом `application`. + +![Меню клиентского приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-menu.png) + +* Доступны [списки объектов данных](efd3_listform.html), куда есть возможность добавлять новые записи (во [Flexberry Designer](fd_flexberry-designer.html) спискам соответствуют классы со стереотипом `listform`). + +![Пустая списковая форма клиентского приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-empty-listform.png) + +* При [добавлении или редактировании новой записи](efd3_editform.html) (это происходит на форме, соответствующей классу со стереотипом `editform` во [Flexberry Designer](fd_flexberry-designer.html)) для разных типов данных используются соответствующие компоненты. + +![Форма создания с перечислением](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-enum.png) + +![Форма создания с детейлами](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-editform-with-details.png) + +* На [формах создания и редактирования](efd3_editform.html) работают встроенные типичные правила [валидации данных](efd3_model-validation.html) + +![Форма создания с перечислением](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-validation.png) + +* При добавлении новой записи происходит переадресация [с формы создания на форму редактирования]((efd3_editform.html)) + +![Форма редактирования](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-master.png) + +* Добавленные записи отображаются на соответствующей [списковой форме](efd3_listform.html) + +![Списковая форма](/images/pages/products/flexberry-ember/ember-flexberry/generation/frontend-saved-masters.png) + +## Обзор функционала OData API + +После запуска OData-бакенда по адресу `http://localhost:6500/odata/` отображается доступный API (адрес может быть изменён в настройках). + +### Получение всех записей + +Для отображения всех записей, например, типа `IISGenTestMasterForAgregator`, можно в браузере ввести +`http://localhost:6500/odata/IISGenTestMasterForAgregators` (при этом в конце имени типа следует добавить символ `s`), тогда придёт ответ: + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestMasterForAgregators","value":[ + { + "Enum2Field":"ValueSecond","__PrimaryKey":"6213c156-b061-4287-8275-b8533d9ecf7a" + },{ + "Enum2Field":"ValueFirst","__PrimaryKey":"2ea43483-19db-4474-b523-426fec183aed" + },{ + "Enum2Field":"ValueThird","__PrimaryKey":"fa621409-c381-41a1-b1ae-6767e404a99f" + } + ] +} +``` + +### Получение данных списковой формы + +Для получения данных для [списковой формы](efd3_listform.html) на OData-бакенд идёт запрос вида + +``` +http://localhost:6500/odata/IISGenTestChild2s? + $count=true + &$select=__PrimaryKey,DateTimeField,ParentField + &$skip=0 + &$top=5 +``` + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestChild2s(__PrimaryKey,DateTimeField,ParentField)","@odata.count":1,"value":[ + { + "__PrimaryKey":"fe3325bf-c633-4661-ad6f-bba7eb24b46d","DateTimeField":"2020-09-30T19:30:55.112+05:00","ParentField":23 + } + ] +} +``` + +* `http://localhost:6500/odata/IISGenTestChild2s` - указание запрашиваемого типа, +* `$count=true` - указание, что следует вернуть метаданные о количестве возвращённых записей (в ответе: `"@odata.count":1`), +* `$select=__PrimaryKey,DateTimeField,ParentField` - указание, что требуется вернуть поля `__PrimaryKey`, `DateTimeField` и `ParentField` (в ответе: `"@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestChild2s(__PrimaryKey,DateTimeField,ParentField)"`), +* `$skip=0` - указание, что записи следует возвращать, начиная с нулевой (фактически, пропускаем 0 записей с начала), +* `$top=5` - указание, что следует вернуть 5 записей. + +Если на [списковой форме](efd3_listform.html) отображаются поля мастера, то запрос будет иметь вид + +``` +http://localhost:6500/odata/IISGenTestChild1s? + $count=true + &$expand=MyMaster($select=__PrimaryKey,IntField) + &$select=__PrimaryKey,DoubleField,StringField,ParentField,MyMaster + &$skip=0 + &$top=5 +``` + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestChild1s(__PrimaryKey,DoubleField,StringField,ParentField,MyMaster,MyMaster(__PrimaryKey,IntField))","@odata.count":1,"value":[ + { + "__PrimaryKey":"aa447992-c783-41d3-80f0-c78ae200a881","DoubleField":1.0,"StringField":"\u0421\u0442\u0440\u043e\u043a\u0430","ParentField":33,"MyMaster":{ + "__PrimaryKey":"3235b1d9-66a9-4ee2-9698-faaa7465b1d0","IntField":12 + } + } + ] +} +``` + +В отличие от предыдущего примера здесь через `$expand` запрашиваются поля `__PrimaryKey` и `IntField` связанной по связи `MyMaster` сущности (`$expand=MyMaster($select=__PrimaryKey,IntField)`). + +### Получение данных формы редактирования + +Для получения данных для [формы редактирования](efd3_editform.html) на OData-бакенд идёт запрос вида + +``` +http://localhost:6500/odata/IISGenTestChild2s? + $filter=__PrimaryKey%20eq%20fe3325bf-c633-4661-ad6f-bba7eb24b46d + &$select=__PrimaryKey,DateTimeField,ParentField +``` + +Для отображения только требуемой записи накладывается фильтр, что [первичный ключ](efd3_model.html) должен иметь заданное значение (`filter=__PrimaryKey%20eq%20fe3325bf-c633-4661-ad6f-bba7eb24b46d`). + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestChild2s(__PrimaryKey,DateTimeField,ParentField)","value":[ + { + "__PrimaryKey":"fe3325bf-c633-4661-ad6f-bba7eb24b46d","DateTimeField":"2020-09-30T19:30:55.112+05:00","ParentField":23 + } + ] +} +``` + +Если у записи требуется получить как мастера, так и детейлы, то запрос будет иметь вид + +``` +http://localhost:6500/odata/IISGenTestChild1s? + $expand=MyMaster($select=__PrimaryKey,IntField), + Detail1ForChild1($select=__PrimaryKey,IntFieldWithValue1), + Detail2ForChild1($select=__PrimaryKey,IntFieldWithValue) + &$filter=__PrimaryKey%20eq%20aa447992-c783-41d3-80f0-c78ae200a881 + &$select=__PrimaryKey,DoubleField,StringField,ParentField,MyMaster,Detail1ForChild1,Detail2ForChild1 +``` + +Через `$expand` запрашиваются поля связанных по связям `MyMaster` (мастеровая связь), `Detail1ForChild1` (детейловая связь), `Detail2ForChild1` (детейловая связь) сущностей (`$expand=MyMaster($select=__PrimaryKey,IntField),Detail1ForChild1($select=__PrimaryKey,IntFieldWithValue1),Detail2ForChild1($select=__PrimaryKey,IntFieldWithValue)`). + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestChild1s(__PrimaryKey,DoubleField,StringField,ParentField,MyMaster,Detail1ForChild1,Detail2ForChild1,MyMaster(__PrimaryKey,IntField),Detail1ForChild1(__PrimaryKey,IntFieldWithValue1),Detail2ForChild1(__PrimaryKey,IntFieldWithValue))","value":[ + { + "__PrimaryKey":"aa447992-c783-41d3-80f0-c78ae200a881","DoubleField":1.0,"StringField":"\u0421\u0442\u0440\u043e\u043a\u0430","ParentField":33,"MyMaster":{ + "__PrimaryKey":"3235b1d9-66a9-4ee2-9698-faaa7465b1d0","IntField":12 + },"Detail1ForChild1":[ + { + "__PrimaryKey":"7f6dc423-2e43-4d55-8b6f-0468eddc4ba2","IntFieldWithValue1":1 + },{ + "__PrimaryKey":"706dc254-ac6f-4321-8d17-b253a4435c11","IntFieldWithValue1":11 + } + ],"Detail2ForChild1":[ + { + "__PrimaryKey":"35436532-ace0-4723-b043-0e8c52d1cb84","IntFieldWithValue":2 + } + ] + } + ] +} +``` + +Если у записи два мастера (`Child2`, `MasterForAgregator`), а детейл (`DetailForAgregator`) также имеет мастеровую связь (`MasterForAgregator`), то запрос происходит полностью аналогично с увеличением уровня вложенности + +``` +http://localhost:6500/odata/IISGenTestAgregatorClasss? + $expand=Child2($select=__PrimaryKey,DateTimeField), + MasterForAgregator($select=__PrimaryKey,Enum2Field), + DetailForAgregator($select=__PrimaryKey,DetailIntField,MasterForAgregator; + $expand=MasterForAgregator($select=__PrimaryKey,Enum2Field)) + &$filter=__PrimaryKey%20eq%200ca7f760-2b1d-4be1-9659-be0bf6ab7faa + &$select=__PrimaryKey,Enum1Field,Child2,MasterForAgregator,DetailForAgregator +``` + +```json +{ + "@odata.context":"http://localhost:6500/odata/$metadata#IISGenTestAgregatorClasss(__PrimaryKey,Enum1Field,Child2,MasterForAgregator,DetailForAgregator,Child2(__PrimaryKey,DateTimeField),MasterForAgregator(__PrimaryKey,Enum2Field),DetailForAgregator(__PrimaryKey,DetailIntField,MasterForAgregator,MasterForAgregator(__PrimaryKey,Enum2Field)))","value":[ + { + "__PrimaryKey":"0ca7f760-2b1d-4be1-9659-be0bf6ab7faa","Enum1Field":"FirstValue","Child2":{ + "__PrimaryKey":"fe3325bf-c633-4661-ad6f-bba7eb24b46d","DateTimeField":"2020-09-30T19:30:55.112+05:00" + },"MasterForAgregator":{ + "__PrimaryKey":"6213c156-b061-4287-8275-b8533d9ecf7a","Enum2Field":"ValueSecond" + },"DetailForAgregator":[ + { + "__PrimaryKey":"22f03fc5-6e6c-4350-84aa-b0c97299956c","DetailIntField":2,"MasterForAgregator":{ + "__PrimaryKey":"6213c156-b061-4287-8275-b8533d9ecf7a","Enum2Field":"ValueSecond" + } + } + ] + } + ] +} +``` + +{% include note.html content="При обновлении соответствующий запрос на форме создания и редактирования [зависит от изменённых данных](efd3_editform.html)." %} \ No newline at end of file diff --git a/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-structure.ru.md b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-structure.ru.md index ee42d67da..f6bec212e 100644 --- a/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-structure.ru.md +++ b/pages/products/flexberry-ember/3.x/app-generation/efd3_generated-app-structure.ru.md @@ -10,30 +10,30 @@ summary: Обзор структуры сгенерированных клиен В этом разделе рассматривается пример структуры сгенерированного приложения для следующей диаграммы классов: -![Диаграмма классов для рассмотрения сгенерированного `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generation-class-diagram.png). +![Диаграмма классов для рассмотрения сгенерированного `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generation-class-diagram.png) ## Структура сгенерированного клиентского приложения -Структура сгенерированного `Flexberry Ember`-приложения по сути расширяет структуру ["чистого" Ember-приложения](https://guides.emberjs.com/v3.1.0/getting-started/core-concepts/). При генерации `Flexberry Ember`-приложения сначала происходит генерация "чистого" `Ember`-приложения, а затем генерируются дополнительные элементы приложения на осове метаданных, соответствующих спроектированной модели предметной области во [Flexberry Designer](fd_flexberry-designer.html). На скриншоте ниже слева представлена структура "чистого" `Ember`-приложения, полученная при генерации с использованием [инструментов командной строки Ember](https://cli.emberjs.com/), справа - с помощью генерации кода клиентского приложения из [Flexberry Designer](fd_flexberry-designer.html). Как можно заметить, в варианте структуры справа уже установлены bower- и node-модули (из-за установки соответствующих дополнительных пакетов, помимо прочего, генерация из [Flexberry Designer](fd_flexberry-designer.html) может занимать длительное время), а также добавлен файл `theme.config` для осуществления настройки [темы оформления](efd3_themes-structure.html) конкретного приложения. +Структура сгенерированного `Flexberry Ember`-приложения по сути расширяет структуру ["чистого" Ember-приложения](https://guides.emberjs.com/v3.1.0/getting-started/core-concepts/). При генерации `Flexberry Ember`-приложения сначала происходит генерация "чистого" `Ember`-приложения, а затем генерируются дополнительные элементы приложения на основе метаданных, соответствующих спроектированной модели предметной области во [Flexberry Designer](fd_flexberry-designer.html). На скриншоте ниже слева представлена структура "чистого" `Ember`-приложения, полученная при генерации с использованием [инструментов командной строки Ember](https://cli.emberjs.com/), справа - с помощью генерации кода клиентского приложения из [Flexberry Designer](fd_flexberry-designer.html). Как можно заметить, в варианте структуры справа уже установлены bower- и node-модули (из-за установки соответствующих дополнительных пакетов, помимо прочего, генерация из [Flexberry Designer](fd_flexberry-designer.html) может занимать длительное время), а также добавлен файл `theme.config` для осуществления настройки [темы оформления]() конкретного приложения. -![Сравнение структуры «чистого» Ember-приложения и `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-ember-app-compare.png). +![Сравнение структуры «чистого» Ember-приложения и `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-ember-app-compare.png) При сравнении структуры папки `app` (на скриншоте ниже слева представлено "чистое" `Ember`-приложение, справа - `Flexberry Ember`-приложение) также очевидно, что `Flexberry Ember`-приложение содержит дополнительные элементы. -![Cравнение структуры папки APP «чистого» Ember-приложения и `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-ember-app-compare-detailed.png). +![Cравнение структуры папки APP «чистого» Ember-приложения и `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-ember-app-compare-detailed.png) -Далее мы подробнее рассмотрим те элементы `Ember`-приложения, которые генерируются из [Flexberry Designer](fd_flexberry-designer.html). +Далее подробнее будут рассмотрим те элементы `Ember`-приложения, которые генерируются из [Flexberry Designer](fd_flexberry-designer.html). ### Сгенерированные модели -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [модели](efd3_model.html) (папка `models`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [модели](https://guides.emberjs.com/v3.1.0/models/) (папка `models`): ![Модели в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-models.png). -На скриншоте выделены модели, соответствующие [объектам данных](fo_data-object.html) (бизнес-объекты приложения), структура этих моделей описана в [отдельной статье](efd3_model.html). +На скриншоте выделены модели, соответствующие [объектам данных](fo_data-object.html) (бизнес-объекты приложения), структура этих моделей описана в [отдельной статье](efd3_model.html) {% include note.html content="Модели генерируются в папку `models` и именуются следующим образом: если соответствующий C#-класс на [OData-бэкенде](fo_orm-odata-service.html) называется `NewPlatform.Someproject.Somemodel`, то файл с моделью в клиентском приложении должен называться `new-platform-someproject-somemodel`. Если на [OData-бэкенде](fo_orm-odata-service.html) используется атрибут [PublishName](fo_metadata-for-client.html) для упрощения именования моделей, то наименование пространства имен в этом случае в клиентской модели может отсутствовать (имя клиентской модели будет формироваться соответственно имени в EDM-модели на OData-бакенде)" %} -Помимо самих моделей также генерируется файл `custom-inflector-rules.js`, где посредством [Ember Inflector](https://github.com/emberjs/ember-inflector) задаётся соответствие имён моделей в единственном и множественном числе - соответствующие преобразования имен автоматически осуществляются при формировании запросов к серверу (если присмотреться, то можно заметить, что в правилах преобразования указаны последние слова в именах моделей, соответствующих [классам данных](fo_data-object.html)). +Помимо самих моделей также генерируется файл `custom-inflector-rules.js`, где посредством [Ember Inflector](https://github.com/emberjs/ember-inflector) задаётся соответствие имён моделей в единственном и множественном числе - соответствующие преобразования имен автоматически осуществляются при [формировании запросов к серверу](efd3_generated-app-start.html) (если присмотреться, то можно заметить, что в правилах преобразования указаны последние слова в именах моделей, соответствующих [классам данных](fo_data-object.html)). ```javascript import Inflector from 'ember-inflector'; @@ -49,96 +49,96 @@ export default {}; ``` ### Сгенерированные сериализаторы -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [сериализаторы](efd3_serializer.html) (папка `serializers`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [сериализаторы](https://guides.emberjs.com/v3.1.0/models/customizing-serializers/) (папка `serializers`): -![Cериализаторы в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-serializers.png). +![Cериализаторы в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-serializers.png) -Каждой модели соответствует свой [сериализатор](efd3_serializer.html). Для каждой модели также генерируются [офлайн-сериализаторы](efd3_offline-serializer.html) для работы с офлайн-хранилищем. +Каждой модели соответствует свой сериализатор; [в технологии Flexberry Ember сериализаторы имеют свою специфику](efd3_serializer.html). Для каждой модели также генерируются [офлайн-сериализаторы]() для работы с офлайн-хранилищем. ### Сгенерированные миксины -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [миксины](efd3_mixin.html) (папка `mixins`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [миксины](https://api.emberjs.com/ember/3.1/classes/Mixin) (папка `mixins`): -![Миксины в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-mixins.png). +![Миксины в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-mixins.png) -Миксины при генерации добавляются во вложенную папку `regenerated`. При каждом запуске перегенерации из [Flexberry Designer](fd_flexberry-designer.html) данные миксины будут обновлены, что нужно учитывать, чтобы новый программный код не был утерян. В миксины вынесены как части [моделей](efd3_model.html), так и [сериализаторов](efd3_serializer.html), в том числе [офлайн-сериализаторов](efd3_offline-serializer.html). +Миксины при генерации добавляются во вложенную папку `regenerated`. При каждом запуске перегенерации из [Flexberry Designer](fd_flexberry-designer.html) данные миксины будут обновлены, что нужно учитывать, чтобы новый программный код не был утерян. В миксины вынесены как части [моделей](efd3_model.html), так и [сериализаторов](efd3_serializer.html), в том числе [офлайн-сериализаторов](). ### Сгенерированные адаптеры -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [адаптеры](efd3_application-adapter.html) (папка `adapters`), в том числе [адаптер для работы в офлайн-режиме](efd3_application-adapter-ofline.html): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [адаптеры](https://guides.emberjs.com/v3.1.0/models/customizing-adapters/) (папка `adapters`), в том числе [адаптер для работы в офлайн-режиме](): -![Адаптеры в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-adapters.png). +![Адаптеры в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-adapters.png) ### Сгенерированные сервисы -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляется переопределенный [сервис store](efd3_store-service.html) (папка `services`), который позволяет приложению работать как в онлайн-режиме, так и в офлайн-режиме. +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляется [переопределенный сервис store](efd3_service.html) ([папка `services`](https://guides.emberjs.com/v3.1.0/applications/services/#toc_defining-services)), который позволяет приложению работать как в онлайн-режиме, так и в [офлайн-режиме](). -![Сервисы в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-services.png). +![Сервисы в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-services.png) ### Сгенерированные перечисления и трансформации -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [перечисления](efd3_enum.html) (папка `enums`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [перечисления]() (папка `enums`): ![Перечисления в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-enums.png). -Перечисления соответствуют заданным на диаграмме классов сущностям со стереотипом `enumeration`. Поскольку перечисления не поддерживаются в `Ember`-приложениях "из коробки", то для каждого перечисления генерируется также соответствующая [трансформация](efd3_transform.html) (папка `transforms`): +Перечисления соответствуют заданным на диаграмме классов сущностям со стереотипом `enumeration`. Поскольку перечисление [не является поддерживаемым типом данных в `Ember`-приложениях "из коробки"](https://guides.emberjs.com/v3.1.0/models/defining-models/#toc_transforms), то для каждого перечисления генерируется также соответствующая [трансформация]() (папка `transforms`): -![Трансформации в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-transforms.png). +![Трансформации в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-transforms.png) ### Сгенерированные контроллеры -При генерации в клиентское приложение добавляются следующие [контроллеры](efd3_controller.html) (папка `controllers`): +При генерации в клиентское приложение добавляются следующие [контроллеры](https://guides.emberjs.com/v3.1.0/controllers/) (папка `controllers`): -![Контроллеры в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-controllers.png). +![Контроллеры в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-controllers.png) -Контроллеры генерируются для форм и приложений, заданных на соответствующей диаграмме классов во [Flexberry Designer](fd_flexberry-designer.html). Также для форм создания записей отдельно генерируется контроллер `new` в папку с именем соответствующей формы редактирования. +Контроллеры генерируются для [форм](efd3_form.html) и приложений, заданных на соответствующей диаграмме классов во [Flexberry Designer](fd_flexberry-designer.html). Также для [форм создания записей](efd3_editform.html) отдельно генерируется контроллер `new` в папку с именем соответствующей [формы редактирования](efd3_editform.html). -![Диаграмма форм и приложений для рассмотрения сгенерированного `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/app-and-forms-class-diagram.png). +![Диаграмма форм и приложений для рассмотрения сгенерированного `Flexberry Ember`-приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/app-and-forms-class-diagram.png) -В контроллер `application` сгенерирован код для работы с меню (в нем определяется структура меню, заданная во [Flexberry Designer](fd_flexberry-designer.html)), а также необходимый для смены локализации код. +В контроллер `application` сгенерирован код для работы с меню (в нем определяется структура меню, заданная во [Flexberry Designer](fd_flexberry-designer.html)), а также необходимый для [смены локализации]() код. ### Сгенерированные роуты -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [роуты](efd3_route.html) (папка `routes`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [роуты](https://guides.emberjs.com/v3.1.0/routing/) (папка `routes`): ![Роуты в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-routes.png). -Роуты генерируются для списковых форм, форм редактирования, заданных на соответствующей диаграмме классов во [Flexberry Designer](fd_flexberry-designer.html) (эту диаграмму мы рассматривали ранее, когда говорили о сгенерированных контроллерах). Для форм создания записей по аналогии с генерацией контроллеров отдельно генерируется роут `new` в папку с именем соответствующей формы редактирования. +Роуты генерируются для [списковых форм](efd3_listform.html), [форм редактирования](efd3_editform.html), заданных на соответствующей диаграмме классов во [Flexberry Designer](fd_flexberry-designer.html) (эту диаграмма была рассмотрена ранее). Для [форм создания записей](efd3_editform.html) по аналогии с генерацией контроллеров отдельно генерируется роут `new` в папку с именем соответствующей [формы редактирования](efd3_editform.html). ### Сгенерированные шаблоны -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [шаблоны](efd3_template.html) (папка `templates`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [шаблоны](https://guides.emberjs.com/v3.1.0/templates/handlebars-basics/) (папка `templates`): -![Шаблоны в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-templates.png). +![Шаблоны в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-templates.png) -Шаблоны генерируются для списковых форм и форм редактирования, заданных на соответствующей диаграмме класов во [Flexberry Designer](fd_flexberry-designer.html) (эту диаграмму мы рассматривали ранее, когда говорили о сгенерированных контроллерах). +Шаблоны генерируются для [списковых форм](efd3_listform.html) и [форм редактирования](efd3_editform.html), заданных на соответствующей диаграмме класов во [Flexberry Designer](fd_flexberry-designer.html) (эту диаграмма была рассмотрена ранее). -Для списковых форм отдельно генерируется также шаблон `loading` в папку с именем соответствующей списковой формы, этот шаблон отображается в процессе перехода на соответствующий роут (этот шаблон генерируется также и на уровень всего приложения). +Для [списковых форм](efd3_listform.html) отдельно генерируется шаблон `loading` в папку с именем соответствующей списковой формы, этот шаблон отображается [в процессе перехода на соответствующий роут](https://guides.emberjs.com/v3.1.0/routing/loading-and-error-substates/) (этот шаблон генерируется также и на уровень всего приложения). -Также генерируется шаблон для отображения сообщения об ошибках (шаблон `error`). Этот шаблон генерируется только на уровень всего приложения. +Также генерируется шаблон [для отображения сообщения об ошибках (шаблон `error`)](https://guides.emberjs.com/v3.1.0/routing/loading-and-error-substates/). Этот шаблон генерируется только на уровень всего приложения. -Стандартый для "чистого" `Ember`-приложения шаблон `application` также заменяется на шаблон, разметка которого используется в [темах оформления](efd3_themes-structure.html) `Flexberry Ember`-приложений. Кроме того, генерируется также вариант шаблона `application`, который будет использоваться при запуске приложения на мобильных устройствах (генерация осуществляется в папку `mobile`; по аналогии во вложенных папках `mobile` могут быть созданы и другие элементы приложения, если их работу требуется переопределить при запуске приложения на мобильных устройствах). +Стандартый для "чистого" `Ember`-приложения шаблон `application` заменяется на шаблон, разметка которого используется в [темах оформления]() `Flexberry Ember`-приложений. Кроме того, генерируется вариант шаблона `application`, который будет использоваться [при запуске приложения на мобильных устройствах]() (генерация осуществляется в папку `mobile`; по аналогии во вложенных папках `mobile` могут быть созданы и другие элементы приложения, если их работу требуется переопределить при запуске приложения на мобильных устройствах). По сравнению с рассмотренной структурой папки `templates` в "чистом" `Ember`-приложении присутствует только шаблон `application` со стандартной разметкой "из коробки". ### Сгенерированные файлы локализации -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [файлы локализации](efd3_locale.html) (папка `locales`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [файлы локализации]() (папка `locales`): -![Файлы локализации в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-locales.png). +![Файлы локализации в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-locales.png) Генерируются файлы локализации для русского и английского языков для форм (папка `forms`) и моделей (папка `models`), а также для приложения в целом (`translations.js`). ### Сгенерированные стили -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [стили](efd3_style.html) (папка `styles`): +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение добавляются следующие [стили]() (папка `styles`): -![Стили в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-styles.png). +![Стили в сгенерированном `Flexberry Ember`-приложении](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-styles.png) В "чистом" `Ember`-приложении "из коробки" присутствует только пустой файл `app.css`. ### Сгенерированные компоненты -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение не добавляются новые [компоненты](efd3_component.html) (папка `components`). Однако на сгенерированных формах используются компоненты, которые определены в аддоне [ember-flexberry](https://github.com/Flexberry/ember-flexberry). +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение не добавляются новые [компоненты](https://api.emberjs.com/ember/3.1/classes/Component) (папка `components`). На [сгенерированных формах](efd3_form.html) используются [компоненты, которые определены в технологии Flexberry Ember](). ### Сгенерированные хэлперы -При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение не добавляются [хэлперы](efd3_helper.html) (папка `helpers`). Однако в шаблонах сгенерированных форм используются хелперы, которые определены в аддоне [ember-flexberry](https://github.com/Flexberry/ember-flexberry). +При генерации приложения из [Flexberry Designer](fd_flexberry-designer.html) в клиентское приложение не добавляются [хэлперы](https://api.emberjs.com/ember/3.1/classes/Helper) (папка `helpers`). В шаблонах [сгенерированных формах](efd3_form.html) используются хелперы, которые определены в технологии Flexberry Ember. ## Структура сгенерированного серверного приложения Сгенерированное решение для бэкенда состоит из двух основных проектов. Первый - это проект с [объектами данных](fo_data-object.html), соответствующих сущностям модели предметной области во [Flexberry Designer](fd_flexberry-designer.html) (то есть классам на диаграммах классов). Второй - это непосредственно Web API-приложение с [OData-сервисом](fo_orm-odata-service.html), которое предоставляет серверный API для клиентского приложения. -![Структура сгенерированного серверного приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-app.png). +![Структура сгенерированного серверного приложения](/images/pages/products/flexberry-ember/ember-flexberry/generation/generated-backend-app.png) ## Правила написания кода К внесениям изменений в прикладной код необходимо подходить ответственно, поскольку он может быть утерян при последующих перегенерациях.