A7 Data Server: Datenverwaltung online

Hallo Habr!


Alle Mitap-Einträge sind hier verfügbar: https://youtu.be/kJS5rfCWmPI


Wir testen Veröffentlichungen mit Abschriften von Berichten, die bei PiterJS erstellt wurden.
Da dies die erste Erfahrung ist, freuen wir uns über konstruktive Kritik und Verbesserungsvorschläge.


Sehen Sie sich Videos und Folien an und zum EntschlĂĽsseln - willkommen bei cat.


Der Bericht und das Protokoll wurden von Andrey Loginov , Technischer Direktor bei A7 Systems, erstellt.


Fangen wir an


Fast Big Data Server - Server für schnelle Big Data. Der A7 DS ist zunächst für Digital Twin konzipiert und verwaltet Rollen und Datenmuster. Aber das ist noch nicht alles, was er tun kann.


Was ist drin?


Mal sehen:


  • Objektdatenbank
  • Zeitliche (chronologische) Datenbank
  • Virtuelle JavaScript-Maschine (um ehrlich zu sein, js-ähnliche Sprache)
  • Zugriffsebenensystem
  • Anwendungsserver

Neben der Eingabe und Vererbung verfĂĽgt eine Objektdatenbank ĂĽber mehrere Funktionen:


  • BaumstĂĽtze
  • GrafikunterstĂĽtzung
  • Mount und Links
  • Räume
  • BindungsunterstĂĽtzung (Reaktivität)

Raum


Das Ungewöhnlichste hier ist der Weltraum.
Der Speicherplatz ist eine Instanz eines typischen Arbeitsbereichs.

Raum umfasst:


  • Daten
  • Shared-Data (Shared-Daten fĂĽr mehrere Räume. Zum Beispiel Wetter oder Wechselkurs)
  • Rollen (EigentĂĽmer, Benutzer, Gruppen)
    Das heiĂźt, Space ist ziemlich isoliert vom A7 DS-Server und anderen Spaces.

Wie man es benutzt


Nun ist die Frage: wie man es benutzt. Dies ist wahrscheinlich die wichtigste Frage.
Lassen Sie uns eine kleine mobile Anwendung auf ECMAScript erstellen.


Wir werden brauchen:


  • Mindestkenntnisse in C ++. (möglicherweise als Teil des Lehrplans)
  • Kenntnisse in ECMAScript und QML (Qt)
  • Android NDK (nur um dies zu kompilieren)

Meiner Meinung nach beziehen sich die besten Beispiele immer auf Geld. Versuchen Sie also, eine Online-Familienbrieftasche zu erstellen.


Erstellen Sie Objekte in der Objektdatenbank. Genauer gesagt werden wir Typen erstellen. Es ist bequemer, einen Editor zum Beschreiben von Objekten zu verwenden, aber wir sind nicht so und erstellen eine Beschreibung von Objekten in JSON.


Erstellen Sie zunächst ein Geldobjekt, in dem wir Bargeld, eine Kreditkarte und den Gesamtbetrag haben:


{ "name": "Money", "fields": [ {"name": "card","fieldtype": "value","datatype": "double", "def": 0}, {"name": "cash","fieldtype": "value","datatype": "double","def": 0}, {"name": "sum","fieldtype": "formula","datatype": "double", "def": "card+credit"} ] } 

Die Karten- und Bargeldfelder sind einfache Werte (der Standardwert ist 0). Sie können etwas kürzer schreiben:


 {"name": "card","value": 0.0}, {"name": "cash","value": 0.0} 

Das Summenfeld ist eine Formel (hi Reaktivität!). Sie können auch etwas kürzer schreiben:


 {"name": "sum","formula":"card+credit"} 

Jetzt werden wir ein Paar Jungen und Mädchen schaffen.


 { "name": "Pair", "fields": [ {"name": "boyfriend","fieldtype": "value","datatype": "Money", "def": "Money"}, {"name": "girlfriend","fieldtype": "value","datatype": "Money","def": "Money"}, {"name": "sum","fieldtype": "formula","datatype": "double", "def": "boyfriend.sum+girlfriend.sum"} ] } 

Feldsumme (wieder Hallo Reaktivität!), Begann Links zu Unterobjekten aufzunehmen:


 {"name": "sum","formula":"boyfriend.sum+girlfriend.sum"} 

Jetzt erhalten wir bei jeder Änderung einer Zahl automatisch eine Nachzählung des aktuellen Kontostands.


Es ist jedoch nĂĽtzlich, ein wenig Geschichte hinzuzufĂĽgen.


 {"name": "history","fieldtype": "list", "list":{"datatype": "History"}} 

In einem kurzen Eintrag


 {"name": "history", "list":{"datatype": "History"}} 

Nun, das eigentliche Objekt der Geschichte. Wer, was und wie viel hat sich geändert.


 { "name": "History", "fields": [ {"name": "who","fieldtype": "value","datatype": "string", "def": “”}, {"name": "which","fieldtype": "value","datatype": "string","def": “”}, {"name": "delta","fieldtype": "value","datatype": "double","def": 0} ] } 

HinzufĂĽgen von Triggern zum Paar:


 "functions": [{"functiontype": "before", "arguments": [boyfriend.cash], "code": "..." } ] 

Und der Triggercode selbst:


 { var historyItem= history.add(new History()); historyItem.who=”boyfriend”; historyItem.which=”cash”; history.delta=value-boyfriend.cash; return true; } 

Analog fĂĽgen wir Trigger fĂĽr boyfriend.card , girlfriend.card , girlfriend.cash .


Da wir aus unserer Anwendung eine große Anzahl von Paaren machen möchten, erstellen wir einen typischen SpacePair Raum und machen ihn zum SpacePair von Pair .
Fügen Sie standardmäßig zwei Benutzer hinzu
Girl
Boy


Tatsächlich ist der Raumgenerator zur Steuerung von Geldbörsen bereit.


FĂĽgen Sie einige Leerzeichen hinzu. Wenn Sie Speicherplatz hinzufĂĽgen, wird automatisch ein Datenbereich erstellt (und die Daten selbst mit Standardwerten). AuĂźerdem werden voreingestellte Benutzer und Gruppen erstellt (fĂĽr Speicherplatz).
Jeder Raum hat seine Benutzer und seine Gruppen.


Wir fangen an, den Kunden zu erledigen:


Zum Bibliotheksprojekt hinzufĂĽgen


 android { debug{ LIBS+= ../A7DS/Libs/android/libA17EDboClientBaseBind.a LIBS+= ../A7DS/Libs/android/libA17ClientLibBind.a } release{ LIBS+= ../A7DS/Libs/android/libA17EDboClientBaseBin.a LIBS+= ../A7DS/Libs/android/libA17ClientLibBin.a } } 

Lassen Sie uns die Datei main.cpp ein wenig reparieren


 #include <QApplication> #include <QQmlApplicationEngine> #include <QVariant> #include <QQmlEngine> //    *.h  #include "../A7DS/A17EBase/A17EDboClientBaseBin/a17edboclientbasebin.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; //    A7DS A17EDboClientBaseBin*client=new A17EDboClientBaseBin(engine,&app); //    A7DS client->init(engine); //    engine.load(QUrl(QLatin1String(QString("qrc:/main.qml").toLatin1()))); return app.exec(); } 

Der C ++ - Teil ist fertig und wir können mit QML fortfahren.


Erstellen Sie zunächst ein Komponentenpaar.


FĂĽgen Sie eine Komponente hinzu, um die Daten anzuzeigen.


MyLabelView.qml


 import QtQuick 2.7 import Astra.Dbo 17.0 Item {id: viewItem property alias field: field property string label: "  " width: parent.width height: 100 DboField{ id: field } Text { id: labelItem text: viewItem.label anchors.left: parent.left anchors.right: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom } Text { id: valueItem text: field.value anchors.right: parent.right anchors.left: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom } } 

MyLabelEdit.qml


 import QtQuick 2.7 import Astra.Dbo 17.0 Item {id: viewItem property alias field: field property string label: "  " width: parent.width height: 100 DboField{ id: field } Text { id: labelItem text: viewItem.label anchors.left: parent.left anchors.right: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom } TextInput { id: valueItem text: field.value anchors.right: parent.right anchors.left: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom onEditingFinished:{ field.value=text; } } } 

Lassen Sie uns nun das Hauptfenster zusammenbauen
MyLabelEdit.qml


 import QtQuick 2.7 import Astra.Dbo 17.0 import QtQuick.Controls 1.5 {id:appWindow visible: true width: 640 height: 480 property var component; property var sprite; ApplicationWindow {id: viewItem property alias field: field property string label: "  " property string host: "127.0.0.1" ////  A7 DS property int port: 8989 //  A7 DS property string isBoy: (dboconnection.login=="Boy") property var myselfMoney: (isBoy)?boyfriend:girlfriend property var myfriendMoney: (!isBoy)?boyfriend:girlfriend /* ,         */ DboObject{id:boyfriend parentObject: rootData parentFieldName: "boyfriend" } DboObject{id:girlfriend parentObject: rootData parentFieldName: "girlfriend" } DboModel{id:history parentObject: rootData parentFieldName: "history" } /* ,   ,      A7 DS */ Column{ z: 10 visible: (! dboconnection.isConnect) anchors.fill: parent TextInput{id:login width: parent.width height: 100 } TextInput{id:password width: parent.width height: 100 } Button{id:btn width: parent.width height: 100 text: ”” onClicked: dboconnection.connectToDbo( login.text, password..text, viewItem.host, viewItem.port); } } SwipeView{ anchors.fill: parent currentIndex: 1 ///      Page{ ListView{ model: history delegate: Text{ text: model.who+” ”+model.which+” ”+model.delta } } } ///      Page{ Column{ anchors.fill: parent MyLabelEdit{id:myCash; label: “ ” field.name: “cash”; field.parentObject: myselfMoney } MyLabelEdit{id:myCard; label: “ ” field.name: “card”; field.parentObject: myselfMoney } MyLabelView{id:mySum; label: “  ” field.name: “sum”; field.parentObject: myselfMoney } MyLabelView{id:myfriendCash; label: “ ” field.name: “cash”; field.parentObject: myfriendMoney } MyLabelView{id:myfriendCard; label: “ ” field.name: “card”; field.parentObject: myfriendMoney } MyLabelView{id:myfriendSum; label: “  ” field.name: “sum”; field.parentObject: myfriendMoney } MyLabelView{id:mypairSum; label: “  ” field.name: “sum”; field.parentObject: mypairMoney } } } } } Text { id: labelItem text: viewItem.label anchors.left: parent.left anchors.right: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom } TextInput { id: valueItem text: field.value anchors.right: parent.right anchors.left: parent.horizontalCenter anchors.top: parent.top anchors.bottom: parent.bottom onEditingFinished:{ field.value=text; } } } 

Umm. "Aber was ist mit dem versprochenen Digital Twin und anderen Nishtyaki?" - Der aufmerksame Leser wird fragen.
"Bindung ist gut, aber wo sind die Reittiere und Grafiken?" - Er wird hinzufĂĽgen.


Dies sind faire Fragen, auf die in den folgenden Artikeln Antworten gegeben werden;).

Source: https://habr.com/ru/post/de422281/


All Articles