Соберём базу знаний с разделами и статьями. В готовой системе администрирования автор сможет выбрать раздел, написать текст и изменить статус публикации. Публичный сайт подключается отдельно: созданные операции работы с записями сами по себе не открывают черновики посетителям.
Сначала выполните init и запуск Generator UI. В примере используем английские технические имена; подписи, которые видят пользователи, можно написать по-русски.
1. Создайте модуль и раздел
В Content нажмите New module и создайте модуль content. В нём выберите New entity и укажите имя Section, вид persistent, модуль content и таблицу sections.
Добавьте поля кнопкой Add field:
| Поле | Выбор типа | Настройки |
|---|---|---|
id |
Identifier int64 | Первичный ключ с генерацией значения; не вводится автором. |
title |
String | Название раздела, например «Руководства». |
slug |
String | Стабильное имя URL, Unique; например guides. |
position |
Integer/Number | Порядок раздела. Вводите его явно. |
Пресет Identifier сразу настраивает первичный ключ и поддерживаемый способ генерации его значения. Это важно: обычное поле Number останется числом и не станет идентификатором автоматически.
Для title и slug откройте Basic settings → Values and validation и включите Required. У slug также проверьте Unique: адреса разделов не должны повторяться. Nullable отдельно разрешает NULL, то есть отсутствие значения в БД; это не то же самое, что обязательное заполнение строки. У relation/image обязательность выбирается одной согласованной настройкой. После Finish проверьте свойства в таблице полей.
2. Создайте статью
Создайте persistent-сущность Article, её таблица — articles. Добавьте id через тот же Identifier-пресет. Затем создайте остальные поля:
| Поле | Тип | Для чего нужно |
|---|---|---|
title |
String | Заголовок статьи. |
slug |
String | Уникальный адрес, который не меняется вместе с правкой заголовка. |
summary |
Text | Короткое описание для списка. |
body |
Text | Полный Markdown статьи. |
status |
Enum | Значения draft,published,archived в таком порядке. |
position |
Integer/Number | Порядок внутри раздела. |
У поля body выберите Presentation → Markdown. В форме статьи появятся визуальный редактор и режим исходного текста. Тип Text отвечает за хранение длинной строки, Presentation — за её редактирование. Для обычной статьи этого достаточно; свой редактор нужен при особых требованиях. Не добавляйте в форму автора обязательные хеши и ревизии источников, если приложение не заполняет их автоматически.
3. Свяжите статью с разделом
В Article нажмите Create relation → Many-to-one. Укажите цель Section, имя поля sectionId, обязательную ссылку и отображаемое поле Section.title. Тогда автор будет выбирать раздел по названию.
После Finish появятся поле внешнего ключа и связь, которой оно принадлежит. Если нужно видеть статьи внутри раздела, включите обратное представление: оно использует эту же связь, без второго внешнего ключа. Подробнее — подробности отношений.
4. Проверьте доступ и генерацию
Откройте Entity settings → Access → Entity CRUD access и оставьте нужные admin-операции. Для публичного сайта включите только необходимые external List/Get. Затем в External READ access добавьте status equal published: это серверное правило исключит черновики. Само наличие Enum такого ограничения не создаёт. Пока сайта нет, external-доступ можно оставить выключенным. Получившиеся адреса API видны в Generated routes. Далее используйте подключение сайта через стандартный external API.
В Generate просмотрите план, конфликты и маршруты, затем примените изменения. Запустите приложение через make dev. При первом запуске создайте superadmin по приглашению в терминале.
5. Проверьте работу редактора
В готовой системе администрирования сначала создайте Section, затем Article. У статьи выберите раздел, заполните slug, title, текст, status и position. Сохраните запись и откройте её повторно, чтобы убедиться, что данные сохранились.
Создайте ещё одну статью и откройте список. Чтобы управлять его порядком, вернитесь в Generator UI: у position включите List behavior → Sortable, у title — Searchable и при необходимости Filterable. Выполните Generate и обновите приложение. Поиск, фильтры и сортировка будут работать на сервере. Для публикации меняйте status в системе администрирования; сайт получит только записи, прошедшие external-правило чтения.
Дополнительно: CLI
Если понадобятся скрипты, ту же модель можно собрать через CLI: сущности, поля, отношения. Для пошаговой настройки используйте интерфейс.
Справка по шагам примера
За полным описанием параметров переходите в справку: сущности, поля, связи, доступ, виртуальные сущности. Там можно найти отдельную настройку, не повторяя весь пример.