Бэкенд для FlutterFlow за 10 минут

Рассмотрим, как подключить к вашему приложению во FlutterFlow быстрый бэкенд в виде базы данных Конструктора Интеграл.

Бэкенд для FlutterFlow за 10 минут

План

  • Описание задачи
  • Импорт данных в Интеграл
  • Создание отчета в конструкторе запросов
  • Выдача прав внешнему пользователю API
  • Конфигурирование запроса из FlutterFlow
  • Справочная информация

Задача

Наша сегодняшняя задача – организовать маркетплейс промтов для ChatGPT, при этом наш каталог будет иметь десятки тысяч записей, принимать до 2000 пользователей одновременно и содержать достаточно сложную логику с несколькими ролями пользователей и этапами сделок.

Структура данных даже в простом приложении, вроде этого, выглядит непросто, как вот этот фрагмент базы данных маркетплейса:

Бэкенд для FlutterFlow за 10 минут

Стандартно FlutterFlow использует Firebase, однако с ним есть такие ограничения:

  • Это не бэкенд, а база данных – приложения на Firebase без серверной части пока недостижимы
  • Это NoSQL со всеми его преимуществами и недостатками

Очевидно, сложную логику и защищенную ролевую модель мы таким образом реализовать не сможем. Однако, теперь у нас есть Интеграл – конструктор реляционных баз данных, запросов и логики.

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

Бэкенд для FlutterFlow за 10 минут

Здесь мы видим фильтры, строку поиска и бесконечный скролл - всё это нам нужно быстро реализовать в виде прототипа, чтобы очаровать нашего заказчика и получить следующую часть оплаты.

Интеграл – регистрация и импорт данных

Для начала мы регистрируемся в Интеграле в один клик через Гугл:

Бэкенд для FlutterFlow за 10 минут

и получаем свою личную базу данных:

Бэкенд для FlutterFlow за 10 минут

В эту базу данных нам нужно загрузить наш каталог – для прототипа мы возьмем всего несколько тысяч записей вот из этого экселя:

Бэкенд для FlutterFlow за 10 минут

Идем в меню Загрузка и выбираем вариант загрузки – Создать таблицу из файла:

Бэкенд для FlutterFlow за 10 минут

Копируем сюда содержимое нашего экселя (Ctrl+A, Ctrl+C, Ctrl+V) и нажимаем синюю кнопку Проверить:

Бэкенд для FlutterFlow за 10 минут

Загрузчик распознает колонки таблицы и предложит её импортировать в Интеграл:

Бэкенд для FlutterFlow за 10 минут

Мы проверим данные и поправим колонку Stars – она должна быть числом с точкой (Signed), о чем загрузчик не догадался:

Бэкенд для FlutterFlow за 10 минут

Теперь мы нажимаем кнопку загрузить и подтверждаем это действие:

Бэкенд для FlutterFlow за 10 минут

Через 2-3 секунды все наши данные оказываются в Интеграле и мы видим небольшой отчет об этом:

Бэкенд для FlutterFlow за 10 минут

Теперь в меню Таблицы нашего Интеграла мы видим ярлычок таблицы Prompt:

Бэкенд для FlutterFlow за 10 минут

Сама таблица промптов выглядит так, здесь можно добавлять, редактировать, фильтровать, сортировать данные, а также перемещаться между связанными таблицами в любом направлении (drill-down):

Бэкенд для FlutterFlow за 10 минут

Пока всё выглядит как в экселе, Airtable или в том же Firebase. А сейчас мы применим средство, которого нет в этих и им подобным инструментах – конструктор запросов.

Конструктор запросов

Запрос в Интеграле – это некое подобие инструкции, какие данные и как нужно выбрать из системы. Конструктор можно назвать инструментом для написания SQL-запросов без кода и без знания синтаксиса этого языка.

Обычно запросы нужны для выборки множества колонок данных из разных связанных таблиц и применения к ним вычислений и логики. Но в сегодняшнем примере мы просто выберем данные из одной таблицы – нашего каталога товаров.

В меню Запросы мы создаем новый запрос, назовем его Prompts – вводим имя и нажимаем Создать:

Бэкенд для FlutterFlow за 10 минут

Изначально запрос пустой, и мы можем добавить в него колонки из любых таблиц в нашей системе – выберем из выпадающего списка всех доступных таблиц таблицу Prompt и её первую колонку – Prompt:

Бэкенд для FlutterFlow за 10 минут

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

Бэкенд для FlutterFlow за 10 минут

Аналогично добавим остальные колонки в наш запрос, наблюдая как перестраивается отчет:

Бэкенд для FlutterFlow за 10 минут

В итоге мы получаем ту же самую таблицу, но уже в виде отчета:

Бэкенд для FlutterFlow за 10 минут

Для ограничения количества строк в отчете мы используем поле LIMIT (аналог такого же ключа у программистов SQL) – отчет будет выдаваться страницами по 15 записей, если мы вобьем туда число 15:

Бэкенд для FlutterFlow за 10 минут

Напомню, пока мы находимся в конструкторе, и здесь мы можем редактировать запрос на лету. Пользователь же увидит свой отчет в готовом виде – нажмем синюю ссылку Prompt вверху экрана и увидим этот отчет вне конструктора:

Бэкенд для FlutterFlow за 10 минут

Здесь мы можем скопировать ссылку на этот отчет, чтобы использовать её для получения данных во FlutterFlow – ссылка выделена красным.

Права пользователя для API

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

Чтобы дать доступ к этому запросу, мы создадим пользователя для обращения к нему извне – из FlutterFlow. Идем в меню Пользователи и видим там пока единственного пользователя – это мы:

Бэкенд для FlutterFlow за 10 минут

Нажимаем кнопку Добавить и вводим имя пользователя для доступа по API из FlutterFlow – назовем его ff:

Бэкенд для FlutterFlow за 10 минут

В открывшейся форме можно заполнить свойства этого пользователя – для доступа по API достаточно будет заполнить Роль и Пароль (password).

Бэкенд для FlutterFlow за 10 минут

Добавим прямо здесь в выпадающий список роль api, которой до этого не было в системе:

Бэкенд для FlutterFlow за 10 минут

И заполним поле пароль каким-то секретным значением:

Бэкенд для FlutterFlow за 10 минут

Когда мы сохраняем форму, то нам предлагают заполнить обязательные поля – выходит соответствующее сообщение. Игнорируем его, так как этому пользователю эти поля не понадобятся.

Бэкенд для FlutterFlow за 10 минут

Идем в меню Таблицы, чтобы настроить роль этому пользователю. Выбираем таблицу Роль:

Бэкенд для FlutterFlow за 10 минут

В таблице Роль мы видим нашу роль api, а в её колонке Объекты – 0 записей. Эта колонка показывает, сколько этой роли задано доступных таблиц и полей. Кликнем этот 0.

Бэкенд для FlutterFlow за 10 минут

В таблице объектов пусто. Здесь для каждой таблицы или её поля можно задать уровень доступа этой роли – просмотр, изменение или запрет.

Бэкенд для FlutterFlow за 10 минут

Из списка всех таблиц Интеграла мы выберем нужную нам – Запрос и добавим в эту таблицу:

Бэкенд для FlutterFlow за 10 минут

Выберем для таблицы запросов уровень доступа READ (только чтение) и укажем маску – имя нашего запроса Prompts – так мы дадим доступ только к этому запросу, одному из всех.

Бэкенд для FlutterFlow за 10 минут

Вот такой получился состав таблиц (объектов) роли api:

Бэкенд для FlutterFlow за 10 минут

На этом конфигурирование Интеграла для использования API завершено, и теперь мы начнем использовать всё это из FlutterFlow.

Конфигурирование запроса из FlutterFlow

Во FlutterFlow создаем интеграцию и задаем её основные параметры:

  1. Адрес, который мы скопировали из строки адреса запроса выше: https://ideav.online/test/report/108087
  2. К адресу приписываем параметр, который укажет, что нам нужен результат в JSON: ?JSON_KV (это самый популярный формат для таблиц – Key -> Value
  3. Заголовок для авторизации с именем нашего пользователя и паролем в таком формате: Authorization: Basic ff:********
Бэкенд для FlutterFlow за 10 минут

Теперь мы сохраняем эти настройки и можем попробовать получить отчет по ним, вот такой результат – мы видим наши данные в формате, понятном FlutterFlow:

Бэкенд для FlutterFlow за 10 минут

Если нам нужно отфильтровать наш отчет, то мы используем параметры фильтров. Например, чтобы вернуть записи с ценой от 3 до 4 долларов мы задаем диапазон цен таким образом, с помощью префиксов FR_ и TO_ у имени колонки Price:

Бэкенд для FlutterFlow за 10 минут

Отчет будет отфильтрован:

Бэкенд для FlutterFlow за 10 минут

Если нам нужен фильтр по вхождению текста в названии промпта, то мы используем фильтр по маске, заменяя знаком % любое количество любых символов, например, чтобы найти записи, содержащие слово nut, добавим такой параметр:

Бэкенд для FlutterFlow за 10 минут

Результат запроса будет такой:

Бэкенд для FlutterFlow за 10 минут

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

Например, 3-я страница по 15 записей будет как два числа: 30,15. Здесь 30 – это смещение на 30 записей (2 страницы по 15) от начала отчета:

Бэкенд для FlutterFlow за 10 минут

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

Итак, всего за 10 минут мы с нуля создали и протестировали бэкенд для FlutterFlow на Интеграле. Вы можете повторить это в своих проектах прямо сейчас.

Справочная информация

Мануал по Интегралу: https://help.ideav.online/

Что ещё можно делать запросами: https://www.youtube.com/watch?v=K7RpGL35k_4

44
9 комментариев

Спасибо! Много букв, но занимает всё действительно меньше 10 минут.

1
Ответить

А как у этой связки дела со скоростью работы?

Ответить

Отлично со скоростью. Есть некий лаг во взаимодействии между FF и Интегралом, но он фиксированный (от 0.2 до 1 секунды) и не зависит от объемов данных.

1
Ответить

Подскажите, с каких ip ходит flutter? Не РФ ведь, наверное.

Ответить

Определяется как USA - AS14618 · Amazon.com, Inc.

1
Ответить

Кто делал UI? Это просто жесть...
Чем лучше self hosted supabase?

Ответить

Лучше такими вещами:
1. Конструктор SQL-запросов без кода
2. Не надо самому хостить

Оба момента сильно влияют в хорошую сторону на время и стоимость разработки

Ответить