recherche
Maisoninterface Webjs tutorielExplication détaillée des étapes pour implémenter le menu de routage d'autorisations dynamique avec vue addRoutes

Cette fois, je vais vous apporter une explication détaillée des étapes pour implémenter le menu de routage dynamique des autorisations avec vue addRoutes. Quelles sont les précautions pour implémenter le menu de routage dynamique des autorisations avec vue addRoutes. Voici un cas pratique. , jetons un coup d'oeil.

Exigences

Récemment, j'ai repris un système de gestion backend et je dois réaliser l'effet de l'extraction du menu de navigation du backend ; cela dépend des autorisations de l'utilisateur connecté. Le menu de navigation extrait est également différent, et l'interface utilisable est également différente.

Problème

Parce que le système de gestion en arrière-plan est prêt à utiliser la combinaison de vue+vue-router+element-ui+vuex, mais L'application monopage a instancié vue-router et l'a injecté dans l'instance de vue avant d'entrer dans la page, il n'y a donc aucun moyen de re-personnaliser le routage lors de l'entrée dans la page de connexion. Après de nombreuses recherches, j'ai découvert que vue-router fournissait la méthode addRoutes pour ajouter des routes dans la version 2.0, et une lueur d'espoir est apparue.

Après beaucoup de travail acharné, la fonction a finalement été implémentée. Je l'ai enregistrée pour une révision facile, et j'espère qu'elle pourra aider les camarades qui ont les mêmes besoins.

Idées

1. Configurez d'abord une adresse de routage fixe localement, telle que la connexion, 404 pages, comme suit :

import Vue from 'vue'
import Router from 'vue-router'
import store from '@/vuex/store'
Vue.use(Router)
let router = new Router({
 routes: [
  {
   path: '/login',
   name: 'login',
   meta: {requireAuth: false},
   // 模块使用异步加载
   component: (resolve) => require(['../components/login/login.vue'], resolve)
  }]
})
// 拦截登录,token验证
router.beforeEach((to, from, next) => {
 if (to.meta.requireAuth === undefined) {
  if (store.state.token) {
   next()
  } else {
   next({
    path: '/login'
   })
  }
 } else {
  next()
 }
})
export default router
Ce n'est qu'après avoir configuré ces itinéraires fixes que nous pouvons accéder à la page de connexion, sinon nous ne pourrons pas continuer.

2. Ensuite, l'étape importante est de se mettre d'accord avec le vétéran du back-end sur les informations de la liste des menus d'autorisations qui doivent être renvoyées. Analysons d'abord la structure de routage dont nous avons besoin. Ici, je prends mon propre routage. un exemple. Si je

définis directement l'itinéraire moi-même, il aurait la structure suivante :

let router = new Router({
 routes: [
  {
   path: '/login',
   name: 'login',
   meta: {requireAuth: false},
   component: (resolve) => require(['../components/login/login.vue'], resolve)
  },
  {
    path: '/',
    redirect: '/layout'
  },
  {
    path: '/layout',
    component: (resolve) => require(['../layout.vue'], resolve),
    children: [
      {
        path: 'index', 
        meta: {
          type: '1',    //控制是否显示隐藏 1显示,2隐藏
          code: 00010001, // 后面需要控制路由高亮
          title: '首页',  // 菜单名称
          permissonList: [] // 权限列表
        }
        component: (resolve) => require(['@/components/index/index.vue'], resolve)
      },
      {
      ...
      }   
    ]
  }]
})
D'après l'analyse structurelle ci-dessus, en fait, l'itinéraire qui a vraiment besoin de

configuration dynamique est en fait / La partie enfants sous la mise en page, le backend doit donc nous renvoyer un tableau contenant toutes les routes

Dans les données renvoyées, la rootList est la. liste de navigation de premier niveau. La navigation de premier niveau n'a en fait pas de

fonction de routage Elle est uniquement utilisée comme déclencheur pour changer le menu secondaire qui contient les informations de routage. nous avons vraiment besoin.

3. Après avoir obtenu les informations de routage des autorisations, nous devons traiter les données localement et les assembler dans les données dont nous avons besoin :

// 登录
   login () {
    let params = {
     account: this.loginForm.username,
     password: encrypt(this.loginForm.password)
    }
    this.loading = true
    this.$http.post(this.$bumng + '/login', this.$HP(params))
     .then((res) => {
      this.loging = false
      console.info('菜单列表:', res)
      if (res.resultCode === this.$state_ok) {
       // 合并一级菜单和二级菜单,便于显示
       let menus = handleMenu.mergeSubInRoot(res.rootList, res.subList)
       // 本地化处理好的菜单列表
       this.saveRes({label: 'menuList', value: menus})
       // 根据subList处理路由
       let routes = handleMenu.mergeRoutes(res.subList)
       // 本地化subList,便于在刷新页面的时候重新配置路由
       this.saveRes({label: 'subList', value: res.subList})
       // 防止重复配置相同路由
       if (this.$router.options.routes.length  {
      this.loging = false
      console.error('错误:', err)
     })
   },
Méthodes de traitement des listes de menus et des sous-listes : mergeSubInRoot et mergeRoutes

const routes = [
 {
  path: '/',
  redirect: '/layout'
 },
 {
  path: '/layout',
  component: (resolve) => require(['../layout.vue'], resolve),
  children: []
 }
]
export default {
 /**
  * 合并主菜单和子菜单
  * @param: rootList [Array] 主菜单列表
  * @param: subList [Array] 子菜单
  * */
 mergeSubInRoot (roots, subs) {
  if (roots && subs) {
   for (let i = 0; i  require([`@/components/${subs[i].component}.vue`], resolve),
     meta: {
      type: subs[i].type,
      code: subs[i].code,
      title: subs[i].name,
      permissionList: subs[i].permissionList
     }
    }
    routes[1].children.push(temp)
   }
  }
  return routes
 }
}
Jusqu'à présent, nous avons configuré avec succès le routage des autorisations dans le routage local. Ma connexion système est la suivante

Suivez. up Optimiser

1. Affichage de la liste des menus et changement de navigation secondaire :

<template>
  <p>
   <el-menu>
    <el-menu-item>
     <i></i>
     <span>{{item.name}}</span>
    </el-menu-item>
   </el-menu>
  </p>
</template>
<script>
 import {mapState, mapMutations} from &#39;vuex&#39;
 export default {
  name: &#39;menu&#39;,
  data () {
   return {
    msg: &#39;Welcome to Your Vue.js App&#39;
   }
  },
  computed: {
   ...mapState([&#39;menuList&#39;]),
   activeCode () {
     // 通过code保证在切换字路由的情况下一级路由也是高亮显示
    return this.$route.meta.code.substring(0, 4)
   }
  },
  methods: {
   ...mapMutations([&#39;saveRes&#39;]),
   // 切换二级路由
   switchSubMenu (route) {
    console.info(&#39;路由:&#39;, route)
    if (route.actUrl !== &#39;index&#39;) {
     // 用currentSubMenu控制二级路由数据 
     this.saveRes({label: &#39;currentSubMenu&#39;, value: route.children})
     this.$router.push(`/layout/${route.children[0].actUrl}`)
    } else {
     // 不存在二级路由隐藏二级 
     this.saveRes({label: &#39;currentSubMenu&#39;, value: &#39;&#39;})
     this.$router.push(`/layout/${route.actUrl}`)
    }
   }
  },
  filters: {
   splitCode (code) {
    return code.substring(0, 4)
   }
  }
 }
</script>
2. Empêcher la perte de l'itinéraire de rafraîchissement puisque l'application d'une seule page ; être actualisé lors de l'actualisation. Après la réinitialisation, toutes les routes configurées seront perdues. Une fois retournées avant la libération, seules les routes configurées localement peuvent être sautées. A ce moment, nous pouvons exécuter le code suivant dans app.vue (ps : peu importe où le rafraîchissement est effectué, app.vue sera exécuté) :

<script>
 import {decrypt} from &#39;@/libs/AES&#39;
 import handleMenu from &#39;@/router/handleMenu&#39;
 export default {
  name: &#39;app&#39;,
  created () {
   // 当this.$router.options.routes的长度为1,且本地缓存存在菜单列表的时候才重新配置路由
   if (this.$router.options.routes.length <= 1 && sessionStorage.getItem(&#39;subList&#39;)) {
    let subList = JSON.parse(decrypt(sessionStorage.getItem(&#39;subList&#39;)))
    let routes = handleMenu.mergeRoutes(subList)
    this.$router.addRoutes(routes)
    // this.$router不是响应式的,所以手动将路由元注入路由对象
    this.$router.options.routes.push(routes)
   }
  }
 }
</script>
De cette façon, même s'il est rafraîchi, le routage sera reconfiguré.

3. Concernant le contrôle au niveau des boutons de page, vous pouvez personnaliser une commande pour ce faire. Parce que nous avons mis la liste des autorisations dans le méta-objet de l'itinéraire correspondant, nous pouvons facilement revenir aux autorisations dont dispose l'utilisateur actuel sur la page actuelle sur chaque page

Référez-vous à la documentation officielle pour les instructions personnalisées

Conclusion

Après avoir terminé le travail, grâce à la méthode addRoutes ajoutée à vue-router2, sinon

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée des étapes pour générer une chaîne aléatoire de longueur personnalisée en php

Explication du recadrage d'image php et exemples d'utilisation de vignettes

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
如何在 Windows 11 上检查 NAT 类型如何在 Windows 11 上检查 NAT 类型Apr 13, 2023 pm 10:22 PM

延迟死亡是在线游戏玩家可能发生的最糟糕的事情。但是您知道吗,它并不总是由网速慢引起的?与流行的看法相反,这通常是您的 NAT 类型的问题,并且不会通过简单地致电您的互联网服务提供商来解决。什么是 NAT,它有什么作用?网络地址转换或 NAT 是一种网络系统,它提供了一种将本地 IP 地址修改为更广泛的互联网地址的方法。这就是您能够在同一本地网络上的许多设备上使用单个 IP 地址的方式。NAT 作为路由器的一部分,基本上将您的路由器变成本地网络和更广泛的互联网之间的中间管理者。但是,不只有一个 N

Wi-Fi 没有有效的 IP 配置:如何修复Wi-Fi 没有有效的 IP 配置:如何修复Apr 13, 2023 pm 06:22 PM

重启你的电脑和路由器你知道该怎么做; 如果您致电 ISP 技术支持,他们会要求您重新启动网络硬件。这是有充分理由的,因为重新启动您的 PC 将清除可能与您的连接发生冲突的正在运行的应用程序和缓存。重新启动(反弹)您的路由器(通常是包含路由器和调制解调器的组合单元)将清除其缓存并重新建立可靠的在线连接。如果您还有一个单独的调制解调器,也请重新启动它。通过拔下电源按钮30 秒重新启动路由器,然后将其重新插入。启动路由器后,重新启动 PC 并查看您是否重新获得稳定的 Wi-Fi 连接。重新启用 Wi-

使用设置应用程序或路由器在 iPhone 上查找 Mac 地址的 5 大方法使用设置应用程序或路由器在 iPhone 上查找 Mac 地址的 5 大方法Apr 13, 2023 pm 05:46 PM

任何连接到互联网的设备都有两种类型的地址——物理地址和互联网地址。虽然 Internet 地址在全球范围内定位设备,但物理地址有助于识别连接到本地网络的特定设备。这个物理地址在技术上称为 MAC 地址,如果您想知道您的 iPhone 是否有一个,是的,所有手机(包括 iPhone)都有自己独有的 MAC 地址。什么是 MAC 地址?媒体访问控制或 MAC 地址是一种独特的指标,用于从连接到同一网络的其他设备中识别您的设备。如果您拥有可以连接到互联网的设备,它将注册一个 MAC 地址。此地址由占

解决“Windows 11 上的 DNS 服务器未响应”问题的 12 种方法解决“Windows 11 上的 DNS 服务器未响应”问题的 12 种方法Apr 15, 2023 pm 10:46 PM

什么是DNS?DNS是域名系统的首字母缩写词,它是一个分散的命名系统,所有计算机、服务器和更多试图连接到互联网的设备都使用它。DNS有助于识别您的PC和发送到它的流量,系统会自动破译并显示必要的信息。为什么我在Windows11上收到“DNS服务器没有响应”?这个问题可能有很多原因。有时,Windows可能会将网络问题误认为是DNS问题,而有时它很可能是第三方应用程序干扰了您的网络。最近对AVG防病毒软件的更新似乎是导致此问题的主要原因,禁用该更新似乎可以解决大多数用户的此问题

linux添加路由命令是什么linux添加路由命令是什么Jan 04, 2023 pm 01:49 PM

linux添加路由命令是“route”,linux添加路由的方法是:1、在“/etc/rc.local”里添加“route add -net 192.168.2.0/24 gw 192.168.3.254”;2、在“/etc/sysconfig/network”里添加“GATEWAY=gw-ip”到末尾;3、在“static-router”添加“any net ...”即可。

用 NTP 时间服务器错误修复路由器失去联系的 3 种方法用 NTP 时间服务器错误修复路由器失去联系的 3 种方法May 22, 2023 pm 03:43 PM

连接和WiFi的问题可能会非常令人沮丧并显着降低生产力。计算机使用网络时间协议(NTP)进行时钟同步。在大多数情况下(如果不是全部),您的笔记本电脑使用NTP来跟踪时间。如果您的服务器因NTP时间服务器错误消息而失去联系,请阅读本文到底以了解如何修复它。当路由器的时间设置不正确时会发生什么?路由器的性能通常不受时间设置错误的影响,因此您的连接可能不会受到影响。但是,可能会出现一些问题。这些包括:使用路由器作为本地时间服务器的所有小工具的时间不正确。路由器日志数据中的时间戳将是错误的。如果由于

如何在 Windows 11 / 10 上解决无互联网安全问题如何在 Windows 11 / 10 上解决无互联网安全问题May 11, 2023 pm 10:07 PM

在Windows11/10计算机上看到的与互联网连接相关的问题之一是“无互联网,安全”错误消息。基本上,此错误消息表明系统已连接到网络,但由于连接存在问题,您无法打开任何网页并接收数据。在Windows中连接到任何网络时可能会遇到此错误,最好是在通过不在附近的WiFi路由器连接到Internet时。通常,当您检查系统托盘右下方的无线图标时,会看到一个黄色的小三角形,当您单击它时,会显示无Internet,安全消息。出现此错误消息没有具体原因,但配置设置的更改可能会导致您的路由器无法连接

路由选择是osi模型中什么层的主要功能路由选择是osi模型中什么层的主要功能Dec 09, 2020 pm 05:48 PM

路由选择是osi模型中网络层的主要功能。osi模型是指开放式系统互联通信参考模型,是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。OSI将计算机网络体系结构划分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft