Нужна помощь в старте реализации примера веб-приложения

Добрый день!

В продолжении затронутой темы в посте Visual SQL Designer - еще не реализован? - #6 by Alcomp

Я создал для теста и понимания сути разработки простенькую модель данных

Т.е. там логическая структура подчинения “на 3-х уровнях”.

Далее сделал макет веб-приложения на 2-х страницах:

  1. Страница Countries (Страны) - где хочу выводить список стран, иметь возможность добавлять новую страну и переходить на отдельную страницу Страны.

  2. Страница отдельной Страны, где хочу выводить список “подчиненных/связанных” с данной конкретной страной Cities (Городов) с возможностью тут же добавлять в данный список новый Город (с привязкой к данной Стране). И тут же в ячейке списка Городов - вложенный список связанных с конкретным городом Streets (Улиц), где также хочу иметь возможность добавлять связанную к конкретному Городу улицу и сразу же отображать в данном списке.

Т.е., если подытожить: Добавляю Страну, перехожу на страницу Страны, добавляю в список тут же Город (он сразу выводится в списке), и в добавленный Город добавляю тут же Улицу - и она тоже выводится в списке. Добавление последовательное, но на одной странице Страны (без переходов на страницу Города).

Подскажите, пожалуйста, как мне реализовать данный (простой) пример, какие БП нужно использовать и как выводить нужные мне данные?

1 Like

Для начала нужно убедиться, что на бекэнде созданы соответствующие эндпойнты. Отдельно для добавления каждой из трех моделей, а также для их получения.
Сами бизнес-процессы эндпойнтов при этом могут быть максимально простыми. Вероятно, их можно даже не создавать отдельно, а назначить эндпойнтам системые функции (DB: Create city, Search city, get City).

После этого в веб приложении добавить какие-то поля ввода, где, как минимум, можно ввести названия добавляемых объектов.
На БП кнопки уже простая функция, с блоками типа Get Input String Data, Make Model (Street, City), POST /city
То есть задача в том, чтобы взять значение с поля для ввода, создать модель и передать ее для создания на бэк.

Для получения опять же обратиться на бек. Например если это страница страны с ID 5, то делается запрос с передачей соответствующего ID.
На беке должен выполниться блок Search City. Где в параметрах передается Country = 5 (То есть ищем города только определенной страны) и _with = street (то есть ищем не только города, но и связанные с ними улицы).

Больше информации для вывода данных можно найти здесь (только вместо таблицы используются листы)

Также есть инструкция и в курсе. Там используется предыдущая версия редактора, но сам принцип и содержание БП в целом не изменилось.

Сейчас, как я понял нужно создавать эндпойнты самостоятельно? Где-то тут на форуме, я вроде задавал вопрос, почему не создались при добавлении модели данных, был ответ, что уже не создаются автоматически.

Да, самостоятельно. Если это простой эндпойнт из системного блока (Get, Search, Update, Delete), то каких-то сложностей с созданием не должно возникнуть

Ну у меня пока только сложности… Это для меня конечно новинка еще, но интересно). Можно по-порядку действия подсказать (я буду отмечать что нужно, а вы подскажете как это сделать, если можно пошагово):

Например, на странице Countries (со списком всех Стран) нужно при нажатии на кнопку Add Country, чтобы появлялось модальное/всплывающее окно, где как раз будет размещено поле ввода Country Name, а также 2 кнопки Cancel и Save. При нажатии Save - сохраняется новая запись в БД, Cancel - скрывает модальное окно.

Что мне нужно сделать для этого, куда зайти сначала, что создать, какие БП ? Подскажите, пожалуйста. Я так понимаю нужно еще “построить” элемент модального окна с полем ввода, а потом через БП его вызывать (какой БП для этого использовать) ?

А после этого как сохранить запись из модального окна (нужно передать какой-то параметр создаваемой записи) ?

Модальное окно - это один из элементов, которые моно добавить на страницу (примерно так же, как текстовое поле, или кнопку.
Ее отличие только в том, что это изначально невидимый элемент и у него есть настройка (Show/Hide). Соответственно нужно активировать Show, чтобы увидеть его.
В нем изначально содержатся основные кнопки (отмены, подтверждения, закрытия) и основное пространство для размещения своих элементов (туда нужно добавить поле ввода).
На кнопку страницы нужно повесить простой БП с блоком Modal Show. В самой модалке в соответствующих кнопках блоки Modal Hide.
Так уже, как минимум, модалка будет открывать и закрываться.

Про то, как сохранить запись, уже писал выше, пробуйте. Если что-то конкретное непонятно - спрашивайте.

1 Like

Создал я эндпойнт для модели Country (не знаю, правильно ли все сделал, но там ничего пока не отмечал, оставил все по умолчанию), выбрал встроенный БП DB: Search country


Далее по вашему примеру создал бизнес-процессы (как я думаю) для вывода информации в список (у вас пример с Таблицей). Только я выбрал триггер On Show (или нужно именно On Create, в чем отличие?).
А также триггер On Update Data (пока не понял для чего он нужен…)

Теперь хочу, чтобы полученная информация отображалась в списке, т.е. в текстовом блоке {{country_name}} - каждая Страна со своим именем (т.е. из поля name модели Country)

Как мне подключить имя к текстовому блоку? У вас в примере в таблице, как я понял, в самих настройках уже есть макет с выводимыми полями (их можно скрывать/отображать), а тут нужно именно подключить?

Я пока не делала БП на добавление записи в БД (не знаю правильно или нет), хочу сначала сделать именно отображение данных в списке, чтобы при добавлении первой записи уже было что отображать и заодно протестировать работу БП по выводу списка. Подскажите, я на правильном пути, или что-то не так делаю? Может еще какую- информацию нужно отобразить?

И подскажите, почему отказались (или не было изначально) автоматического создания нужных БП и эндпойнтов при выводе списка записей в веб-приложении? Например, в момент подключения блока Списка к модели данных из бэкенда - чтобы система предлагала автоматически создать функционал вывода списка всех записей (т.е. БП+Эндпойнт). Хотя бы какой-то по умолчанию.

Ведь это же логично - если я добавляю список/таблицу в конструкцию, с вероятностью в 99,99% я хочу и подразумеваю, что сразу увижу перечень имеющихся (или нулевое значение) записей в подключенной модели. Зачем еще “сложности” с добавлением специальных БП для этого - это ж ведь значительно упростит/ускорит разработку (разве не для облегчения созданы no-code платформы?).
А далее - уже каждый разработчик на свое усмотрение “допиливает” дефолтные БП для списков/таблиц - модернизирует, совершенствует и т.п. Такое реализуемо в App Master или в чем сложности такого стандартного функционала?

Можно в Middleware отключить Auth. Иначе запрос будет выполняться только для авторизованных пользователей, а у вас в приложении авторизации еще явно нет.

Отличие в целом следует из названия. Create - это само создание элемента. Show - появление, если, например, элемент был скрыт. При первом появлении всегда будет именно on Create. При переходе на страницу с элементом сама страница с содержимым будет создана. Соответственно правильнее использовать on Create.
На скриншоте List Update Data не сработает, к нему не проведена связь.
Триггер On Update Data сработает при обновлении данных в листе. В данном примере можно использовать его чтобы убрал с листа статус Loading (отдельный триггер для этого использовать, конечно, не обязательно, это просто один из возможных вариантов)

Нужно создать БП для элемента текстового блока. Так как он в листе, то он будет содержать саму модель Country.

  1. Происходит переход на страницу
  2. Срабатывает триггер On Create для листа
  3. Идет запрос данных на сервер
  4. Лист получает данные
  5. Срабатывает триггер On Create для текстового элемента листа.
  6. В триггере можно использовать три простых блока. Expand Country → To text → Textblock Update Data

По итогу отобразится список стран с данными из базы.

1 Like

Все вышеуказанное вами сделал (вроде). Можно ли как-то проверить работоспособность “конструкции” ? Или я увижу правильно ли сделал только после добавления 1-й записи? Если да, то я начал делать БП по добавлению записи в БД. Использовал информацию из этого урока Создание записи в БД | AppMaster ,
Создание записи делаю по триггеру On Click на кнопке Save в модальном окне (там же и поле Input String - Country Name)

но на блоке БП InputString Get Properties (для поля name) застрял, т.к. у меня совсем не те параметры в одноименном блоке…

на картинке в уроке такие параметры:


а у меня в блоке такие (т.е. не могу соединить параметры String - как стрелка 2 на скрине - Value и Name)

Что не так сделал?

Я правильно сделал эндпоинт для создания одной записи в БД ?

UPD.
Только не вижу БП Server request POST /countries/ в списке…


…/countries/ уже есть такой слаг, только в эндпойнте с GET методом. Может нельзя повторяться?

Блоки разделены на два основных вида: Свойства (Properties) и Значения (Values). Если нужно взять значение, введенное в поле в вода, то нужен блок InputString Get Values

Если методы разные (Get и Post), то повторяться можно и даже нужно. Скорее всего новый блок не успел подтянуться в список и если перезагрузить страницу, то он появится.

Кстати, при создании приложения уже доступен шаблон. Можно установить пример простой CRM и посмотреть работу в деле. Там можно найти множество готовых примеров создания новых записей и их отображения в таблицах

Спасибо, исправлю. Просто я ж не мог об этом знать, у вас в уроке так указано, я и брал оттуда пример…

Отлично, тоже попробую!

А в бесплатной версии доступен только 1 проект? Я хотел создать еще один “рядом”, чтобы смотреть как там устроено, но тестировать на другом проекте… Есть какой-то вариант, или только на новом аккаунте можно сделать ?

Уже что-то получается, но есть такие вопросы:

  1. Чем отличается режим просмотра Mock от Development ? Я попробовал добавить запись в обоих вариантах, но добавились только в режиме Development

  2. При вводе в поле Input и в БД попадает значение, которое я ввел самым первым. После этого, какое бы я не ввел значение, в строках записи отображается только первое введенное. Например, я вводил Россия, Молдова, Белоруссия, а в итоге - сохраняет только Россия (3 записи). Как “обнулить” значение в поле ввода, как правильно сделать, чтобы сохранялось нужное ?

  3. Как выводить добавленную запись сразу в списке правильно? С перезагрузкой страницы или перезагрузкой блока Списка (можно ли так, чтобы не перезагружать целую страницу, а только “фрейм”) ? Какие БП нужно использовать для этого?

Собственно название говорит само за себя. Mock отображает псевдоданные, он не взаимодействует с беком.

Чтобы ответить что-то конкретное это информации недостаточно. Нужно видеть, что вы сделали. В целом, если открывается модалка, в ней вводите значение и нажимаете на сохранение, то с поля ввода обязано браться новое значение. Вероятно, имеет место быть проблема отображаения данных, а не их сохранения. Проверьте что на самом деле содержится в базе данных (можно открыть ее напрямую, без веб-приложения, с главное страницы проекта), что отправляется в сетевых запросах при сохранении новых данных.

Все страницу перезагружать не нужно. Можно даже без сетевых запросов (так как вы знаете, какую новую запись отправляете в базу) добавить в List одну запись - Append List Data.
Можно обновить данные в листе целиком, соответственно запускаете блоки типа Server Request GET /Country/ и List Update Data.
Если какие-то процессы используются в нескольких местах (например, обновление данных в листе и при входе на страницу, и при добавлении новых записей), то правильнее создать отдельную функцию для этого процесса и запускать ее одним блоком, без необходимости повторного создания одинаковой логики

Можете подсказать, как это сделать (где) ? Я пока плохо ориентируюсь в интерфейсе платформы, не могу понять где можно открыть БД ? Вроде ж это страница проекта:

Если перейти через виджет Модели данных или боковое меню Бэкенд, то собственно, я увижу только схему модели данных, без списка записей…

Прямо на вашем скрине кнопка Открыть БД (панель справа). Естественно сам сервер при этом должен быть запущен