Entwerfen Sie einen Datensammler mit Vue

Entwerfen Sie einen Datensammler mit Vue

Szenario

Es gibt derzeit ein Szenario im Geschäft. Wenn sich das Geschäftsverhalten ändert, müssen Daten zum Verhalten jedes Moduls erfasst werden. Die Daten können zur Überprüfung oder für Szenarien wie die Überwachung verwendet werden.

Kernthemen

Vereinfacht ausgedrückt besteht diese Anforderung darin, die Statusänderungen jedes Moduls aufzuzeichnen und sie dann zu formatieren und auf den Server hochzuladen.
Zur Lösung des Problems stehen zwei Möglichkeiten zur Verfügung: eine ist die Statusüberwachung, die zweite die aktive Erfassung.

Statusüberwachung

Vorteile der staatlichen Überwachung

Erkennen Sie schnell die Statusänderungen verschiedener Module durch die Verwendung von Statusverwaltung und Wachth-Mechanismus. Anschließend können Sie die Daten abrufen, formatieren und an den Server senden.

Nachteile staatlicher Überwachung

  • Wiederholte Überwachung von Wacth. Solange Wacth verwendet wird, wird unabhängig davon, ob die Daten benötigt werden oder nicht, die Änderung ausgelöst und das Verhalten überwacht, sobald sich der Status ändert.
  • Wiederholte Abhängigkeiten. Wenn es beispielsweise einen globalen Start- und Endzustand gibt, müssen Sie bei Verwendung einer Uhr diesen Zustand in einer anderen Uhr beurteilen, oder es gibt ein globales Zeitmodul usw.
  • Wiederholtes Schreiben, dieselbe Datenformatierungsmethode muss auf verschiedenen Monitoren geübt werden
  • Die Daten werden chaotisch verteilt. Obwohl für den globalen Upload dieselbe Pipeline verwendet wird, ist die Unterstützung für das Zusammenführen und Deduplizieren von Daten in derselben Pipeline oder für andere benutzerdefinierte Vorgänge im Szenario unterschiedlicher Datentypen in derselben Pipeline schwach.
  • Es ist schwierig, zwischen Szenarien zu unterscheiden. Es gibt kein Problem mit der Überwachung, die durch normale Prozesse ausgelöst wird. Wenn die Überwachung jedoch durch abnormale Szenarien ausgelöst wird, führt dies zu komplexen Beurteilungen.
  • Die Beschreibung ist noch relativ abstrakt. Siehe das Codebeispiel
Funktion useA(){
 Uhr (neu, alt) {
  wenn(starten){
    wenn(neuer.Typ == "brauchen")
     Konstante a = {
      a:neu.a
     }
     konstant aa = {
      aa:neu.aa
     }
     hochladen(a)
     hochladen(aa)
  }
 }
}
// Mehrere Daten verstreut Funktion useB(){
 // Wiederholte Überwachung watch(new,old){
 // Globale Beurteilung if(start){
    // Unterschiedliche Zustandsbeurteilung, wenn (new.type =='need')
     const b = {
      b:neu.b
     }
     //Datenformat wiederholen const aa = {
      b:neu.aa
     }
     hochladen(b)
     hochladen(aa)
  }
 }
}

Ideen zur Umsetzung des Wiederaufbaus

  • Sammlung von Abhängigkeiten (Listener-Muster)
  • Staatsvereinigung
  • Datenautonomie (Strategiemodus)

Abhängigkeitssammlung

  • Kernidee: Wir hoffen, mit demselben Collector den gesamten Geschäftsprozess lösen zu können. Datenänderungen treten bei jeder Änderungspartei auf. Die Daten werden mit der vom Collector bereitgestellten Standardformatierungsmethode verarbeitet und dann an den Collector übergeben. Nach dem Empfang der Daten fügt der Collector sie je nach Datenformat in verschiedene Cache-Kanäle ein. Der Cache-Kanal speichert sie erfolgreich und benachrichtigt den Listener über die Geschäftsverarbeitung. Je nach Datentyp werden unterschiedliche Verarbeitungsmethoden ausgeführt und schließlich an den Server gesendet.
  • Der spezifische Code lautet wie folgt
/*
 * @Description: Öffentliche Klassen sammeln * @version: 1.0.0
 * @Autor: Wu Wenzhou* @Datum: 2021-04-20 19:44:35
 * @LetzteEditoren: Wu Wenzhou* @LetzteEditZeit: 2021-04-22 15:20:50
 */
/**
 * @name: Dep
 * @msg: Abhängigkeitssammlungsobjekt */
Klasse Dep {
  private Subs: beliebig = []
  // Beobachter hinzufügen public addSub(sub: any) {
    wenn (sub und sub.update) {
      dies.subs.push(sub)
    }
  }
  //Benachrichtigung senden public notify(content: any) {
    dies.subs.forEach((sub: any) => {
      sub.update(Inhalt)
    })
  }
}
/**
 * @name: Beobachter
 * @msg: Beobachterobjekt*/
Klasse Watcher {
  private cb!: (Argument: beliebig) => ungültig
  Konstruktor(cb: (arg: any) => void) {
    // Die Callback-Funktion ist für die Aktualisierung von this.cb = cb verantwortlich
  }
  // Aktualisieren, wenn sich die Daten ändern update(content: any) {
    dies.cb(Inhalt)
  }
}
/**
 * @name: Kanal
 * @msg: Nachrichtenpipeline zwischenspeichern*/
Klasse Kanal {
  //Private Warteschlange des Pipeline-Speicherarrays: any = []
  // Pipelinegröße privat limitSize = 1
  //Pipeline-Name öffentlicher Name: Zeichenfolge
  Konstruktor(Name: Zeichenfolge, Grenzgröße = 1) {
    dieser.name = Name
    // Die Mindestgröße beträgt 1
    Grenzgröße = Grenzgröße >= 1 ? Grenzgröße : 1
    this.limitSize = Grenzgröße
  }
  /**
   * @name: drücken
   * @msg: Daten hinzugefügt*/
  push(Element: beliebig) {
    // Entfernen Sie das erste, wenn die Grenzgröße überschritten wird, if (this.limitSize == this.queue.length) {
      diese.Warteschlange.Verschiebung()
    }
    diese.Warteschlange.push(Element)
  }
  /**
   * @name: getLast
   * @msg: Die zuletzt hinzugefügten Daten abrufen*/
  getLast() {
    wenn (diese.Warteschlangenlänge > 0) {
      gib diese.Warteschlange zurück[diese.Warteschlangenlänge - 1]
    } anders {
      neuen Fehler werfen ('kein Artikel zurückgegeben')
    }
  }
  /**
   * @name: getLastIndex
   * @msg: Holen Sie sich die letzten Countdown-Daten */
  getLastIndex(index: zahl) {
    versuchen {
      gib diese.Warteschlange zurück[diese.Warteschlangenlänge - Index - 1]
    } Fehler abfangen {
      neuen Fehler werfen ('kein Artikel zurückgegeben')
    }
  }
  /**
   * @name: istEmpty
   * @msg: Ist das Rohr leer? */
  istLeer() {
    gibt diese.Warteschlangenlänge zurück == 0
  }
}
Exportklasse Sammlung {
  //Abhängigkeitssammlungsobjekt private dep = new Dep()
  // Klassifizierung jedes Datenkanals private dataQueue = ['A', 'B', 'C']
  // Kanalsammlung private channelMap = new Map()
  // Upload-Warteschlange private MQ!: LiveCollectionMQ
  // Strategiemodus: Verschiedene Datentypen entsprechen unterschiedlichen Verarbeitungsmechanismen private strategies = {
    EIN: () => {
      // Sie können entsprechende Daten in verschiedenen Pipelines für unterschiedliche logische Verarbeitungen erhalten},
    B: () => {

    },
    C: () => {
    },
  } als Datensatz<Benachrichtigungstyp, beliebig>
  Konstruktor() {
    dies.init()
  }
  private init() {
    // Den Watcher initialisieren
    dies.intWatcher()
    // Initialisiere den Kanal this.initChannel()
    // Daten initialisieren this.initData()
    // Initialisiere die Warteschlange this.initMQ()
  }
  /**
   * @name:intWatcher
   * @msg: Listener initialisieren */
  private intWatcher() {
    dies.dep.addSub(
      neuer Watcher((Typ: Benachrichtigungstyp) => {
        const handlerBack = this.getHandler(Typ)
        handlerBack()
      }),
    )
  }
  /**
   * @name: initChannel
   * @msg: Kanal initialisieren */
  private initChannel() {
    dies.dataQueue.forEach(item => {
      this.channelMap.set(Element, neuer Kanal(Element, 3))
    })
  }
  /**
   * @name: initData
   * @msg: Kanaldaten initialisieren * @param {*}
   */
  private initData() {
    
  }
  /**
   * @name: initMQ
   * @msg: Upload-Warteschlange initialisieren*/
  private initMQ() {

  }
  /**
   * @name: getMQ
   * @msg: Nachrichtenwarteschlange abrufen */
  öffentliche getMQ() {
    gib dies zurück.MQ
  }
  /**
   * @name:getChannel
   * @msg: Ruft die Kanalinstanz basierend auf dem Kanalnamen ab * @param {name} Kanalname */
  private getChannel(name: Benachrichtigungstyp) {
    wenn (diese.channelMap.get(name)) {
      gib this.channelMap.get(Name) zurück
    } anders {
      wirf einen neuen Fehler (,kein Kanal‘)
    }
  }
  /**
   * @name:benachrichtigen
   * @msg: Abhängige Benachrichtigungsmethode * @param {NotifyType} Typ
   * @param {any} mes
   */
  öffentliche Benachrichtigung (Typ: Benachrichtigungstyp, mes: beliebig) {
    // Pipeline-Cache festlegen this.setChannel(type, mes)
    // Globaler einheitlicher Beurteilungsstatus, um zu bestimmen, ob Daten verteilt werden sollen, wenn (state.value.type) {
      this.dep.notify(Typ)
    }
  }
  /**
   * @name: setChannel
   * @msg: Kanal-Cache festlegen * @param {NotifyType} Name
   * @param {any} mes
   */
  private setChannel(name: Benachrichtigungstyp, mes: beliebig) {
    const channel = this.getChannel(name)
    channel.push(Nachrichten)
  }
  /**
   * @name:getHandler
   * @msg: abrufen * @param {NotifyType} Name
   */
  private getHandler(name: Benachrichtigungstyp) {
    gib diese.Strategien[Name] zurück
  }
  /**
   * @name: getChannelLast
   * @msg: Holen Sie sich die neuesten Daten in der angegebenen Pipeline * @param {NotifyType} Name
   * @zurückkehren {*}
   */
  öffentliche getChannelLast(Name: Benachrichtigungstyp) {
    versuchen {
      const channel = this.getChannel(name)
      Rückgabekanal.getLast()
    } Fehler abfangen {
      neuen Fehler werfen (Fehler)
    }
  }
  /**
   * @name: getChannelLast
   * @msg: Holen Sie sich die Daten in umgekehrter Reihenfolge in der angegebenen Pipeline * @param {NotifyType} Name
   * @param {Zahl} Index
   */
  public getChannelItemByLastIndex(name: BenachrichtigenTyp, index: zahl) {
    versuchen {
      const channel = this.getChannel(name)
      Rückgabekanal.getLastIndex(index)
    } Fehler abfangen {
      neuen Fehler werfen (Fehler)
    }
  }
  /**
   * @name: generierenA
   * @msg: A-Datenmethode generieren */
  öffentliche generateA() {
    
  }
  /**
   * @name: generierenB
   * @msg: B-Datenmethode generieren */
  öffentliche generateB() {
    
  }
  /**
   * @name: generateC
   * @msg: C-Datenmethode generieren */
  öffentliche generateC() {
    
  }
}

exportiere const CollectionHelper = neue Sammlung()

Zusammenfassen

  • Ich denke, eine gute Möglichkeit, ein Framework zu verstehen, besteht darin, seine Kernprinzipien zu verwenden, um ein Prinzip zu lösen, genau wie zuvor der Plug-In-Mechanismus von Webpack. Dieses Mal verwende ich die Abhängigkeitssammlung von Vue.
  • Staatliche Autonomie und einheitliche Verantwortlichkeiten sind eine gute Angewohnheit für die Codekapselung

Oben sind die Details zum Entwerfen eines Datensammlers mit Vue aufgeführt. Weitere Informationen zum Entwerfen von Datensammlern mit Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Implementierungsprinzips der bidirektionalen Datenbindung von Vue2.0/3.0
  • Analyse des Problems des Datenverlusts durch erzwungene Aktualisierung von Vuex
  • Wie verfolgt Vue Datenänderungen?
  • Vue + Canvas realisiert den Effekt der Aktualisierung des Wasserfalldiagramms von oben nach unten in Echtzeit (ähnlich wie QT).
  • Lösung für das Vue-Datenzuweisungsproblem
  • Vue setzt die Daten auf ihren ursprünglichen Zustand zurück
  • Analyse und Lösung von Datenverlusten während der Wertübertragung von Vue-Komponenten
  • SpringBoot + Vue realisiert die Funktion zum Hinzufügen von Daten
  • Beispiel für handschriftliches Vue2.0-Daten-Hijacking
  • Implementierungsmethode für die bidirektionale Bindung von Vue-Daten
  • Vermeiden Sie den Missbrauch zum Lesen von Daten in Vue

<<:  Detaillierte grafische und textliche Anweisungen zur Installation von MySQL 5.7.20 unter Mac OS

>>:  WePY-Cloud-Entwicklungspraxis im Linux-Befehlsabfrage-Applet

Artikel empfehlen

Detaillierte Erläuterung der langsamen MySQL-Protokollabfrage

Langsame Protokollabfragefunktion Die Hauptfunkti...

Lösen Sie das Problem der Verwendung des Swiper-Plugins in Vue

Da ich dieses Plugin beim Schreiben einer Demo ve...

Vue-CLI3.x stellt Projekte automatisch auf dem Server bereit

Inhaltsverzeichnis Vorwort 1. Installieren Sie sc...

So verwenden Sie den Vue-Filter

Inhaltsverzeichnis Überblick Filter definieren Ve...

Zusammenfassung der verschiedenen Haltungen der MySQL-Berechtigungseskalation

Inhaltsverzeichnis 1. Schreiben Sie Webshell in d...

Detaillierte Erläuterung der Mybatis-Sonderzeichenverarbeitung

Vorwort: Mybatis-Sonderzeichenverarbeitung, Verar...

JavaScript zum Erzielen eines Produktlupeneffekts

In diesem Artikel wird der spezifische JavaScript...

Implementierung eines Docker-Cross-Host-Netzwerks (manuell)

1. Einführung in Macvlan Vor dem Aufkommen von Ma...

So erstellen Sie eine Ansicht in MySQL

Grundlegende Syntax Sie können eine Ansicht mit d...

Vue3 Vue CLI-Konfiguration für mehrere Umgebungen

Inhaltsverzeichnis 1. Einleitung 2. Umschalten 1....

Vue-Grundlagen-Tutorial: Bedingtes Rendering und Listen-Rendering

Inhaltsverzeichnis Vorwort 1.1 Funktion 1.2 So st...