Vue3 + el-table realisiert Zeilen- und Spaltenkonvertierung

Vue3 + el-table realisiert Zeilen- und Spaltenkonvertierung

Zeilen-Spalten-Konvertierung

Warum tritt das Problem der Zeilen- und Spaltenkonvertierung auf? Denn der Benutzer möchte ein großes Formular mit mehreren Spalten sehen, die Datenbank speichert jedoch nur „einspaltige“ Daten. Es muss also eine Umstellung vorgenommen werden, damit die Kunden es bequemer und klarer sehen können.

Es gibt eine Möglichkeit, SQL zu schreiben, das diese Art der Zeilen-Spalten-Konvertierung unterstützt, aber es ist kompliziert zu schreiben und schwer zu verstehen.
Daher ziehe ich es persönlich vor, den Konvertierungsvorgang auf dem Front-End zu implementieren, da dadurch Leistungsressourcen auf dem Back-End gespart werden können.

Hier nehmen wir das Transkript als Beispiel, um die spezifische Implementierungsmethode zu demonstrieren.

Analysieren Sie die Zusammensetzung des Transkripts

Diese Hassliebe dürfte jedem bekannt sein. Dies ist ein typisches Szenario, das eine Zeilen- und Spaltenkonvertierung erfordert.
Sehen wir uns an, wie das Transkript aussieht: (Bilder aus dem Internet, bei Verstößen bitte löschen)

Transkript

Nach der Analyse können wir die folgenden Grundelemente erhalten:

  • Fächer: Chinesisch, Mathematik, Physik, Chemie usw. Bestimmen Sie die Anzahl der Spalten
  • Schüler: Bestimmen Sie die Anzahl der Zeilen
  • Klassen und Klassen: Klasse 1, 12, Klasse 2 usw. Klassifizierungsgrundlage
  • Prüfungen: Zwischenprüfungen, Abschlussprüfungen usw. Klassifizierungsgrundlage
  • Ergebnisse: Bestimmen Sie den Dateninhalt.

Klassifizierung der Elemente:

  • Klassifizierungsgrundlage: bezeichnet die Abfragebedingungen zur Generierung eines Großformulars, bei denen Daten gleicher Kategorie zu einem Großformular aggregiert werden.
  • Betreff: Bestimmen Sie die Anzahl der Spalten. Je mehr Betreffe es gibt, desto mehr Spalten gibt es.
  • Schüler: Bestimmen Sie die Anzahl der Reihen. Je mehr Schüler es gibt, desto mehr Reihen wird es geben.

Werfen wir einen Blick auf den Entwurf in der Datenbank. Im Allgemeinen werden mehrere Basistabellen und eine Punktetabelle entworfen.

  • Betrefftabelle
  • Schülertisch
  • Stundenplan
  • Prüfungsplan
  • Ergebnisse

Aus Platzgründen werde ich hier nicht auf die einzelnen Felder eingehen. Es wäre zu kompliziert, sie alle vorzustellen.

Transkript erstellt mit vue3 + el-table

Transkript nach Zeilen- und Spaltenkonvertierung

Es stehen Fächer, Schüler, Gesamtpunktzahlen, Durchschnittspunktzahlen, Höchstpunktzahlen, Niedrigstpunktzahlen und Ranglisten zur Verfügung. Auch verschiedene Sortiermöglichkeiten sind möglich. Mal sehen, wie das erreicht wird.

Front-End-Simulationsdaten

Lassen Sie uns die Daten auf dem Frontend simulieren. (Vereinfachter Modus)

// Betreff - Spalte bestimmen const subject = [
  { id: 1, name: 'Mathematik' },
  { id: 2, name: 'Chinesisch' },
  { id: 3, name: 'Physik' },
  { id: 4, name: 'Chemie' }
]

// Student - Zeile bestimmen const student = [
  { id: 1, name: 'Name' },
  { ID: 2, Name: 'Li Si' },
  { ID: 3, Name: 'Name' },
  { ID: 4, Name: "Zhao Liu" }
]

// Klassen - Klassifizierung basierend auf const classes = [
  { id: 1, name: 'Klasse 1, Jahr 1' },
  { id: 2, name: 'Klasse 2, Stufe 1' }
]

//Prüfung - Klassifikationsbasis const exam = [
  { id: 1, name: 'Zwischenprüfung' },
  { id: 2, name: 'Abschlussprüfung' }
]

// Score - Inhalt ermitteln const reportCard = [
  //Seriennummer Prüfungs-ID Klassen-ID Studenten-ID Fach-ID Punktzahl { id: 1, examId: 1, classId: 1, studentId: 1, subjectId: 1, score: 100 },
  { id: 2, examId: 1, classId: 1, studentId: 1, subjectId: 2, score: 98 },
  { id: 3, examId: 1, classId: 1, studentId: 1, subjectId: 3, score: 90 },
  { id: 4, examId: 1, classId: 1, studentId: 2, subjectId: 1, score: 90 },
  { id: 5, examId: 1, classId: 1, studentId: 2, subjectId: 2, score: 90 },
  { id: 6, examId: 1, classId: 1, studentId: 2, subjectId: 3, score: 40 },
  { id: 7, examId: 1, classId: 1, studentId: 3, subjectId: 1, score: 30 },
  { id: 8, examId: 1, classId: 1, studentId: 3, subjectId: 2, score: 90 },
  { id: 8, examId: 1, classId: 1, studentId: 3, subjectId: 3, score: 40 },
  { id: 9, examId: 1, classId: 1, studentId: 4, subjectId: 1, score: 64 },
  { id: 8, examId: 1, classId: 1, studentId: 4, subjectId: 2, score: 90 },
  { id: 9, examId: 1, classId: 1, studentId: 4, subjectId: 3, score: 70 }
]

Generieren Sie Transkripte mit el-table

Element-plus bietet eine sehr leistungsstarke Tabellenkomponente – el-table, die viele grundlegende Funktionen realisieren kann, wie beispielsweise Sortieren, Anpassen der Breite, Festlegen der Farbe, Filtern und andere Funktionen. Dann können wir diese Komponente verwenden, um das Transkript zu implementieren.

Bestimmen Sie den Header

Ein wesentliches Merkmal der Zeilen-Spalten-Konvertierung besteht darin, dass der Tabellenkopf (wie viele Spalten es gibt) nicht festgelegt ist, sondern dynamisch generiert werden muss.
Am Beispiel des Transkripts wird die Anzahl der Spalten in der Tabellenüberschrift durch das Fach bestimmt. Je mehr Fächer es gibt, desto mehr Überschriften gibt es.

Zuerst setzen wir den Tabellenkopf entsprechend den Anforderungen von el-table:

/**
 * Erstellen Sie eine Tabellenüberschrift basierend auf dem Fach* * Matrikelnummer, Name, [Fächer], Gesamtpunktzahl, Durchschnittspunktzahl, Rangliste*/
const createTableHead = () => {
  // Schüler hinzufügen const head = [
  {
    Stütze: "id",
    Bezeichnung: 'Matrikelnummer',
    Breite: 120
  },
  {
    Requisite: "Name",
    Bezeichnung: 'Name',
    Breite: 120
  }]

  // Betreff hinzufügen für (const key in subject) {
    const sub = Betreff[Schlüssel]
    Kopf.drücken({
      Eigenschaft: 'sub_' + sub.id,
      Bezeichnung: Untername,
      Breite: 120
    })
  }

  Kopf.drücken({
    Eigenschaft: "totalScore",
    Bezeichnung: 'Gesamtpunktzahl',
    Breite: 120
  })
  Kopf.drücken({
    Eigenschaft: "Durchschnittspunktzahl",
    Bezeichnung: „Durchschnittsnote“,
    Breite: 120
  })
  Kopf.drücken({
    Requisite: "Rangliste",
    Bezeichnung: 'Rang',
    Breite: 120
  })
  
  Rücklaufkopf
}

Es gibt hier zwei Arten von Überschriften: eine ist fest und die andere wird basierend auf dem Betreff dynamisch generiert.
Wir verwenden einen einfachen und groben Ansatz, indem wir zuerst direkt feste Spalten hinzufügen und dann die Themen durchlaufen, um dynamische Spalten hinzuzufügen.

Bestimmen Sie die Daten

Nachdem die Tabellenüberschrift bestimmt ist, müssen wir den Datenteil bestimmen und offiziell mit der Zeilen- und Spaltenkonvertierung beginnen.
Definieren wir das Datenformat entsprechend den Anforderungen von el-table:

{
  ID: 1,
  Name: 'Zhang San',
  sub_1: 100,
  unter_2: 100,
  ...
  Gesamtpunktzahl: 200,
  Durchschnittsnote: 100,
  Rang: 1
}

Dazwischen können verschiedene Betreffzeilen stehen und die Attribut-Benennungsregel lautet: Präfix „sub_“ + Betreff-ID.
Dies erleichtert das spätere Hinzufügen von Daten.

Durchsuchen Sie die Notentabelle, um die Daten einzutragen.

/**
 * Zeilen- und Spaltenkonvertierung */
const rowToCol = () => {
  // Objektbasierte Punkteliste const _code = {}
  // Liste der Punktestände in Array-Form const _arr = []

  // Durchsuche das Zeugnis nach (const key in reportCard) {
    const rep = reportCard[Schlüssel]
    wenn(Typ von _code[rep.studentId] === 'undefiniert') {
      // Keine Datensätze. Erstellen Sie eine Zeile mit Schülerergebnissen und fügen Sie die feste Spalte data_code[rep.studentId] = { hinzu.
        id: rep.studentId, // Studentenausweis
        name: (student.filter((item)=>item.id === rep.studentId)[0] || {name:''}).name, // Den Namen des Studenten basierend auf der ID abrufen totalScore: 0, // Die Gesamtpunktzahl des Studenten in jedem Fach, die später geändert wird averageScore: 0, // Die durchschnittliche Punktzahl des Studenten in jedem Fach, die später geändert wird ranking: 1 // Die Rangliste, die später geändert wird }
    }
    // Notieren Sie die Punktzahlen jedes Fachs_code[rep.studentId]['sub_' + rep.subjectId] = rep.score
  }

  // Berechnen Sie die Gesamtpunktzahl und die Durchschnittspunktzahl wie unten beschrieben. // Berechnen Sie das Ranking wie unten beschrieben. return _arr
}

Durchlaufen Sie die Transkriptdaten, erstellen Sie zunächst ein Objekt basierend auf der Studenten-ID und ermitteln Sie dann die Noten jedes Fachs basierend auf dem Fach.

Berechnen Sie die Gesamt- und Durchschnittspunktzahl der Schüler

Im Allgemeinen muss das Zeugnis auch die Gesamtpunktzahl und die Durchschnittspunktzahl des Schülers enthalten. Wir können die Noten durchgehen, um die Gesamtpunktzahl und die Durchschnittspunktzahl zu berechnen.

  ...
  // Gesamtpunktzahl und Durchschnittspunktzahl berechnen für (const key in _code) {
    const code = _code[Schlüssel]
    // Durchlaufe die Themen let total = 0
    sei ave = 0
    lass count = 0
    für (const key in subject) {
      const fenshu = Code ['sub_' + Betreff [Schlüssel].id]
      wenn (Typ von fenshu !== 'undefiniert') {
        // Es gibt Punkte, berechne die Gesamtpunktzahl und den Durchschnittspunktzahlwert++
        Gesamt += Fenshu
        ave = Math.floor(total / count * 10) / 10 // Eine Dezimalstelle behalten.
        // Wenn Sie zwei Dezimalstellen behalten möchten, können Sie dies tun (total / count).toFixed(2)
      }
    }
    code.totalScore = Gesamt
    code.averageScore = Durchschnitt
    //Objektdaten in Array data_arr.push(code) umwandeln
  }

Rangfolge berechnen

Nachdem wir nun das Transkript haben, müssen wir noch eine Rangfolge erstellen.
Wenn Sie kein Ranking benötigen, können Sie diesen Schritt überspringen.

  lass _ranking = 0
  _arr.sort((a, b) => {
    // return b.totalScore - a.totalScore in umgekehrter Reihenfolge der Gesamtpunktzahl
  }).fürJeden((Artikel) => {
    // Rangfolge festlegen _ranking++
    _arr.find((a) => a.id === item.id).ranking = _ranking
  })


Berechnen Sie die Durchschnittsnote für jedes Fach.

Dies ist auch eine allgemeine Anforderung.
el-table bietet eine automatische Summationsfunktion sowie eine benutzerdefinierte Summationsmethode, mit der wir die durchschnittliche Punktzahl des Fachs ermitteln können.

Nachfolgend finden Sie die Methode, die auf der offiziellen Website angegeben ist. Sie dient ursprünglich zur Summierung, aber mit einer kleinen Änderung können Sie die Durchschnittsnote des Fachs ermitteln.

 // Berechnen Sie die durchschnittliche Punktzahl jedes Fachs, sei i = 0
const getSummaries = (param) => {
  ich++
  wenn (i < 7) return []

  const { Spalten, Daten } = Param;
  const Summen = [];
  
  Spalten.fürJeden((Spalte, Index) => {
    wenn (Index === 0) {
      sums[index] = 'Durchschnittspunktzahl'
      zurückkehren
    }
    const-Werte = data.map(item => Zahl(item[spalteneigenschaft]));
    wenn (!values.every(Wert => isNaN(Wert))) {
      Summen[Index] = Werte.Reduzieren((vorherige, aktuell) => {
        Konstantwert = Zahl(aktuell)
        wenn (!isNaN(Wert)) {
          Zurück Vorherige + Aktuelle
        } anders {
          Zurück Zurück
        }
      }, 0);
      Summen[Index] = Math.floor(Summen[Index] / Werte.Länge * 10) / 10
    } anders {
      Summen[Index] = "N/A";
    }
  })
  
  Renditesummen

Nach der Verfolgung stellte ich fest, dass diese Funktion sieben Mal aufgerufen wird und diese Zahl scheinbar nichts mit der Anzahl der Zeilen und Spalten zu tun hat.
Darüber hinaus haben die ersten paar Rückgaben keine Auswirkung, nur die letzte wird wirksam, sodass ein Urteil hinzugefügt wird.

Notieren Sie die höchsten und niedrigsten Noten für jedes Fach

In einem Transcript of Records können zudem verschiedene Daten berechnet werden, wie zum Beispiel die besten und schlechtesten Noten in einem Fach.
Im Allgemeinen können Sie auch auf diese statistischen Daten achten. Ebenso können wir eine benutzerdefinierte Summationsmethode verwenden, um den Anforderungen gerecht zu werden. Lassen Sie uns getSummaries verbessern.

// Berechnen Sie die Durchschnittsnote, die höchste Note und die niedrigste Note für jedes Fach const getSummaries = ({ columns }) => {
  ich++
  wenn (i < 7) return []

  const Summen = [];
   
  Spalten.fürJedes((Element, Index) => {
    wenn (item.property.indexOf('sub_') >= 0 ){
      const subjectId = item.property.replace('sub_', '')*1
      // Betreff, berechne den Durchschnitt let ave = 0
      sei Summe = 0
      sei max = 0
      sei min = 99999
      const _arr = reportCard.filter((r) => r.subjectId === subjectId)
      _arr.forEach((Element, Index) => {
        sum += item.score // Summe wenn (max < item.score) max = item.score // zeichne die höchste Punktzahl auf wenn (min > item.score) min = item.score // zeichne die niedrigste Punktzahl auf })
      wenn (_arr.length === 0) {
        sums[index] = '-' // Keine Punktzahl} else {
        // Berechnen Sie die durchschnittliche Punktzahl ave = Math.floor(sum/_arr.length * 10) / 10
        Summen[index] = `${ave}(${max}-${min})`
      }
    } anders {
      // Keine Summen berechnen[index] = ''
    }
  })
  sums[0] = 'Statistik'
  Renditesummen

}

Dieses Mal verwenden wir reportCard direkt, um die durchschnittliche Punktzahl, die höchste Punktzahl und die niedrigste Punktzahl zu berechnen.
In ähnlicher Weise können wir auch die Anzahl der Personen zählen, die den Test bestanden haben, und die Anzahl der Personen in jedem Segment.

Sortierfunktion hinzufügen

Dies ist eine integrierte Funktion von el-table, wir müssen sie nur hinzufügen.

<el-Tabelle
    :data="Tabellendaten"
    Stil="Breite: 100%;Höhe: 300px;"
    :default-sort = "{prop: 'totalScore', Reihenfolge: 'absteigend'}"
    :row-class-name="Tabellenzeilenklassenname"
    Grenze
    Show-Zusammenfassung
    :summary-method="Zusammenfassungen abrufen"
  >
    <el-table-column
      v-for="(Element, Index) im Tabellenkopf"
      :Schlüssel="'s'+ Index"
      behoben
      sortierbar
      :prop="Artikel.prop"
      :label="Artikel.label"
      :width="Artikelbreite">
    </el-Tabellenspalte>
  </el-Tabelle>

Einstellungen der el-table-Eigenschaft. Standardsortierung: Standardmäßig wird die Rangfolge in absteigender Reihenfolge der Gesamtpunktzahl angezeigt.

Erhöhen Sie die Farbunterscheidung

Was ist, wenn Sie diejenigen hervorheben möchten, deren Durchschnittspunktzahl unter 60 liegt? el-table bietet auch Funktionen, wir müssen nur eine Entscheidung treffen und das CSS festlegen.

// Farbe const tableRowClassName = ({row, rowIndex}) => {
  if (row.averageScore < 60) { // Studenten, deren Durchschnittspunktzahl nicht ausreicht return 'warning-row';
  } sonst wenn (row.averageScore > 95) { // Studenten mit Durchschnittspunktzahlen über 95 return 'success-row';
  }
  zurückkehren '';
}

Quellcode
https://gitee.com/naturefw/nf-vite2-element

Zusammenfassung

Vorteil:

  • Das Backend muss keine Zeilen-Spalten-Konvertierung durchführen, es müssen nur grundlegende Daten bereitgestellt werden, wodurch Leistungsressourcen des Backends gespart werden.
  • Die Funktionen sind recht umfangreich, es ist im Prinzip alles dabei, was mir einfällt.

Mangel:

  • Es wurde keine universelle Form erstellt und für andere Anforderungen zur Zeilen-Spalten-Konvertierung ist weiterhin das Schreiben von Code erforderlich.

Dies ist das Ende dieses Artikels über die Zeilen- und Spaltenkonvertierung mit vue3+el-table. Weitere relevante Inhalte zur Zeilen- und Spaltenkonvertierung mit vue3 finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Verwendung der Vue3-Tabellenkomponente

<<:  Detailliertes Tutorial zur Tomcat-Installation und -Bereitstellung in Windows 10

>>:  Der Unterschied und die Ausführungsmethode von select count() und select count(1)

Artikel empfehlen

Detailanalyse der MySQL-Berechtigungskontrolle

Inhaltsverzeichnis 1. Globale Ebene 2. Datenbanke...

Tutorial zu HTML-Tabellen-Tags (21): Zeilenrahmen-Farbattribut BORDERCOLOR

Um die Tabelle zu verschönern, können Sie für die...

Grafisches Tutorial zur Installation von MySQL 5.7.17 (Windows)

Ich habe vor Kurzem mit dem Studium der Datenbank...

Vue + Element UI realisiert Ankerpositionierung

In diesem Artikelbeispiel wird der spezifische Co...

Verwenden von jQuery zum Implementieren des Karusselleffekts

In diesem Artikel finden Sie den spezifischen Cod...

So unterstützen Sie vollständiges Unicode in MySQL/MariaDB

Inhaltsverzeichnis Einführung in utf8mb4 Fehler b...

Beispiel zur MySQL-Passwortänderung – ausführliche Erklärung

Beispiel zur MySQL-Passwortänderung – ausführlich...

Wie die MySQL Select-Anweisung ausgeführt wird

Wie wird die MySQL-Select-Anweisung ausgeführt? I...

Implementierungscode für unendliches Scrollen mit n Containerelementen

Szenario So rendern Sie Listen mit bis zu 10.000 ...

Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?

Inhaltsverzeichnis 1. Behandeln Sie Objekte nicht...

MySQL Multi-Instance-Bereitstellungs- und Installationshandbuch unter Linux

Was ist MySQL Multi-Instance Einfach ausgedrückt ...

MySQL-Serie 15: Allgemeine MySQL-Konfiguration und Leistungsstresstest

1. Allgemeine MySQL-Konfiguration Alle folgenden ...

So ändern Sie das Root-Passwort in einem Container mit Docker

1. Verwenden Sie den folgenden Befehl, um das SSH...