Шаблон бэкенда CRM приложения
Flutter — Схема, API и AI руководство
Готовая к производству Flutter CRM схема бэкенда и Стартовый комплект на Back4app: Контакт, Компания, Сделка, Активность, этапы воронки, ER-диаграмма, словарь данных, JSON-схема, API-площадка и однонажатийный AI агент для развертывания за минуты.
Ключевые выводы
На этой странице вы получите готовую к производству схему CRM, однонажатийный AI-подсказку и пошаговый код Flutter — так вы сможете выпустить приложение CRM без создания бэкенда.
- Разверните за считанные минуты — Вставьте подсказку AI Agent и получите работающее приложение с контактами, компаниями, сделками и конвейером.
- Безопасно по умолчанию — ACL и доступ на основе ролей, чтобы пользователи видели только свои назначенные сделки и данные.
- Flutter-родной SDK — Типизированные объекты, async/await, оффлайн-фиксация и Live Queries для обновлений конвейера.
- REST + GraphQL — Обе API сгенерированы автоматически; фильтруйте сделки по этапу, перечисляйте активности по relatedTo.
- Пять классов — _User (встроенный), Компания, Контакт, Сделка (конвейер), Активность (задачи/события).
Что такое шаблон бэкенда CRM приложения Flutter?
Шаблон бэкенда CRM приложения Flutter — это готовая к производству схема Back4app (Contact, Company, Deal, Activity) с типизированным Dart SDK, оффлайн-поддержкой и Live Queries. Создайте единую кодовую базу для iOS и Android: запрашивайте сделки по стадиям, управляйте контактами и компаниями, и синхронизируйте данные воронки в реальном времени. Никакого пользовательского бэкенда или REST glue — SDK Back4app Flutter обрабатывает аутентификацию, CRUD и локальное хранилище, чтобы вы могли сосредоточиться на UI и бизнес-логике.
Лучше всего для:
Обзор
Приложения 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-приложения, на одном взгляде.
ER диаграмма
Диаграмма «Сущность-связь» для модели данных CRM приложения Flutter.
Схема CRM: _Пользователь, Компания, Контакт, Сделка, Деятельность с указателями для компании, контакта, сделки, назначенного на, связанного с, созданного.
Просмотреть источник диаграммы
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 — вход в систему, затем запрос контактов и сделок, обновление воронки.
Просмотреть источник диаграммы
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Словарь данных
Полная справка по полям для каждого класса в схеме.
| Поле | Тип | Описание | Обязательно |
|---|---|---|---|
| objectId | String | Auto-generated unique identifier | авто |
| name | String | Full name of the contact | |
| String | Email address | — | |
| phone | String | Phone number | — |
| company | Pointer<Company> | Company this contact belongs to | — |
| notes | String | Free-form notes | — |
| createdBy | Pointer<_User> | User who created this contact | — |
| createdAt | Date | Auto-generated creation timestamp | авто |
| updatedAt | Date | Auto-generated last-update timestamp | авто |
9 поля в Contact
Безопасность и разрешения
Как владение, ACL и разрешения на уровне классов защищают данные в этой схеме CRM.
ACL на уровне строк
Используйте ACL и указатели (assignedTo, createdBy), чтобы пользователи видели и редактировали только свои назначенные сделки и связанные данные.
Разрешения на уровне классов
CLP ограничивают, какие роли или пользователи могут создавать, читать, обновлять или удалять объекты на уровне класса.
Владение на основе указателей
Deal.assignedTo и Activity.createdBy ссылаются на _User; Cloud Code может обеспечивать видимость и редактирование по ролям.
Схема (JSON)
Сырая определение схемы JSON — скопируйте и используйте в вашем Back4app приложении или импортируйте через API.
{
"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, чтобы Агент мог сгенерировать готовое к производству приложение за один раз.
Создайте приложение 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 и любым необходимым облачным кодом. - Сгенерируйте фронтенд и подключите его к этому бэкенду; разверните, чтобы приложение работало от начала до конца.
Нажмите кнопку ниже, чтобы открыть Агента с предзаполненной подсказкой этого шаблона.
API Playground
Попробуйте REST и GraphQL конечные точки для схемы CRM. Ответы из приведенных выше примерных данных — учетная запись Back4app не требуется.
Использует ту же схему CRM (Контакт, Компания, Сделка, Активность), что и этот шаблон.
Пошаговая интеграция Flutter
Подключитесь к вашему Back4app бэкенду из приложения Flutter с использованием SDK Back4app Flutter.
Шаг 1: Установите SDK Back4app Flutter
Добавьте SDK Back4app для вашего стека (например, npm, pubspec или менеджер пакетов).
YAMLdependencies: flutter: sdk: flutter parse_server_sdk_flutter: ^7.0.0Шаг 2: Инициализируйте Back4app в вашем приложении
Инициализируйте SDK Back4app при запуске приложения с вашим идентификатором приложения и URL-адресом сервера.
Dartimport '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: Запросите контакты и сделки
Используйте SDK для получения объектов Контакта и Сделки; фильтруйте сделки по этапу для воронки.
DartFuture<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: Создайте контакт или сделку
Создайте новый Контакт или Сделку с обязательными полями и указателями (компания, контакт, назначено), затем сохраните.
DartFuture<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: Обновите стадию сделки и действия
Обновите 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 для безопасной сериализации типов (например, класс, интерфейс или определение типа).
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 включают локальное хранилище данных. Закрепите объекты Контакт, Сделка и Деятельность, чтобы сохранить их на устройстве; запрашивайте закрепленные данные в оффлайне. Когда приложение снова в сети, синхронизируйтесь с сервером.
Ниже: закрепите результаты после получения и снимите закрепление, когда больше не нужны локальные копии.
// 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 приложения.
Готовы создать свое CRM-приложение?
Начните свой проект Flutter за считанные минуты. Кредитная карта не требуется.