Flutter Шаблон

Шаблон бэкенда CRM приложения
Flutter — Схема, API и AI руководство

Готовая к производству Flutter CRM схема бэкенда и Стартовый комплект на Back4app: Контакт, Компания, Сделка, Активность, этапы воронки, ER-диаграмма, словарь данных, JSON-схема, API-площадка и однонажатийный AI агент для развертывания за минуты.

Ключевые выводы

На этой странице вы получите готовую к производству схему CRM, однонажатийный AI-подсказку и пошаговый код Flutter — так вы сможете выпустить приложение CRM без создания бэкенда.

  1. Разверните за считанные минутыВставьте подсказку AI Agent и получите работающее приложение с контактами, компаниями, сделками и конвейером.
  2. Безопасно по умолчаниюACL и доступ на основе ролей, чтобы пользователи видели только свои назначенные сделки и данные.
  3. Flutter-родной SDKТипизированные объекты, async/await, оффлайн-фиксация и Live Queries для обновлений конвейера.
  4. REST + GraphQLОбе API сгенерированы автоматически; фильтруйте сделки по этапу, перечисляйте активности по relatedTo.
  5. Пять классов_User (встроенный), Компания, Контакт, Сделка (конвейер), Активность (задачи/события).

Что такое шаблон бэкенда CRM приложения Flutter?

Шаблон бэкенда CRM приложения Flutter — это готовая к производству схема Back4app (Contact, Company, Deal, Activity) с типизированным Dart SDK, оффлайн-поддержкой и Live Queries. Создайте единую кодовую базу для iOS и Android: запрашивайте сделки по стадиям, управляйте контактами и компаниями, и синхронизируйте данные воронки в реальном времени. Никакого пользовательского бэкенда или REST glue — SDK Back4app Flutter обрабатывает аутентификацию, CRUD и локальное хранилище, чтобы вы могли сосредоточиться на UI и бизнес-логике.

Лучше всего для:

Команды продажСоздатели CRMБыстрое прототипированиеПолевые представителиЗапуски MVPКоманды выбирают BaaS для CRM

Обзор

Приложения CRM Flutter нуждаются в контактах, сделках, этапах процесса и необязательной оффлайн-синхронизации. Схема Back4app (Компания, Контакт, Сделка, Действие) подходит для SDK Flutter: QueryBuilder для фильтрации по этапу, закрепление для локального хранения и Live Queries для обновлений процесса в реальном времени.

Пять классов ниже — _User, Company, Contact, Deal, Activity — доступны через SDK Back4app Flutter. Используйте типы Dart и async/await для получения сделок по этапу, создания контактов и сделок, а также регистрации действий. Никакой REST или подключения GraphQL в вашем приложении; SDK обрабатывает сериализацию и синхронизацию.

Основные функции CRM

С Flutter и SDK Parse вы получаете управление контактами, воронку сделок и отслеживание активности — плюс офлайн-фиксация и Live Queries для полного бэкенда CRM.

Управление контактами

Храните и управляйте контактами с именем, электронной почтой, телефоном, компанией и заметками. Идеально подходит для приложений Flutter.

Управление компаниями

Отслеживайте компании по имени, веб-сайту, отрасли и адресу. Связано с контактами и сделками.

Конвейер сделок

Конвейер продаж с этапами, суммой, ожидаемой датой закрытия и назначением. Создан для бэкендов Flutter.

Отслеживание активности

Записывайте звонки, электронные письма, встречи и заметки, связанные с контактами и сделками. Работает с SDK Flutter.

Пользователь и разрешения

Встроенная модель пользователя и указатели для владения и назначения. ACL из коробки для Flutter.

Почему стоит создать ваш Flutter CRM бэкенд с Back4app?

Back4app предоставляет вам готовый бэкенд и типизированный SDK, чтобы вы могли создать свое CRM-приложение с конвейером, контактами и сделками, не написав REST-связку и не управляя аутентификацией самостоятельно.

  • Типизированный SDK и сериализация: Типизированные объекты SDK обеспечивают безопасность типов для Контакта, Компании, Сделки и Активности; SDK обрабатывает JSON, так что вам нужно писать меньше шаблонного кода.
  • Асинхронный в первую очередь и оффлайн: SDK Back4app Flutter использует async/await и закрепление; конвейер и контакты работают в оффлайне и синхронизируются, когда снова выходят в онлайн.
  • Синхронизация Live Queries / Reactive: Подписывайтесь на изменения Сделки и Активности, чтобы конвейер и панель инструментов обновлялись в реальном времени.

Одна и та же схема и API для каждого стека — переключайте клиентов позже, не меняя бэкенд.

Основные преимущества

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

Разрабатывайте быстрее, без кода бэкенда

REST и API GraphQL и готовая схема — подключите свое приложение и вперед.

Безопасно по умолчанию

ACL и разрешения на уровне класса; ограничить по assignedTo и createdBy.

Поток в реальном времени

Live Queries через WebSockets для мгновенных обновлений сделок и активности.

Встроенная аутентификация

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

Работает в оффлайне

Локальная привязка сохраняет контакты и сделки доступными в оффлайне и синхронизирует их при повторном подключении.

Развертывание за минуты

Используйте AI Agent для создания и развертывания вашего CRM-приложения из этого шаблона.

Готовы попробовать?

Позвольте AI Agent от Back4app создать бэкенд вашего CRM-приложения, подключить фронтенд Flutter и развернуть — все из одного запроса.

Бесплатно для начала — 50 запросов AI Agent в месяц, без необходимости в кредитной карте

Технический стек

Все, что поддерживает этот шаблон CRM-приложения, на одном взгляде.

Фронтенд
Flutter
Бэкенд
Back4app
База данных
MongoDB
Аутентификация
Аутентификация и контроль доступа
API
REST и GraphQL
Развертывание
AI-агент / Панель управления

ER диаграмма

Диаграмма «Сущность-связь» для модели данных CRM приложения Flutter.

Просмотреть источник диаграммы
Mermaid
erDiagram
    _User {
        String objectId PK
        String username
        String email
        String password
        Date createdAt
        Date updatedAt
    }

    Company {
        String objectId PK
        String name
        String website
        String industry
        String address
        String notes
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Contact {
        String objectId PK
        String name
        String email
        String phone
        Pointer company FK
        String notes
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Deal {
        String objectId PK
        String title
        Number amount
        String stage
        Pointer contact FK
        Pointer company FK
        Date expectedCloseDate
        String notes
        Pointer assignedTo FK
        Date createdAt
        Date updatedAt
    }

    Activity {
        String objectId PK
        String type
        String subject
        String description
        Date dueDate
        Date completedAt
        Pointer relatedTo FK
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Company ||--o{ Contact : "has"
    Company ||--o{ Deal : "has"
    Contact ||--o{ Deal : "has"
    _User ||--o{ Deal : "assignedTo"
    _User ||--o{ Activity : "createdBy"
    Contact ||--o{ Activity : "relatedTo"
    Deal ||--o{ Activity : "relatedTo"
    _User ||--o{ Company : "createdBy"
    _User ||--o{ Contact : "createdBy"

Поток интеграции

Последовательность Auth-to-CRUD: как ваше Flutter приложение взаимодействует с Back4app — вход в систему, затем запрос контактов и сделок, обновление воронки.

Просмотреть источник диаграммы
Mermaid
sequenceDiagram
  participant User
  participant App as Flutter App
  participant Back4app as Back4app Cloud

  User->>App: Login
  App->>Back4app: Parse().login(username, password)
  Back4app-->>App: Session token
  App-->>User: Logged in

  User->>App: Load contacts and deals
  App->>Back4app: Query<Deal>().find() or Query<Contact>().find()
  Back4app-->>App: List<Deal> / List<Contact>
  App-->>User: Show pipeline

  User->>App: Create deal or contact
  App->>Back4app: deal.save() or contact.save()
  Back4app-->>App: Deal (objectId)
  App-->>User: Updated list

Словарь данных

Полная справка по полям для каждого класса в схеме.

ПолеТипОписаниеОбязательно
objectIdStringAuto-generated unique identifierавто
nameStringFull name of the contact
emailStringEmail address
phoneStringPhone number
companyPointer<Company>Company this contact belongs to
notesStringFree-form notes
createdByPointer<_User>User who created this contact
createdAtDateAuto-generated creation timestampавто
updatedAtDateAuto-generated last-update timestampавто

9 поля в Contact

Безопасность и разрешения

Как владение, ACL и разрешения на уровне классов защищают данные в этой схеме CRM.

ACL на уровне строк

Используйте ACL и указатели (assignedTo, createdBy), чтобы пользователи видели и редактировали только свои назначенные сделки и связанные данные.

Разрешения на уровне классов

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

Владение на основе указателей

Deal.assignedTo и Activity.createdBy ссылаются на _User; Cloud Code может обеспечивать видимость и редактирование по ролям.

Схема (JSON)

Сырая определение схемы JSON — скопируйте и используйте в вашем Back4app приложении или импортируйте через API.

JSON
{
  "classes": [
    {
      "className": "Contact",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "name": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": false
        },
        "phone": {
          "type": "String",
          "required": false
        },
        "company": {
          "type": "Pointer",
          "targetClass": "Company",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Company",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "name": {
          "type": "String",
          "required": true
        },
        "website": {
          "type": "String",
          "required": false
        },
        "industry": {
          "type": "String",
          "required": false
        },
        "address": {
          "type": "String",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Deal",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "title": {
          "type": "String",
          "required": true
        },
        "amount": {
          "type": "Number",
          "required": false
        },
        "stage": {
          "type": "String",
          "required": false
        },
        "contact": {
          "type": "Pointer",
          "targetClass": "Contact",
          "required": false
        },
        "company": {
          "type": "Pointer",
          "targetClass": "Company",
          "required": false
        },
        "expectedCloseDate": {
          "type": "Date",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "assignedTo": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Activity",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "type": {
          "type": "String",
          "required": false
        },
        "subject": {
          "type": "String",
          "required": false
        },
        "description": {
          "type": "String",
          "required": false
        },
        "dueDate": {
          "type": "Date",
          "required": false
        },
        "completedAt": {
          "type": "Date",
          "required": false
        },
        "relatedTo": {
          "type": "Pointer",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "_User",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "username": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": true
        },
        "password": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    }
  ]
}

Создайте с помощью AI Agent

Используйте Back4app AI Agent, чтобы создать реальное CRM приложение из этого шаблона: он создаст фронтенд, бэкенд (эту схему, аутентификацию и API) и развернет его — без ручной настройки. Подсказка ниже описывает этот стек CRM, чтобы Агент мог сгенерировать готовое к производству приложение за один раз.

Back4app AI Agent
Готовы к созданию
Создайте приложение CRM на Back4app с этой точной схемой и поведением.

Схема:
1. _Пользователь (используйте встроенный Back4app): имя пользователя (Строка, обязательно), электронная почта (Строка, обязательно), пароль (Строка, обязательно); objectId, createdAt, updatedAt (система).
2. Компания: название (Строка, обязательно), веб-сайт (Строка), отрасль (Строка), адрес (Строка), заметки (Строка), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
3. Контакт: имя (Строка, обязательно), электронная почта (Строка), телефон (Строка), компания (Указатель на Компанию), заметки (Строка), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
4. Сделка: название (Строка, обязательно), сумма (Число), стадия (Строка; например, лид, квалифицированный, предложение, переговоры, выиграно, проиграно), контакт (Указатель на Контакт), компания (Указатель на Компанию), ожидаемая дата закрытия (Дата), заметки (Строка), назначено (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
5. Активность: тип (Строка; например, звонок, электронная почта, встреча, заметка), тема (Строка), описание (Строка), срок (Дата), завершено (Дата), связано с (Указатель на Контакт или Сделку), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).

Безопасность:
- Установите ACL, чтобы только аутентифицированные пользователи могли получать доступ к данным; используйте правила на основе ролей или владельца, где это уместно (например, назначено, создано).
- Используйте разрешения на уровне класса, чтобы только аутентифицированные пользователи могли создавать/читать/обновлять/удалять эти классы.

Аутентификация:
- Регистрация (имя пользователя, электронная почта, пароль) и вход; поддержка выхода/сессии.

Поведение:
- Полный CRUD для Компании, Контакта, Сделки и Активности.
- Список сделок с фильтром по стадии и сортировкой по ожидаемой дате закрытия или updatedAt (вид воронки).
- Список активностей по связанным с (Контакт или Сделка).
- Опционально: обновления в реальном времени Live Queries для Сделки и Активности для обновлений панели управления/воронки.
- Опционально: оффлайн-фиксация для мобильных устройств (Контакты, Сделки, Активности).

Доставка:
- Создайте приложение Back4app с вышеуказанной схемой, ACL и любым необходимым облачным кодом.
- Сгенерируйте фронтенд и подключите его к этому бэкенду; разверните, чтобы приложение работало от начала до конца.

Нажмите кнопку ниже, чтобы открыть Агента с предзаполненной подсказкой этого шаблона.

Развернуть за минуты50 бесплатных запросов / месяцКредитная карта не требуется

API Playground

Попробуйте REST и GraphQL конечные точки для схемы CRM. Ответы из приведенных выше примерных данных — учетная запись Back4app не требуется.

Загрузка песочницы…

Использует ту же схему CRM (Контакт, Компания, Сделка, Активность), что и этот шаблон.

Пошаговая интеграция Flutter

Подключитесь к вашему Back4app бэкенду из приложения Flutter с использованием SDK Back4app Flutter.

  1. Шаг 1: Установите SDK Back4app Flutter

    Добавьте SDK Back4app для вашего стека (например, npm, pubspec или менеджер пакетов).

    YAML
    dependencies:
      flutter:
        sdk: flutter
      parse_server_sdk_flutter: ^7.0.0
  2. Шаг 2: Инициализируйте Back4app в вашем приложении

    Инициализируйте SDK Back4app при запуске приложения с вашим идентификатором приложения и URL-адресом сервера.

    Dart
    import 'package:parse_server_sdk_flutter/parse_server_sdk_flutter.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      await Parse().initialize(
        'YOUR_APP_ID',
        'https://parseapi.back4app.com',
        clientKey: 'YOUR_CLIENT_KEY',
        autoSendSessionId: true,
      );
    
      runApp(const MyApp());
    }
  3. Шаг 3: Запросите контакты и сделки

    Используйте SDK для получения объектов Контакта и Сделки; фильтруйте сделки по этапу для воронки.

    Dart
    Future<List<ParseObject>> getDeals({String stage = 'qualified'}) async {
      final query = QueryBuilder<ParseObject>(ParseObject('Deal'))
        ..whereEqualTo('stage', stage)
        ..orderByAscending('expectedCloseDate');
    
      final response = await query.query();
      if (response.success && response.results != null) {
        return response.results as List<ParseObject>;
      }
      return [];
    }
    Future<List<ParseObject>> getContacts() async {
      final query = QueryBuilder<ParseObject>(ParseObject('Contact'));
      final response = await query.query();
      if (response.success && response.results != null) {
        return response.results as List<ParseObject>;
      }
      return [];
    }
  4. Шаг 4: Создайте контакт или сделку

    Создайте новый Контакт или Сделку с обязательными полями и указателями (компания, контакт, назначено), затем сохраните.

    Dart
    Future<void> createDeal(String title, {String stage = 'lead', double? amount}) async {
      final deal = ParseObject('Deal')
        ..set('title', title)
        ..set('stage', stage);
      if (amount != null) deal.set('amount', amount);
      await deal.save();
    }
    Future<void> createContact(String name, {String? email, String? phone}) async {
      final contact = ParseObject('Contact')..set('name', name);
      if (email != null) contact.set('email', email);
      if (phone != null) contact.set('phone', phone);
      await contact.save();
    }
  5. Шаг 5: Обновите стадию сделки и действия

    Обновите Deal.stage при перемещении в воронке; создайте и перечислите Activity по relatedTo.

    Dart
    // Update deal stage (e.g. move in pipeline)
    Future<void> updateDealStage(String objectId, String stage) async {
      final deal = ParseObject('Deal')..objectId = objectId;
      deal.set('stage', stage);
      await deal.save();
    }
    
    // Delete a deal
    Future<void> deleteDeal(String objectId) async {
      final deal = ParseObject('Deal')..objectId = objectId;
      await deal.delete();
    }

Интеграция управления состоянием

Интегрируйте SDK Back4app с уровнем состояния вашего приложения (например, контекст, хранилище или сервисы) для состояния потока и контактов.

Полная модель данных

Скопируйте полную модель CRM для безопасной сериализации типов (например, класс, интерфейс или определение типа).

Dart
class Deal {
  final String? objectId;
  final String title;
  final double? amount;
  final String? stage;
  final DateTime? expectedCloseDate;
  final String? contactId;
  final String? companyId;
  final String? assignedToId;
  final DateTime? createdAt;
  final DateTime? updatedAt;

  Deal({
    this.objectId,
    required this.title,
    this.amount,
    this.stage = 'lead',
    this.expectedCloseDate,
    this.contactId,
    this.companyId,
    this.assignedToId,
    this.createdAt,
    this.updatedAt,
  });

  factory Deal.fromJson(Map<String, dynamic> json) {
    return Deal(
      objectId: json['objectId'] as String?,
      title: json['title'] as String,
      amount: (json['amount'] as num?)?.toDouble(),
      stage: json['stage'] as String? ?? 'lead',
      expectedCloseDate: json['expectedCloseDate'] != null ? DateTime.parse(json['expectedCloseDate']) : null,
      contactId: json['contact'] is Map ? (json['contact'] as Map)['objectId'] as String? : null,
      companyId: json['company'] is Map ? (json['company'] as Map)['objectId'] as String? : null,
      assignedToId: json['assignedTo'] is Map ? (json['assignedTo'] as Map)['objectId'] as String? : null,
      createdAt: json['createdAt'] != null ? DateTime.parse(json['createdAt']) : null,
      updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt']) : null,
    );
  }
}

Оффлайн-ориентированный и локальный хранилище данных

Используйте pin() и unpin(), чтобы контакты и сделки были доступны в оффлайне и синхронизировались при возвращении в онлайн.

Поддерживаемые SDK включают локальное хранилище данных. Закрепите объекты Контакт, Сделка и Деятельность, чтобы сохранить их на устройстве; запрашивайте закрепленные данные в оффлайне. Когда приложение снова в сети, синхронизируйтесь с сервером.

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

Dart
// Pin deals after fetch (offline-first)
Future<void> fetchAndPinDeals() async {
  final query = QueryBuilder<ParseObject>(ParseObject('Deal'))
    ..whereEqualTo('stage', 'qualified')
    ..orderByDescending('expectedCloseDate');
  final response = await query.query();
  if (response.success && response.results != null) {
    final results = response.results!.cast<ParseObject>();
    await ParseObject.pinAllObjects(results);
    // Now query from local store when offline:
    // QueryBuilder<ParseObject>(ParseObject('Deal')).fromLocalDatastore();
  }
}

// Unpin when no longer needed
Future<void> unpinAllDeals() async {
  await ParseObject.unpinAll('Deal');
}

Часто задаваемые вопросы

Распространенные вопросы о шаблоне бэкенда CRM приложения.

Что такое Back4app?
Почему использовать Back4app для Flutter CRM-приложения?
Как запросить сделки по этапу в Flutter?
Поддерживает ли Flutter SDK оффлайн-данные CRM?

Доверяют разработчики по всему миру

Присоединяйтесь к сообществу, строящему будущее приложений

G2 Users Love Us Badge

Готовы создать свое CRM-приложение?

Начните свой проект Flutter за считанные минуты. Кредитная карта не требуется.

Строить с ИИ-агентом