Informationen zum dynamischen Hinzufügen von Routen basierend auf Benutzerberechtigungen in Vue

Informationen zum dynamischen Hinzufügen von Routen basierend auf Benutzerberechtigungen in Vue

Zeigen Sie je nach Benutzerberechtigung unterschiedliche Menüseiten an.

Wissenspunkte

Routenwächter (mit Pre-Guard): Bestimmen Sie basierend auf den Benutzerrollen, welche Routen hinzugefügt werden sollen.
vuex: dynamisch hinzugefügte Routen speichern

Schwierigkeit

Der Routenwächter muss bei jeder Änderung der Route aufgerufen werden und die Daten im Speicher werden bei jeder Aktualisierung gelöscht. Daher muss ermittelt werden, ob dem Speicher dynamische Routen hinzugefügt wurden.
(Wenn keine Beurteilung erfolgt, wird es weiter hinzugefügt, was zu einem Speicherüberlauf führt.)

Bildbeschreibung hier einfügen

Bestimmen Sie die Route basierend auf der Rolle und filtern Sie die dynamische Route, um festzustellen, ob die Rolle jeder Route mit der bei der Anmeldung übergebenen Rolle übereinstimmt

Bildbeschreibung hier einfügen

<Vorlage>
  <div>
    <el-Menü
      :default-active="$route.pfad"
      Klasse = "el-menu-vertical-demo menu_wrap"
      Hintergrundfarbe = "#324057"
      Textfarbe = "weiß"
      Aktive Textfarbe = "#20a0ff"
      :collapse="istCollapse"
      einzigartig geöffnet
      Router
    >
      <el-Untermenü
        v-for="Artikel in $store.state.Routers"
        :Schlüssel="item.path"
        :index="item.pfad"
        v-if="!item.hidden"
      >
        <Vorlagenslot="Titel" >
          <i class="el-icon-location"></i>
          <span>{{ item.meta.title }}</span>
        </Vorlage>
        <div v-for="chi in item.children" :key="chi.name">
          <el-menu-item v-if="!chi.hidden" :index="item.pfad + '/' + chi.pfad">
            <i class="el-icon-location"></i>{{ chi.meta.title }}
          </el-Menüelement>
        </div>
      </el-Untermenü>
    </el-Menü>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "Menüliste",
  Daten() {
    zurückkehren {
      isCollapse: false,
    };
  },
  erstellt() {
    dies.$bus.$on("getColl", (Daten) => {
      this.isCollapse = Daten;
    });
  },
  Methoden: {

  }
};
</Skript>

<Stilbereich>
.menu_wrap {
  Höhe: 100vh;
}
.el-menu-vertical-demo:nicht(.el-menu--collapse) {
  Breite: 200px;
  Höhe: 100vh;
}
</Stil>
Vue von „vue“ importieren
VueRouter von „vue-router“ importieren
Store aus „../store/index“ importieren

Vue.use(VueRouter)

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = Funktion push(Standort) {
  gebe originalPush.call(diesen, Standort).catch(err => err) zurück
}

exportiere const Routen = [
  {
    Pfad: '/home',
    Name: 'Vorname',
    Komponente: () => import('../views/Index.vue'),
    meta: { Titel: 'Homepage'},
    Kinder: [
      {
        Pfad: 'Index',
        Name: "Home",
        Komponente: () => import('../views/Home'),
        meta: { title: 'Home', Rollen: ['Kunde'] }
      }
    ]
  },
  {
    Pfad: '/index',
    Name: 'NavigationOne',
    Komponente: () => import('../views/Index.vue'),
    meta: { title: 'Navigation 1'},
    Kinder: [
      {
        Pfad: 'Personal',
        Name: 'Personal',
        Komponente: () => import('../views/One/Personnel.vue'),
        meta: { title: 'Personal', Rollen: ['Kunde'] }
      },
      {
        Pfad: "Konto",
        Name: 'Konto',
        Komponente: () => import('../views/One/Account.vue'),
        meta: { title: 'Konto', Rollen: ['Kunde'] }
      },
      {
        Pfad: 'psw',
        Name: „psw“,
        Komponente: () => import('../views/One/Password.vue'),
        meta: { Titel: 'psw', Rollen: ['Kunde'] }
      }
    ]
  },
  {
    Pfad: '/Karte',
    Name: 'NavigationTwo',
    Komponente: () => import('../views/Index.vue'),
    meta: { title: 'Navigation 2'},
    Kinder: [
      {
        Pfad: "Aktivität",
        Name: "Aktivität",
        Komponente: () => import('../views/Three/Activity.vue'),
        meta: { title: 'Aktivität', Rollen: ['Kunde'] }
      },
      {
        Pfad: 'Soziales',
        Name: "Sozial",
        Komponente: () => import('../views/Three/Social.vue'),
        meta: { title: 'Soziales', Rollen: ['Kunde'] }
      },
      {
        Pfad: "Inhalt",
        Name: 'Inhalt',
        Komponente: () => import('../views/Three/Content.vue'),
        meta: { title: 'Inhalt', Rollen: ['Kunde'] }
      }
    ]
  },
  {
    Pfad: '/zwei',
    Name: 'NavigationThree',
    Komponente: () => import('../views/Index.vue'),
    meta: { title: 'Navigation 3'},
    Kinder: [
      {
        Pfad: 'Index',
        Name: 'Zwei',
        Komponente: () => import('../views/Two'),
        meta: { title: 'Zwei', Rollen: ['Kunde'] }
      }]
  },
  {
    Pfad: '/404',
    Name: 'Fehler',
    versteckt: wahr,
    Meta: {Titel: 'Fehler'},
    Komponente: () => import('../views/Error')
  }
]

exportiere const asyncRouter = [
  //Agent3 Mitarbeiter2
  {
    Pfad: '/agent',
    Komponente: () => import('../views/Index.vue'),
    Name: 'Agent',
    meta: { Titel: 'Agent', Rollen: ['Agent', 'Mitarbeiter']},
    Kinder: [
      {
        Pfad: 'eins',
        Name: 'agentOne',
        Komponente: () => import('@/views/agent/One'),
        meta: { Titel: 'agentOne', Rollen: ['Agent', 'Mitarbeiter'] }
      },
      {
        Pfad: 'zwei',
        Name: 'agentTwo',
        Komponente: () => import('@/views/agent/Two'),
        Meta: { Titel: 'agentTwo', Rollen: ['Agent'] }
      },
      {
        Pfad: 'drei',
        Name: "agentThree",
        Komponente: () => import('@/views/agent/Three'),
        meta: { Titel: 'agentThree', Rollen: ['Agent', 'Mitarbeiter'] }
      }
    ]
  },
  //Mitarbeiter3
  {
    Pfad: '/staff',
    Komponente: () => import('../views/Index.vue'),
    Name: 'Mitarbeiter',
    meta: { title: 'Mitarbeiter', Rollen: ['Mitarbeiter']},
    Kinder: [
      {
        Pfad: 'eins',
        Name: 'StaffOne',
        Komponente: () => import('@/views/Staff/One'),
        Meta: { Titel: 'StaffOne', Rollen: ['Mitarbeiter'] }
      },
      {
        Pfad: 'zwei',
        Name: 'StaffTwo',
        Komponente: () => import('@/views/Staff/Two'),
        Meta: { Titel: 'StaffTwo', Rollen: ['Mitarbeiter'] }
      },
      {
        Pfad: 'drei',
        Name: 'StaffThree',
        Komponente: () => import('@/views/Staff/Three'),
        meta: { Titel: 'StaffThree', Rollen: ['Mitarbeiter'] }
      }
    ]
  },
  { Pfad: '*', Umleitung: '/404', versteckt: true }
]

const router = neuer VueRouter({
  Routen
})


router.beforeEach((bis, von, weiter) => {
  let Rollen = ['Mitarbeiter']
  wenn(store.state.Routers.length) {
    Konsole.log('ja')
    nächste()
  } anders {
    console.log('nicht')
    store.dispatch('asyncGetRouter', {roles})
    .then(res => {
      router.addRoutes(store.state.addRouters)
    })
    neben})
    // Der Unterschied zwischen next() und next({ ...to }): next() ermöglicht next('/XXX'), unendlich lange abzufangen}
})

Standardrouter exportieren

Vue von „vue“ importieren
Vuex von „vuex“ importieren
Module aus „./module“ importieren

importiere Router, {Routen, asyncRouter} von '../Router'

Funktion hatBerechtigung(Route, Rollen) {
  wenn (route.meta && route.meta.roles) {
    returniere roles.some(role => route.meta.roles.indexOf(role) >= 0)
  } anders {
    returniere wahr
  }
  
}

/*
  Filtern Sie die asynchrone Routing-Tabelle rekursiv, um Routen zurückzugeben, die der Benutzerrolle entsprechen @param asyncRouter asynchrones Routing @param Rollen Benutzerrolle*/
Funktion filterAsyncRouter(asyncRouter, Rollen) {
  let filterRouter = asyncRouter.filter(route =>{
    wenn (hasPermission (Route, Rollen)) {
      wenn (route.Kinder && route.Kinder.Länge) {
          route.children = filterAsyncRouter(route.children, Rollen)
      }
      returniere wahr 
    }
    return false
  })
  RücklauffilterRouter
}

Vue.Verwenden(Vuex)

exportiere standardmäßig neuen Vuex.Store({
  Zustand: {
    addRouter: [],
    Router: []
  },
  Mutationen:
    getRouter(Status, paload) {
      // konsole.log(paload)
      Zustand.Router = Routen.concat(paload)
      state.addRouters = paload
      // router.addRoutes(paload)
    }
  },
  Aktionen: {
    asyncGetRouter({ commit }, data) {
      const { Rollen } = Daten
      gib ein neues Versprechen zurück (Auflösen => {
        let addAsyncRouters = filterAsyncRouter(asyncRouter, Rollen)
        commit('getRouter', addAsyncRouters)
        lösen()
      })
    }
  }
})

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung zum dynamischen Hinzufügen von Routen gemäß Benutzerberechtigungen in Vue. Weitere relevante Inhalte zum dynamischen Hinzufügen von Routen in Vue finden Sie in früheren Artikeln auf 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:
  • Vue implementiert Routing zur Berechtigungssteuerung (vue-router fügt Routing dynamisch hinzu)
  • Beispiel für die dynamische Hinzufügung von Routing und Generierung von Menümethoden in Vue
  • Vue fügt Routen dynamisch hinzu addRoutes und kann dynamische Routen nicht im Cache speichern
  • vue löst das Problem des Aktualisierungsfehlers nach dem dynamischen Hinzufügen von Routen in addRoutes
  • Vuex zeigt je nach Benutzerberechtigung unterschiedliche Routinglistenfunktionen an
  • Vue-Access-Control – Front-End-Lösung zur Benutzerberechtigungssteuerung

<<:  wget lädt die gesamte Website (das gesamte Unterverzeichnis) oder ein bestimmtes Verzeichnis herunter

>>:  Der Unterschied zwischen shtml und html

Artikel empfehlen

Sortierung und Paginierung von MySQL-Abfragen

Überblick Da wir die Daten normalerweise nicht di...

MySQL 5.6.23 Installations- und Konfigurations-Umgebungsvariablen-Tutorial

In diesem Artikel finden Sie das Installations- u...

Detaillierter Prozess der Installation von nginx1.9.1 auf centos8

1.17.9 Wirklich leckerer Nginx-Download-Adresse: ...

html Option deaktivieren auswählen auswählen deaktivieren Option Beispiel

Code kopieren Der Code lautet wie folgt: <Ausw...

Aktivieren oder Deaktivieren des GTID-Modus in MySQL online

Inhaltsverzeichnis Grundlegende Übersicht GTID on...

Mehrere Möglichkeiten zum Ändern des MySQL-Passworts

Vorwort: Bei der täglichen Verwendung der Datenba...

Fallstudie zu MySQL-Berechtigungen und Datenbankdesign

Berechtigungen und Datenbankdesign Benutzerverwal...

WebWorker kapselt JavaScript-Sandbox-Details

Inhaltsverzeichnis 1. Szenario 2. Implementieren ...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.19 (Win10)

Detailliertes Tutorial zum Herunterladen und Inst...

JS implementiert einfache Addition und Subtraktion von Warenkorbeffekten

In diesem Artikelbeispiel wird der spezifische JS...

Tutorial zum Upgrade von Centos7 auf Centos8 (mit Bildern und Text)

Wenn Sie ein Upgrade in einer formalen Umgebung d...