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

Detaillierte Erklärung der Box-Größe in CSS3 (Content-Box und Border-Box)

Box-Größe in CSS3 (Inhaltsbox und Rahmenbox) Mit ...

Einführung in die Verwendung des MySQL mysqladmin-Clients

Inhaltsverzeichnis 1. Überprüfen Sie den Status d...

So implementieren Sie die Navigationsfunktion im WeChat Mini-Programm

1. Rendern2. Bedienungsschritte 1. Beantragen Sie...

Der Unterschied zwischen Schlüssel und Index in MySQL

Schauen wir uns zunächst den Code an: ALTER TABLE...

Kopieren von JS-Objekten (Deep Copy und Shallow Copy)

Inhaltsverzeichnis 1. Oberflächliche Kopie 1. Obj...

Vue implementiert dynamische Routingdetails

Inhaltsverzeichnis 1. Frontend-Steuerung 1. In de...

Docker verwendet Busybox, um ein Basis-Image zu erstellen

Die erste Zeile eines Docker-Images beginnt mit e...

Grafisches Tutorial zur Installation und Konfiguration von CenOS6.7 mysql 8.0.22

CenOS6.7 installiert MySQL8.0.22 (empfohlene Samm...

So fügen Sie eindeutige Indizes für Felder in MySQL hinzu und löschen sie

1. PRIMARY KEY hinzufügen (Primärschlüsselindex) ...

Details zu MySQL-Zeittypen und -Modi

Inhaltsverzeichnis 1. MySQL-Zeittyp 2. Überprüfen...

So erstellen Sie mit Harbor ein privates Docker-Repository

Inhaltsverzeichnis 1. Open-Source-Lagerverwaltung...