Beispielcode zur Implementierung der Menüberechtigungssteuerung in Vue

Beispielcode zur Implementierung der Menüberechtigungssteuerung in Vue

Wenn Benutzer an einem Backend-Verwaltungssystem arbeiten, stoßen sie normalerweise auf Probleme im Zusammenhang mit der Menüberechtigungssteuerung. Natürlich gibt es nur zwei Möglichkeiten, das Problem zu lösen: Front-End-Kontrolle und Back-End-Kontrolle. Die Produktiterationsgeschwindigkeit unseres Unternehmens ist relativ hoch, daher iterieren wir vom Front-End-Steuerungsrouting zum Back-End-Steuerungsrouting. Im Folgenden werde ich die Vor- und Nachteile dieser beiden Methoden und ihre jeweilige Implementierung vorstellen (Studierende, die mit der Vue-Router-API nicht vertraut sind, können sich zunächst auf der offiziellen Website die API ansehen).

Lassen Sie mich zunächst kurz auf die Anforderungen des Projekts eingehen: Wie in der folgenden Abbildung dargestellt, gibt es ein Menü der ersten und ein Menü der zweiten Ebene, und wenn sich unterschiedliche Personen anmelden, werden unterschiedliche Menüs angezeigt.

Die Idee der Front-End-Steuerung des Routings: Bringen Sie alle Routing-Mapping-Tabellen zur Wartung ins Front-End, d. h. schreiben Sie alle Menüpfade und entsprechenden Komponenten in mein router.js. Später werde ich die Nachteile erwähnen, die entstehen, wenn man alles hineinschreibt. Dann habe ich mein linkes Menü in eine Komponente (sidebar.vue) geschrieben, Daten wie diese in diese Komponente geschrieben und dann über den beim Anmelden erhaltenen Level-Wert „Hidden“ zum festen Menü in den Daten hinzugefügt, und dann hat das Front-End das Menü basierend auf „Hidden“ angezeigt.

// router.js Pseudocode const Login = r => require.ensure([],()=>r(require('../page/login/Login.vue')),'login');
const Home = r => erfordern.sicherstellen([],()=>r(erfordern('../page/Home.vue')),'home');
const Verboten = r => require.ensure([],()=>r(require('../page/403.vue')),'verboten');
const NotFound = r => require.ensure([],()=>r(require('../page/404.vue')),'nicht gefunden');
const Dashboard = r => require.ensure([],()=>r(require('../page/dashboard/Dashboard.vue')),'dashboard');
const SplashScreen = r => require.ensure([],()=>r(require('../page/splashScreen/SplashScreen.vue')),'splashScreen');
const AddSplashScreen = r => require.ensure([],()=>r(require('../page/splashScreen/AddSplashScreen.vue')),'addSplashScreen');

const Routen = [
  {
    Weg: '/',
    Umleitung: '/login'
  },{
    Pfad: '/login',
    Komponente: Login
  },{
    Pfad: '/404',
    Komponente: Nicht gefunden
  },{
    Pfad: '/home',
    Komponente: Home,
    Umleitung: '/home/splashScreen',
    Kinder: [
      {
        Pfad: '/home/splashScreen',
        Komponente: SplashScreen,
        Meta: {
          Titel: ‚Nationaldienst Li Bai‘
      },{
        Pfad: '/home/addSplashScreen',
        Komponente: AddSplashScreen,
        Meta: {
          Titel: Nationaldienst Lu Bu'
        }
      }
    ]
  }
];

Unten sehen Sie den Pseudocode der Menükomponente

// Seitenleiste.vue
<Vorlage>
  <div Klasse="Seitenleiste">
    <el-Menü>
      ...
    </el-Menü>
  </div>
</Vorlage>
<Skript>
  Standard exportieren {
    Daten() {
      zurückkehren {
        Routen: [
          {
           Index: '1',
           Titel: 'Wehrdienst-Dschungel',
           Symbol: „Iconfont-Symbol-Guanggao“,
           Kinder: [
            {
             Index: 'SplashScreen',
             Titel: 'Li Bai',
             Kinder: []
            }, 
           ]
          },
          {  
            Index: '2', 
            Titel: 'Wehrdienst-Mittelfeldspieler', 
            Symbol: „Symbolschriftart-Symbol-tuisongguanli-“,
          }
        ]
      }
    },
    Methoden: {
      getLevel(){
        const level = sessionStorage.getItem('level');
        wenn(Ebene === '0'){
          this.routes.forEach(Funktion(Wert){
            if(value.title == "National Service Single"){
              Wert.versteckt = wahr;
              Wert.Kinder.fürJedes(Funktion(Wert){
                if(Wert.Titel=="Guan Yu"){
                  Wert.versteckt = wahr;
                }
              })
            }
          })
        }sonst wenn(Ebene === '1'){
          this.routes.forEach(Funktion(Wert){
            Wert.versteckt = wahr
            Wert.Kinder.fürJedes(Funktion(Wert){
              Wert.versteckt = wahr;
            })
          })
        }
      }
    },
    erstellt(){
      dies.getLevel();
    }
  }
</Skript>

Obwohl dadurch die Berechtigungsfunktion realisiert werden kann, gibt es zwei Probleme.

  1. Was in der Sitzung gespeichert wird, ist die Ebene. Wir können die Browserkonsole öffnen, um die Ebene manuell zu steuern, wodurch die Berechtigung bedeutungslos wird.
  2. Wenn wir uns den Pfad merken, können wir ihn manuell in die URL-Leiste des Browsers eingeben und dann die Eingabetaste drücken, um eine beliebige Seite anzuzeigen. Dies ist auch der Nachteil der Festcodierung aller Routen im Front-End router.js.

Dabei zeigt/verbirgt das Frontend den Router nur über die vom Backend zurückgegebene Ebene. Dies erschwert dem Frontend die Pflege der gesamten Route und birgt große Risiken.

Lassen Sie uns nun über das Backend-Steuerungsrouting sprechen. Beginnen wir mit dem Betriebsvorgang. Wir haben eine mittlere Dashboard-Seite hinzugefügt. Auf dieser Seite werden nur die Routen der ersten Ebene auf verschiedenen Ebenen angezeigt. Durch Klicken auf die entsprechende Route der ersten Ebene können Sie die entsprechende Seitenseite aufrufen, auf der auch nur alle entsprechenden Routen der zweiten Ebene angezeigt werden.

Hier gibt es zwei neue Konzepte namens „dynamisches Hinzufügen von Routen“ und „Navigationsschutz“. Dies bedeutet, dass ich in meinem Front-End router.js nur Routing-Tabellen schreibe, auf die jeder zugreifen kann, z. B. Login- und 404-Seiten. Alle anderen Komponentenressourcen werden in eine neue Datei components.js geschrieben. Anschließend werden die vom Backend zurückgegebenen menuData verwendet, um den Schlüssel in components.js abzubilden. Wenn ein entsprechender Schlüssel vorhanden ist, wird er über addRoutes dynamisch zum Router hinzugefügt. Die Methode zum dynamischen Hinzufügen von Routen sollte in die Hook-Funktion des Navigationsschutzes beforeEach geschrieben werden.

Navigationsschutz bedeutet, was ich tun soll, bevor ich zur nächsten Seite weitergeleitet werde. Das heißt, nachdem wir uns angemeldet haben, springen wir zur Dashboard-Seite. Bevor wir diese Seite aufrufen, müssen wir die vom Backend angeforderten Menüdaten erneut kapseln und die zurückgegebenen Daten entsprechend den Berechtigungen mit unseren Front-End-Komponenten.js abbilden. Übertragen Sie die endgültigen Daten über addRoutes auf unsere Route, und dann können wir unsere Dashboard-Seite aufrufen und dann über die Dashboard-Seite auf die entsprechende Seite zugreifen. Das heißt, wir haben alle Berechtigungskontrollen abgeschlossen, bevor wir die Dashboard-Seite aufrufen.

Auch hier gibt es noch einen kleinen Optimierungspunkt: Wenn wir über die oben erwähnte Browsermenüleiste auf eine nicht autorisierte oder nicht vorhandene Seite zugreifen, müssen wir Routes 404 und * dieser Seite entsprechend der passenden Priorität im Vue-Router hinzufügen, damit wir direkt auf die 404-Seite und nicht auf eine leere Seite gelangen.


// components.js alle Seitenressourcen const home = () => import('../page/Home.vue');
const splashScreen = () => import('../page/splashScreen/SplashScreen.vue');
const addSplashScreen = () => import('../page/splashScreen/AddSplashScreen.vue');
const editSplashScreen = () => import('../page/splashScreen/EditSplashScreen.vue');

Standard exportieren {
  heim,
  Begrüßungsbildschirm,
  addSplashScreen,
  SplashScreen bearbeiten,
  
};

// router.js Sehen Sie, ist es nicht erfrischend, einfach allgemeine Seiten zu schreiben? importiere Vue von 'vue';
Router von „vue-router“ importieren;

Vue.use(Router);

const Login = () => import('../page/login/Login.vue');
const Home = () => import('../page/Home.vue');
const Verboten = () => import('../page/403.vue');
const Dashboard = () => import('../page/dashboard/Dashboard.vue');
const Routen = [
  {
    Weg: '/',
    Umleitung: '/login'
  },{
    Pfad: '/login',
    Komponente: Login
  },{
    Pfad: '/403',
    Komponente: Verboten
  },
  {
    Pfad: '/dashboard',
    Komponente: Dashboard,
  },
];
exportiere standardmäßig einen neuen Router({
  Modus: "Verlauf",
  Routen: Routen,
  Basis: __dirname,
  linkActiveClass: "Link aktiv"
  
})

// der Pseudocode von main.js behält nur die spezifische zugehörige Logik bei. importiere routeMap von './router/component.js';
const NotFound = () => import('./page/404.vue');
const formatRouten = Funktion (Routen, Routendaten) {
  wenn (!routeData) {
    routeData = {
      Name: 'Heimat',
      Pfad: '/home',
      // Nur wenn die Komponente erfolgreich übereinstimmt, können Sie auf die spezifische Seitenkomponente zugreifen: routeMap['home'],
      Kinder: [],
    };
  }
  Routen.Länge und Routen.fürJedes(Route => {
    wenn(route.komponente) {
      route.komponente = routeMap[route.komponente];
      routeData.children.push({
        Pfad: Route.Pfad,
        Name: route.index,
        Komponente: Route.Komponente,
        Meta: {
          Titel: Route.Titel,
        },
      })
    }
    wenn (route.Kinder && route.Kinder.Länge) {
      formatRouten(route.children, routeData);
    }
  });
  Routendaten zurückgeben;
};

let isFetchRemote = true;

//Verwenden Sie die Hook-Funktion, um die Route umzuleiten router.beforeEach((to, from, next) => {
  const Benutzername = sessionStorage.getItem('Benutzername');
  if(!Benutzername && to.path !== '/login'){
    weiter({Pfad: '/login'});
  }
  sonst wenn (isFetchRemote && to.path !== '/login') {
    ajaxPost('/resourceAPI/getMenuData').then(res =>{
      wenn (res.status === 200 und res.data.errno === 0) {
        isFetchRemote = falsch;
        const menuData = res.data.result;
        localStorage.setItem('menudata', JSON.stringify(menuData));
        const routeData = formatRouten(menuData);
        resourceApp.$router.addRoutes([routeData].concat([
          {name:'404',pfad:'/404',komponente:Nicht gefunden},
          {Pfad:'*',Umleitung:'/404'}]));
        resourceApp.$router.push({
          Pfad: zu.Pfad,
          Abfrage: an.Abfrage
        });
      }
      anders {
        isFetchRemote = wahr;
      }
      nächste();
    })
    .catch(err => {
      console.log(fehler);
    });  
  }
  anders {
    nächste();
  }
});


const resourceApp = neue Vue({
  Router,
  rendern: h => h(App)
}).$mount('#app');

//menuData-Anforderungsdaten// Der Unterschied zwischen dem Menü der ersten Ebene und dem Menü der zweiten Ebene besteht darin, dass das Menü der ersten Ebene den Wert einer Komponente hat. Beispielsweise hat das folgende SMS-Management nur das Menü der ersten Ebene {
  "errno": 0, 
  "errmsg": "Berechtigungen erfolgreich erhalten", 
  "Ergebnis": [
    {
      "index": "1", 
      "title": "Dschungelposition", 
      "Symbol": "Symbolschriftart Symbol-Guanggao", 
      "Kinder": [
        {
          "index": "Begrüßungsbildschirm", 
          "Symbol": "", 
          "Titel": "Nakorulu", 
          "Pfad": "/home/splashAdverse", 
          "Komponente": "splashAdverse", 
          "isShow": wahr
        }, 
        {
          "index": "SplashScreen hinzufügen", 
          "Symbol": "", 
          "Titel": "Li Bai", 
          "Pfad": "/home/addAdverse", 
          "Komponente": "addAdverse", 
          "isShow": falsch
        }, 
        
      ]
    }, 
    {
      "index": "Nachricht", 
      "Titel": "Ehrenorden des Wehrdienstes", 
      "Symbol": "Symbolschriftart-duanxinguanli", 
      "Pfad": "/home/Nachricht", 
      "Komponente": "Nachricht", 
      "Kinder": [
        {
          "index": "Nachricht hinzufügen", 
          "Titel": "Das beste Guan Yu in China", 
          "Symbol": "", 
          "Pfad": "/home/addMessage", 
          "Komponente": "Nachricht hinzufügen", 
          "isShow": falsch
        }
        
      ]
    } 
  ]
}

Die beiden Komponenten Sidebar und Dashboard müssen lediglich die Backend-Menüdaten über die Sitzung abrufen.

// Dashboard-Pseudocode <Vorlage>
  <div Klasse="Navigationsliste">
    <div Klasse="nav_list_item" v-for="Element in navList" @click="goPage(Element)">
      <i: class="item.icon"></i>
      <h2>{{item.title}}</h2>
    </div>
  </div>            
</Vorlage>

<Skript> 
  erstellt(){
    const routeArr = JSON.parse(localStorage.getItem('menudata'));
    diese.navList = routeArr;
  }, 
  Methoden: {
    geheSeite(Element){
      // Nur einstufiges Menü if (item.component) {
        dies.$router.push(item.path);
      }anders{
        // Die Datenstruktur des sekundären Menüs hat nur Pfade in untergeordneten
        dies.$router.push(item.children[0]['Pfad']);
      }
    }
  }
</Skript>
// Seitenleisten-Pseudocode <script>
  Standard exportieren {
    Daten() {
      zurückkehren {
        Routen: [],
      }
    },
    Methoden: {
      Türsteher(arr){
        return arr.filter(Funktion(Wert){
         Rückgabe !(!val || val === "");
        });
      }
    },
    erstellt(){
      const menuData = JSON.parse(localStorage.getItem('menudata'));
      // Ordnen Sie das gesamte Routing-Array dem Pfad des aktuellen Routers zu. let routes = menuData.map((item)=>{

        // Nur eine Routing-Ebene if (item.component && item.path == this.$route.path) {
          console.log(Element)
          Artikel zurückgeben;
        }anders{
          wenn(item.children[0]['path'] == this.$route.path){
            console.log(Element)
            Artikel zurückgeben;
          }
        }
      })
      // Undefinierte, null und andere leere und falsche Werte im Array entfernen this.routes = this.bouncer(routes);
    }
  }
</Skript>

Wenn wir die Berechtigungen auf diese Weise steuern, kehren wir zum Navigationswächter zurück, wenn wir die Ebene in der Sitzung in der Browserkonsole ändern oder den Pfad in der Browsernavigationsleiste ändern, d. h. wir senden eine Anforderung, um menuData erneut abzurufen. Wenn dieser Wert nach dem Hinzufügen von Routen nicht übereinstimmt, wird 404 zurückgegeben. Natürlich wird durch das Ändern der Ebene nicht die Kontrolle über die Änderung der Berechtigungen erreicht, da wir die Route dynamisch abrufen und nicht die vorherige Front-End-Steuerungsroute.

Damit ist dieser Artikel über den Beispielcode zur Implementierung der Menüberechtigungssteuerung in Vue abgeschlossen. Weitere relevante Inhalte zu Vue-Menüberechtigungen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Vue implementiert das Berechtigungssystem zur Hintergrundverwaltung und die dreistufige Menüanzeigefunktion der oberen Leiste
  • Beispiel für die Implementierung eines dynamischen Berechtigungsrouting-Menüs mit vue addRoutes

<<:  Architektur und Komponentenbeschreibung der privaten Docker-Bibliothek Harbor

>>:  Lösung für den erfolgreichen Start von MySQL, aber ohne Überwachung des Ports

Artikel empfehlen

Detailliertes Tutorial zum Bereitstellen von Springboot oder Nginx mit Kubernetes

1 Einleitung Nachdem „Maven Springboot mit einem ...

Lösung für vergessenes Linux MySQL-Root-Passwort

Wenn Sie sich bei der Verwendung der MySQL-Datenb...

Formel und Berechnungsmethode zur Schätzung der Server-Parallelität

Vor Kurzem musste ich den Server erneut einem Str...

So passen Sie die Höhe eines Divs an die Höhe des Browsers an

Diese alte Frage hat unzählige Frontend-Entwickler...

So löschen Sie den gesamten Inhalt eines Verzeichnisses mit Ansible

Studierende, die Ansible verwenden, wissen, dass ...

vsCode generiert Vue-Vorlagen mit einem Klick

1. Verwenden Sie die Tastenkombination Strg + Ums...

Ein Bugfix für Tomcats automatisches Herunterfahren

Vorwort Bei einem seit 4 Jahren laufenden Java EE...

Zwei Implementierungscodes der programmgesteuerten Navigation mit Vue-Router

Zwei Möglichkeiten zum Navigieren auf der Seite D...

Import-, Export-, Sicherungs- und Migrationsvorgänge für Docker-Images

Export: docker save -o centos.tar centos:latest #...

CSS3-Übergang zum Erreichen des unterstrichenen Beispielcodes

In diesem Artikel wird der Beispielcode für den C...

Docker löscht private Bibliotheksbilder vollständig

Werfen wir zunächst einen Blick auf die allgemein...