Vue implementiert dynamische Routingdetails

Vue implementiert dynamische Routingdetails

Gängige Implementierungsmethoden:

Lassen Sie uns kurz über die Vorteile der beiden Methoden sprechen. Wenn Sie es noch nie gemacht haben, können Sie es immer noch nicht verstehen, egal wie viel Sie sagen. Sie müssen sich immer noch den Code ansehen.

Frontend-Steuerung

  • Keine Backend-Hilfe, die Routing-Tabelle wird auf dem Frontend gepflegt
  • Die Logik ist relativ einfach und leicht zu bedienen

Backend-Steuerung

  • Relativ sicherer
  • Die Routing-Tabelle wird in der Datenbank verwaltet

1. Frontend-Steuerung

Idee: Erweitern Sie in der Routing-Konfiguration über das meta die mit Berechtigungen verbundenen Felder und realisieren Sie im Routing Guard durch Beurteilen dieser Berechtigungskennung die dynamische Erhöhung von Routen und Seitensprüngen. Beispielsweise fügen wir ein role hinzu, um die Rolle zu steuern

Konkreter Plan:

1. Geben Sie die Rolle des Front-End-Benutzers basierend auf dem Konto des angemeldeten Benutzers zurück

2. Das Frontend gleicht die Metarolle der Routing-Tabelle entsprechend der Rolle des Benutzers ab

3. Die passenden Routen zugänglich machen

Kerncodelogik

1. In der Datei router.js (schreiben Sie jeweils statisches Routing und dynamisches Routing in router.js)

Vue von „vue“ importieren
Router von „vue-router“ importieren

Vue.use(Router)

Layout aus '@/layout' importieren

// constantRoutes statisches Routing, hauptsächlich Anmeldeseite, 404-Seite usw. erfordern kein dynamisches Routing export const constantRoutes = [
  {
    Pfad: '/redirect',
    Komponente: Layout,
    versteckt: wahr,
    Kinder: [
      {
        Pfad: '/redirect/:Pfad*',
        Komponente: () => import('@/views/redirect/index')
      }
    ]
  },
  {
    Pfad: '/login',
    Komponente: () => import('@/views/login/index'),
    versteckt: wahr
  },
  {
    Pfad: '/404',
    Komponente: () => import('@/views/error-page/404'),
    versteckt: wahr
  },
  {
    Pfad: '/401',
    Komponente: () => import('@/views/error-page/401'),
    versteckt: wahr
  }
] 

// asyncRoutes dynamisches Routing exportieren const asyncRoutes = [
  {
    Pfad: '/permission',
    Komponente: Layout,
    Umleitung: '/permission/page',
    alwaysShow: true, 
    Name: 'Berechtigung',
    Meta: {
      Titel: 'Erlaubnis',
      Symbol: 'Schloss',
      // Der Kerncode kann von den zugewiesenen Rollen durchlaufen werden, um zu bestimmen, ob er angezeigt werden soll // Dies bedeutet die beiden Rollen „Administrator“ und „Editor“. Dieses Menü kann Rollen anzeigen: ['Administrator', 'Editor']
    },
    Kinder: [
      {
        Pfad: "Seite",
        Komponente: () => import('@/views/permission/page'),
        Name: 'Seitenberechtigung',
        Meta: {
          Titel: 'Seitenberechtigung',
          // Das bedeutet, dass nur der Administrator Rollen anzeigen kann: ['admin']
        }
      }
     ]
    }
]

const createRouter = () => neuer Router({
  scrollBehavior: () => ({ y: 0 }),
  Routen: konstanteRouten
})

const router = createRouter()

// Dies wird zum Zurücksetzen des Routers verwendet, sehr nützlich, sehen Sie sich diese paar Codezeilen nicht an export function resetRouter() {
  const neuerRouter = createRouter()
  router.matcher = neuerRouter.matcher 
}

Standardrouter exportieren

2. store/permission.js (einen Status in Vuex beibehalten und durch Zuweisen von Rollen steuern, ob das Menü angezeigt wird)

importiere { asyncRoutes, constantRoutes } von '@/router'

// Diese Methode wird verwendet, um Rollen mit der Funktion route.meta.role abzugleichen hasPermission(roles, route) {
  wenn (route.meta && route.meta.roles) {
    returniere roles.some(Rolle => route.meta.roles.includes(Rolle))
  } anders {
    returniere wahr
  }
}


// Diese Methode verwendet Rekursion, um die Routen zu durchlaufen und die Routen mit Berechtigungen zu durchlaufen. Exportfunktion filterAsyncRoutes(routes, roles) {
  const res = []

  Routen.fürJedes(Route => {
    const tmp = { ...route }
    wenn (hasPermission(Rollen, tmp)) {
      wenn (tmp.Kinder) {
        tmp.children = filterAsyncRoutes(tmp.children, Rollen)
      }
      res.push(tmp)
    }
  })

  Rückgabewert
}

konstanter Zustand = {
  Routen: [],
  Routes hinzufügen: []
}

const Mutationen = {
  SET_ROUTES: (Status, Routen) => {
    // Dieser Ort verwaltet zwei Zustände, einen für „addRouters“ und einen für „Routes“.
    state.addRoutes = Routen
    Zustand.Routen = konstanteRouten.concat(Routen)
  }
}

const Aktionen = {
  Routes generieren({ commit }, Rollen) {
    gib ein neues Versprechen zurück (Auflösen => {
      let abgerufeneRouten
      wenn (Rollen.includes('admin')) {
        aufgerufeneRouten = asynchroneRouten || []
      } anders {
        // Kerncode, übergebe die Route und die erhaltene Rolle (im Hintergrund erhalten) zum Abgleichen von accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      // Die übereinstimmenden und autorisierten Routen auf vuex commit('SET_ROUTES', accessedRoutes) setzen
      auflösen(Zugriffsrouten)
    })
  }
}

Standard exportieren {
  Namespace: wahr,
  Zustand,
  Mutationen,
  Aktionen
}

3. src/permission.js

(Erstellen Sie eine neue Routing-Guard-Funktion, die sich in main.js befinden oder in eine Datei extrahiert werden kann.)

Der Code hier dient hauptsächlich dazu, den Routensprung zu steuern, bevor geprüft wird, welche Routen zugänglich sind. Die Logik des Sprungs nach der Anmeldung kann hier geschrieben werden.

// Berechtigung.js
router.beforeEach((bis, von, weiter) => {
  if (store.getters.token) { // Prüfen, ob ein Token vorhanden ist
    wenn (zu.Pfad === '/login') {
      nächster({ Pfad: '/' });
    } anders {
        // Bestimmen Sie, ob der aktuelle Benutzer alle user_info-Informationen abgerufen hat, wenn (store.getters.roles.length === 0) {
        store.dispatch('GetInfo').then(res => { // Informationen abrufen
          const Rollen = res.data.role;
          // Übergeben Sie die erhaltene Rolle zum Abgleichen und Generieren zugänglicher Routen store.dispatch('GenerateRoutes', { roles }).then(() => { 
            // Zugängliche Routingtabellen dynamisch hinzufügen (Kerncode, ohne ihn geht nichts)
            router.addRoutes(store.getters.addRouters)
            
            // Hack, um sicherzustellen, dass addRoutes vollständig ist. next({ ...to, replace: true })
          })
        }).catch(err => {
          console.log(fehler);
        });
      } anders {
        next() //Wenn eine Benutzerberechtigung vorliegt, bedeutet dies, dass alle zugänglichen Routen generiert wurden. Wenn Sie keine Zugriffsberechtigung haben, gelangen Sie automatisch auf die 404-Seite.}
    }
  } anders {
    if (whiteList.indexOf(to.path) !== -1) { // In der Login-freien Whitelist direkt zu next() gehen;
    } anders {
      next('/login'); // Andernfalls alle zur Anmeldeseite weiterleiten}
  }
})

4. Die Seitenleiste kann Daten von Vuex zum Rendern abrufen

Der Kerncode besteht darin, das verfügbare Routing-Objekt vom router abzurufen, um die Seitenleiste darzustellen. Unabhängig davon, ob es sich um dynamisches Laden des Front-Ends oder dynamisches Laden des Back-End-Routings handelt, ist dieser Code derselbe

<!-- layout/komponenten/seitenleiste.vue -->
<el-Menü
:default-active="aktivesMenü"
:collapse="istCollapse"
:Hintergrundfarbe="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="falsch"
Modus="vertikal"
>
    // Durchlaufe die Routen und übergebe sie als Parameter an die untergeordnete Komponente <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" />
</el-Menü>
// Autorisierte Routen abrufen routes() {
  gib dies zurück.$router.options.routes
}


<!-- layout/komponenten/siderbarItem.vue -->
  <Vorlagenslot="Titel">
    <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
  </Vorlage>
  <Seitenleistenelement
    v-for="Kind in Element.Kinder"
    :Schlüssel="Kind.Pfad"
    :ist-nest="wahr"
    :item="Kind"
    :Basispfad="Auflösungspfad(untergeordneter.Pfad)"
    Klasse = "Nest-Menü"
  />

  Requisiten: {
    // Routenobjekt
    Artikel:
      Typ: Objekt,
      erforderlich: true
    },
    istNest: {
      Typ: Boolean,
      Standard: false
    },
    Basispfad: {
      Typ: Zeichenfolge,
      Standard: ''
    }
  }

Das Front-End steuert das Routing und die Logik ist relativ einfach. Das Back-End muss nur die Rolle des Benutzers speichern und das Front-End verwendet die Rolle des Benutzers zum Abgleichen. Das Hinzufügen neuer Zeichen wird jedoch sehr mühsam, da Sie jedes einzelne davon hinzufügen müssen.

2. Backend-Steuerungsrouting

Die allgemeine Idee der Backend-Steuerung ist: Die Routing-Konfiguration wird in der Datenbanktabelle abgelegt. Nachdem sich der Benutzer erfolgreich angemeldet hat, wird das Menü mit Berechtigungen entsprechend den Rollenberechtigungen an das Frontend übergeben. Das Frontend formatiert es in eine vom Seitenrouting erkannte Struktur und rendert es dann im Seitenmenü.

  • Nach der Anmeldung des Benutzers generiert das Backend direkt zugängliche Routing-Daten basierend auf der Rolle des Benutzers. Beachten Sie, dass es sich dabei um Daten handelt
  • Das Frontend konvertiert die vom Backend zurückgegebenen Routingdaten in die benötigte Routingstruktur.

Spezifische Logik:

  • In router.js werden nur einige statische Routen platziert, wie etwa login , 404 usw.
  • Organisieren Sie eine Datenstruktur und speichern Sie sie in einer Tabelle
  • Holen Sie sich die Routing-Daten vom Backend und schreiben Sie eine Datenkonvertierungsmethode, um die Daten in zugängliche Routen umzuwandeln
  • Es verwaltet auch einen vuex -Status und speichert die konvertierten Routen in vuex
  • Die Seitenleiste übernimmt auch Daten von der Route zum Rendern

Da die Prozesse hinter der Frontend-Steuerung und der Backend-Steuerung größtenteils gleich sind, betrachten wir hier nur die unterschiedlichen Prozesse an der Front:

1. store/permission.js, senden Sie eine Anfrage, um Daten in vuex abzurufen

Routes generieren({ commit }, data) {
  returniere neues Promise((lösen, ablehnen) => {
    getRoute(Daten).then(res => {
     //Konvertiere die erfassten Daten und speichere sie in vuex const accessedRouters = arrayToMenu(res.data)
      zugegriffenRouters.concat([{ Pfad: '*', Umleitung: '/404', versteckt: true }])
      commit('SET_ROUTERS', aufgerufene Router)
      lösen()
    }).fangen(Fehler => {
      ablehnen(Fehler)
    })
  })
}

2. Organisieren Sie eine Datenstruktur und speichern Sie sie in der Tabelle

// Seitenroutingformat {
    Pfad: '/form',
    Komponente: Layout,
    Kinder: [
      {
        Pfad: 'Index',
        Name: 'Formular',
        Komponente: () => import('@/views/form/index'),
        Meta: {Titel: „Formular“, Symbol: „Formular“}
      }
    ]
}

// Datenformat nach der Sortierung // Menü der ersten Ebene // Als Menü der ersten Ebene kann ParentId 0 verwendet werden. Am besten wählt man eine 4-stellige ID. Den Grund dafür erfährst du, wenn du das Projekt entwickelst.
    ID: 1300
    übergeordnete ID: 0
    Titel: "Menüverwaltung"
    Pfad: "/menu"
    versteckt: false
    Komponente: null
    versteckt: false
    Name: "Menü"
},

// Sekundäres Menü // Wenn parentId nicht 0 ist, können Sie parentId mit der ID des primären Menüs abgleichen und die passende ID in children { einfügen.
    ID: 1307
    übergeordnete ID: 1300
    Titel: "Untermenü"
    versteckt: false
    Pfad: "menuItem"
    Komponente: „menu/menuItem“ // Zum Abgleichen mit der lokalen Dateiadresse hidden: false
    Name: "Menüelement"
}

3. Schreiben Sie eine Konvertierungsmethode, um die erfassten Daten in eine Routerstruktur zu konvertieren

Exportfunktion arrayToMenu(array) {
  const Knoten = []
  // Hole den obersten Knoten für (let i = 0; i < array.length; i++) {
    const Zeile = Array[i]
    // Diese Exists-Methode dient zum Ermitteln, ob ein untergeordnetes Element vorhanden ist, if (!exists(array, row.parentId)) {
      Knoten.push({
        path: row.path, // Routenadresse hidden: row.hidden, // alles true, wenn das Backend nicht konfiguriert ist component: Layout, // entspricht grundsätzlich der Komponente deiner Datei
        Name: row.name, // Routenname Meta: { Titel: row.title, Symbol: row.name }, // Titel ist der angezeigte Name ID: row.id, // Routen-ID
        Umleitung: „noredirect“
      })
    }
  }
  const toDo = Array.from(Knoten)
  während (toDo.Länge) {
    const node = toDo.shift()
    // Untergeordnete Knoten abrufen für (let i = 0; i < array.length; i++) {
      const Zeile = Array[i]
      // Push zum übergeordneten Element, dessen parentId gleich if (row.parentId === node.id) { ist.
        const Kind = {
          Pfad: Zeile.Pfad,
          Name: Zeile.Name,
          versteckt: Zeile.versteckt,
          // Kerncode, da die Komponente der sekundären Route mit der Komponente der Seite übereinstimmen muss: require('@/views/' + row.component + '/index.vue'),
          Meta: { Titel: Zeile.Titel, Symbol: Zeile.Name },
          ID: Zeile.ID
        }
        wenn (Knoten.Kinder) {
          node.children.push(Kind)
        } anders {
          node.children = [Kind]
        }
        toDo.push(Kind)
      }
    }
  }
  Rückgabeknoten
}
// Prüfen, ob untergeordnete Elemente vorhanden sind function exists(rows, parentId) {
  für (lass i = 0; i < Zeilen.Länge; i++) {
    wenn (Zeilen[i].id === parentId) true zurückgeben
  }
  return false
}

Dies ist das Ende dieses ausführlichen Artikels über die Implementierung des dynamischen Routings durch Vue. Weitere relevante Inhalte zur Implementierung des dynamischen Routings durch Vue 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:
  • Erklären Sie, was dynamisches Routing im Vue-Router ist
  • Vue Router implementiert dynamisches Routing sowie allgemeine Probleme und Lösungen
  • Umfassende Analyse der grundlegenden Verwendung des Vue-Routers (dynamisches Routing, verschachteltes Routing)
  • vueRouter - Matcher erhöht und verringert Routing-Methoden dynamisch

<<:  HTML-Formular_PowerNode Java Academy

>>:  Analyse des Benchmarking-Prozesses von Sysbench für MySQL

Artikel empfehlen

Zusammenfassung der Ausnahmen bei der MySQL-Datenbankverbindung (sammelwürdig)

Beim Bereitstellen des Projekts auf Centos ist mi...

Führen Sie die folgenden Schritte aus, damit Docker Images abrufen kann

1. Docker Pull zieht das Image Wenn Sie zum Abruf...

Implementierungsbeispiel für das Zurücksetzen des CSS-Reset-Stils

Einführung: Alle Browser verfügen über Standardst...

Der Unterschied zwischen char und varchar in MySQL

CHAR- und VARCHAR-Typen sind ähnlich und untersch...

Was ist SSH? Wie benutzt man? Was sind die Missverständnisse?

Inhaltsverzeichnis Vorwort Was ist SSH? Wofür wir...

Erste Schritte mit GDB unter Linux

Vorwort gdb ist ein sehr nützliches Debugging-Too...

Detaillierte Beschreibung des MySQL-Ersetzens in der Verwendung

Die Ersetzungsanweisung ähnelt im Allgemeinen der...

Zusammenfassung der Namenskonventionen für HTML und CSS

CSS-Benennungsregeln Header: Header Inhalt: Inhalt...

jQuery implementiert die Registrierungsseite zur Mitarbeiterverwaltung

In diesem Artikelbeispiel wird der spezifische Co...

Die neuesten 36 hochwertigen kostenlosen englischen Schriftarten freigegeben

01. Unendlichkeit Schriftart herunterladen 02. Ban...