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.
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:
|
<<: Architektur und Komponentenbeschreibung der privaten Docker-Bibliothek Harbor
>>: Lösung für den erfolgreichen Start von MySQL, aber ohne Überwachung des Ports
1 Einleitung Nachdem „Maven Springboot mit einem ...
Wenn Sie sich bei der Verwendung der MySQL-Datenb...
Vor Kurzem musste ich den Server erneut einem Str...
Wie füge ich jedes Mal eine Ladeanimation hinzu, ...
VUE verwendet vue-seamless-scroll zum automatisch...
Diese alte Frage hat unzählige Frontend-Entwickler...
Studierende, die Ansible verwenden, wissen, dass ...
1. Verwenden Sie die Tastenkombination Strg + Ums...
Vorwort Bei einem seit 4 Jahren laufenden Java EE...
Zwei Möglichkeiten zum Navigieren auf der Seite D...
Inhaltsverzeichnis Speicherverwaltung der Speiche...
einführen Wenn Sie einen OSS-Speicherdienst wie A...
Export: docker save -o centos.tar centos:latest #...
In diesem Artikel wird der Beispielcode für den C...
Werfen wir zunächst einen Blick auf die allgemein...