Ein Frontend-Backend-Datenmanagement-Plugin erstellen
Die vorherigen Beispiele waren entweder rein clientseitig (Block, Feld, Aktion) oder Client + einfache Schnittstelle (Einstellungsseite). Dieses Beispiel zeigt ein vollständigeres Szenario — der Server definiert eine Datentabelle, der Client erbt von TableBlockModel, um die volle Tabellen-Funktionalität zu erhalten, und ergänzt sie um benutzerdefinierte Feld-Components und Aktionsbuttons, sodass ein Datenmanagement-Plugin mit CRUD entsteht.
Dieses Beispiel führt die zuvor gelernten Block-, Feld- und Aktions-Bausteine zusammen und zeigt den Entwicklungsprozess eines vollständigen Plugins.
Es empfiehlt sich, zunächst Folgendes zu kennen, damit die Entwicklung reibungsloser verläuft:
- Erstes Plugin schreiben — Plugin-Erstellung und Verzeichnisstruktur
- Plugin — Plugin-Einstiegspunkt und
load()-Lebenszyklus - FlowEngine → Block-Erweiterung — BlockModel, CollectionBlockModel, TableBlockModel
- FlowEngine → Feld-Erweiterung — ClickableFieldModel, bindModelToInterface
- FlowEngine → Aktions-Erweiterung — ActionModel, ActionSceneEnum
- i18n Internationalisierung — Schreibweise von Übersetzungsdateien und Verwendung von
tExpr() - Server-Entwicklungs-Übersicht — Grundlagen der serverseitigen Plugin-Entwicklung
Endergebnis
Wir erstellen ein „To-do"-Datenmanagement-Plugin mit folgenden Funktionen:
- Server definiert eine Datentabelle
todoItemsund schreibt beim Installieren des Plugins automatisch Beispieldaten ein - Client erbt von
TableBlockModelund erhält einen sofort einsatzbereiten Tabellenblock (Feldspalten, Pagination, Aktionsleiste usw.) - Benutzerdefiniertes Feld-Component — rendert das Feld priority mit farbigen Tags
- Benutzerdefinierter Aktionsbutton — „Neues To-do"-Button öffnet ein Modal mit Formular zum Erstellen eines Datensatzes
Vollständigen Quellcode siehe @nocobase-example/plugin-custom-table-block-resource. Wenn Sie es lokal ausprobieren möchten:
Im Folgenden bauen wir dieses Plugin Schritt für Schritt von Grund auf auf.
Schritt 1: Plugin-Gerüst erstellen
Im Stammverzeichnis des Repositories ausführen:
Detaillierte Erläuterungen siehe Erstes Plugin schreiben.
Schritt 2: Datentabelle definieren (Server)
Erstellen Sie src/server/collections/todoItems.ts. NocoBase lädt automatisch die Collection-Definitionen unter diesem Verzeichnis:
Im Unterschied zum Einstellungsseiten-Beispiel ist hier keine manuelle Resource-Registrierung erforderlich — NocoBase erzeugt für jede Collection automatisch die Standard-CRUD-Schnittstellen (list, get, create, update, destroy).
Schritt 3: Berechtigungen und Beispieldaten konfigurieren (Server)
Bearbeiten Sie src/server/plugin.ts, konfigurieren Sie in load() ACL-Berechtigungen und schreiben Sie in install() Beispieldaten ein:
Wichtige Punkte:
acl.allow()—['list', 'get', 'create', 'update', 'destroy']öffnet vollständige CRUD-Berechtigungen,'loggedIn'bedeutet, dass eingeloggte Benutzer Zugriff habeninstall()— wird nur beim erstmaligen Installieren des Plugins ausgeführt, geeignet zum Einfügen von Initialdatenthis.db.getRepository()— holt über den Collection-Namen das Datenoperations-Objekt- Kein
resourceManager.define()nötig — NocoBase erzeugt für die Collection automatisch CRUD-Schnittstellen
Schritt 4: Block-Modell erstellen (Client)
Erstellen Sie src/client-v2/models/TodoBlockModel.tsx. Durch Erweitern von TableBlockModel erhalten Sie sofort einen vollständigen Tabellenblock — Feldspalten, Aktionsleiste, Pagination, Sortierung usw., ohne renderComponent selbst schreiben zu müssen.

In der praktischen Plugin-Entwicklung können Sie, wenn keine Anpassung von TableBlockModel nötig ist, diesen Block tatsächlich nicht erweitern und nicht registrieren — Benutzer können beim Hinzufügen einfach „Tabelle" auswählen. Dieser Artikel definiert und registriert TodoBlockModel (durch Erweitern von TableBlockModel) nur, um den Definitions- und Registrierungsablauf eines Block-Modells zu zeigen. TableBlockModel kümmert sich um alles Weitere (Feldspalten, Aktionsleiste, Pagination usw.).
Über filterCollection schränken Sie diesen Block auf die Datentabelle todoItems ein — wenn Benutzer einen „Todo block" hinzufügen, erscheint in der Datentabellen-Auswahlliste nur todoItems und keine anderen, nicht zugehörigen Tabellen.

Schritt 5: Benutzerdefiniertes Feld-Component erstellen (Client)
Erstellen Sie src/client-v2/models/PriorityFieldModel.tsx. Das Feld priority wird mit farbigen Tags gerendert, was anschaulicher ist als reiner Text:

Nach der Registrierung können Sie in der Konfiguration der priority-Spalte der Tabelle im Dropdown „Feld-Component" zu „Priority tag" wechseln.
Schritt 6: Benutzerdefinierten Aktionsbutton erstellen (Client)
Erstellen Sie src/client-v2/models/NewTodoActionModel.tsx. Beim Klick auf den „Neues To-do"-Button öffnet sich über ctx.viewer.dialog() ein Modal, in dem nach Ausfüllen des Formulars ein Datensatz erstellt wird:

Wichtige Punkte:
ActionSceneEnum.collection— der Button erscheint in der Aktionsleiste oben im Blockon: 'click'— überregisterFlowauf dasclick-Ereignis des Buttons hörenctx.viewer.dialog()— die in NocoBase eingebaute Modal-Funktionalität;contentempfängt eine Funktion, der Parameterviewkannview.close()aufrufen, um das Modal zu schließenresource.create(values)— ruft die create-Schnittstelle der Datentabelle auf, um einen Datensatz zu erstellen; nach dem Erstellen wird die Tabelle automatisch aktualisiertobservable+observer— verwenden die von flow-engine bereitgestellte reaktive Zustandsverwaltung anstelle vonuseState; das Component reagiert automatisch auf Änderungen vonformState.loading
Schritt 7: Mehrsprachen-Dateien hinzufügen
Bearbeiten Sie die Übersetzungsdateien unter src/locale/ des Plugins:
Beim erstmaligen Hinzufügen einer Sprachdatei muss die Anwendung neu gestartet werden, damit sie wirksam wird.
Mehr zur Schreibweise von Übersetzungsdateien und zur Verwendung von tExpr() siehe i18n Internationalisierung.
Schritt 8: Im Plugin registrieren (Client)
Bearbeiten Sie src/client-v2/plugin.tsx. Es sind zwei Dinge zu tun: die Modelle registrieren und todoItems an der clientseitigen Datenquelle anmelden.
Eine Datentabelle im Plugin-Code manuell über addCollection zu registrieren, ist eine seltene Vorgehensweise und dient hier nur der Veranschaulichung des vollständigen Frontend-Backend-Ablaufs. In tatsächlichen Projekten werden Datentabellen in der Regel von Benutzern in der NocoBase-Oberfläche angelegt und konfiguriert oder über API / MCP usw. verwaltet — eine explizite Registrierung im Client-Code des Plugins ist nicht nötig.
Tabellen, die mit defineCollection definiert werden, sind serverseitige interne Tabellen und erscheinen standardmäßig nicht in der Datentabellen-Auswahlliste eines Blocks. Nach manueller Registrierung über addCollection können Benutzer beim Hinzufügen eines Blocks auch todoItems auswählen.

Wichtige Punkte:
registerModelLoaders— registriert per Lazy Loading drei Modelle: Block, Feld, Aktionthis.app.eventBus— anwendungsweiter Event-Bus, zum Abhören von Lebenszyklus-EventsdataSource:loaded-Event — wird ausgelöst, nachdem die Datenquelle geladen wurde.addCollectionmuss in diesem Event-Callback aufgerufen werden, daensureLoaded()nachload()ausgeführt wird und alle Collections zunächst leert und dann neu setzt — ein direkter Aufruf vonaddCollectioninload()würde überschriebenaddCollection()— registriert die Collection an der clientseitigen Datenquelle. Felder müsseninterfaceunduiSchemaenthalten, damit NocoBase weiß, wie sie zu rendern sindfilterTargetKey: 'id'— muss gesetzt werden, gibt das Feld zur eindeutigen Identifizierung von Datensätzen an (üblicherweise der Primärschlüssel). Ohne diese Einstellung erscheint die Collection nicht in der Datentabellen-Auswahlliste eines Blocks- Die
defineCollectionauf der Server-Seite erstellt die physische Tabelle und das ORM-Mapping, währendaddCollectionauf der Client-Seite der UI bekannt macht, dass diese Tabelle existiert — beide Seiten zusammen ermöglichen die Frontend-Backend-Verknüpfung
Schritt 9: Plugin aktivieren
Nach der Aktivierung:
- Erstellen Sie eine neue Seite, klicken Sie auf „Block hinzufügen", wählen Sie „Todo block" und binden Sie ihn an die Datentabelle
todoItems - Die Tabelle lädt die Daten automatisch und zeigt Feldspalten, Pagination usw. an
- Unter „Aktion konfigurieren" fügen Sie den Button „New todo" hinzu, durch dessen Klick sich ein Modal mit Formular zum Erstellen von Datensätzen öffnet
- In der Spalte priority wechseln Sie unter „Feld-Component" zu „Priority tag" — priority wird dann mit farbigen Tags angezeigt
Vollständiger Quellcode
- @nocobase-example/plugin-custom-table-block-resource — Vollständiges Beispiel eines Frontend-Backend-Datenmanagement-Plugins
Zusammenfassung
In diesem Beispiel verwendete Fähigkeiten:
Verwandte Links
- Erstes Plugin schreiben — Plugin-Gerüst von Grund auf erstellen
- FlowEngine-Übersicht — Grundlegende Verwendung von FlowModel und registerFlow
- FlowEngine → Block-Erweiterung — BlockModel, TableBlockModel
- FlowEngine → Feld-Erweiterung — ClickableFieldModel, bindModelToInterface
- FlowEngine → Aktions-Erweiterung — ActionModel, ActionSceneEnum
- Einen benutzerdefinierten Anzeige-Block erstellen — BlockModel-Grundbeispiel
- Ein benutzerdefiniertes Feld-Component erstellen — FieldModel-Grundbeispiel
- Einen benutzerdefinierten Aktionsbutton erstellen — ActionModel-Grundbeispiel
- Server-Entwicklungs-Übersicht — Grundlagen serverseitiger Plugins
- Server → Collections — defineCollection und addCollection
- Resource API Cheatsheet — Vollständige Methoden-Signaturen von MultiRecordResource / SingleRecordResource
- Plugin — Plugin-Einstiegspunkt und load()-Lebenszyklus
- i18n Internationalisierung — Schreibweise von Übersetzungsdateien und Verwendung von tExpr
- Server → ACL — Berechtigungskonfiguration
- Server → Plugin — Lebenszyklus serverseitiger Plugins
- Context → Häufige Fähigkeiten — ctx.viewer, ctx.message usw.
- Component-Entwicklung — Verwendung von Antd Form und anderen Components
- Vollständige FlowEngine-Dokumentation — Vollständige Referenz zu FlowModel, Flow, Context

