ホームページ ウェブフロントエンド jsチュートリアル vue addRoutes を使用して動的許可ルーティング メニューを実装する手順の詳細な説明

vue addRoutes を使用して動的許可ルーティング メニューを実装する手順の詳細な説明

May 21, 2018 pm 01:52 PM
権限 ルーティング

今回は、vue addRoutes を使用して動的パーミッション ルーティング メニューを実装する手順について詳しく説明します。vue addRoutes で動的パーミッション ルーティング メニューを実装するための 注意点とは何ですか。実際のケースを見てみましょう。

要件

最近、バックエンド管理システムを引き継ぎ、バックエンドからナビゲーション メニューをプルする効果を実現する必要がありました。プルされたナビゲーション メニューは、ログインしているユーザーのさまざまな権限に応じて異なります。操作可能なインターフェースにも違いがあります。

問題

バックグラウンド管理システムは vue+vue-router+element-ui+vuex の組み合わせを使用するように準備されていますが、シングルページ アプリケーションはページに入る前に vue-router をインスタンス化し、それが原因です。は vue インスタンスに挿入されるため、ログイン ページに入るときにルートを再カスタマイズする方法はありません。いろいろ検索した結果、vue-router がバージョン 2.0 でルートを追加する addRoutes メソッドを提供していることがわかり、一縷の望みが見えてきました。

苦労の末、ようやくこの機能を実現しました。簡単にレビューできるように記録しました。同じニーズを持つ同志に役立つことを願っています。

アイデア

1. まず、ログイン、404 ページなどの固定ルーティング アドレスをローカルに設定します。

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
ログイン後にコピー
これらの固定ルートを設定した後、ログイン ページに移動できます。それ以外の場合は、ログイン ページに移動できません。続ける。

2. 次に、重要なステップは、返される必要がある許可メニューのリスト情報についてバックエンドのベテランと合意する必要があることです。ここでは、必要なルーティング構造を分析します。例。自分で直接

ルートを定義すると、次の構造になります:

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)
      },
      {
      ...
      }   
    ]
  }]
})
ログイン後にコピー
上記の構造分析によると、実際に本当に

動的構成が必要なルートは、実際には/layoutの下の子の部分です。バックエンドを含めるには、すべてのルートの配列で十分です

返されたデータの rootList は、第 1 レベルのナビゲーションのリストです。実際には、第 1 レベルのナビゲーションには

ルーティング関数 がありません。 、これは セカンダリ メニュー を切り替えるための単なるトリガーです、subList これは本当に必要なルーティング情報です。

3. パーミッションルーティング情報を取得したら、データをローカルで処理して、必要なデータに組み立てる必要があります:

// 登录
   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 <= 1) {
        this.$router.addRoutes(routes)
        // this.$router不是响应式的,所以手动将路由元注入路由对象
        this.$router.options.routes.push(routes)
       }
       this.$router.replace(&#39;/layout/index&#39;)
      }
     })
     .catch((err) => {
      this.loging = false
      console.error('错误:', err)
     })
   },
ログイン後にコピー
メニューリストとサブリストを処理するメソッド: mergeSubInRoot と 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 < roots.length; i++) {
    let rootCode = roots[i].code
    roots[i].children = []
    for (let j = 0; j < subs.length; j++) {
     if (rootCode === subs[j].code.substring(0, 4)) {
      roots[i].children.push(subs[j])
     }
    }
   }
  }
  return roots
 },
 /**
  * 合并远程路由到本地路由
  * @param: subList [Array] 远程路由列表
  * @param: routes [Array] 本地路由列表
  * */
 mergeRoutes (subs) {
  if (subs) {
   for (let i = 0; i < subs.length; i++) {
    let temp = {
     path: subs[i].actUrl,
     name: subs[i].actUrl,
     component: (resolve) => 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
 }
}
ログイン後にコピー
これまでのところ、正常にルーティングされています。ローカル ルーティングに設定された私のシステム ログインは次のとおりです

フォローアップの最適化

1. メニュー リストとセカンダリ ナビゲーションの切り替えの表示:

<template>
  <p class="mainMenu">
   <el-menu
    class="menubar"
    mode="horizontal"
    :default-active="activeCode"
    background-color="#545c64"
    text-color="#fff"
    active-text-color="#ffd04b">
    <el-menu-item :index="item.code | splitCode" v-for="item in menuList" :key="item.code" @click="switchSubMenu(item)" v-if="item.code !== &#39;0008&#39;">
     <i :class="`iconfont icon-${item.imgUrl}`"></i>
     <span slot="title">{{item.name}}</span>
    </el-menu-item>
   </el-menu>
  </p>
</template>
<script type="text/ecmascript-6">
 import {mapState, mapMutations} from 'vuex'
 export default {
  name: 'menu',
  data () {
   return {
    msg: 'Welcome to Your Vue.js App'
   }
  },
  computed: {
   ...mapState(['menuList']),
   activeCode () {
     // 通过code保证在切换字路由的情况下一级路由也是高亮显示
    return this.$route.meta.code.substring(0, 4)
   }
  },
  methods: {
   ...mapMutations(['saveRes']),
   // 切换二级路由
   switchSubMenu (route) {
    console.info('路由:', route)
    if (route.actUrl !== 'index') {
     // 用currentSubMenu控制二级路由数据 
     this.saveRes({label: 'currentSubMenu', value: route.children})
     this.$router.push(`/layout/${route.children[0].actUrl}`)
    } else {
     // 不存在二级路由隐藏二级 
     this.saveRes({label: 'currentSubMenu', value: ''})
     this.$router.push(`/layout/${route.actUrl}`)
    }
   }
  },
  filters: {
   splitCode (code) {
    return code.substring(0, 4)
   }
  }
 }
</script>
ログイン後にコピー
2. 更新ルートが失われないようにします。このとき、シングルページ アプリケーションは再初期化され、解放前に戻ると、ローカルに設定されたルートのみがジャンプできます。このとき、app.vue で次のコードを実行できます (追記: どこで更新しても app.vue が実行されます):

<script>
 import {decrypt} from '@/libs/AES'
 import handleMenu from '@/router/handleMenu'
 export default {
  name: 'app',
  created () {
   // 当this.$router.options.routes的长度为1,且本地缓存存在菜单列表的时候才重新配置路由
   if (this.$router.options.routes.length <= 1 && sessionStorage.getItem('subList')) {
    let subList = JSON.parse(decrypt(sessionStorage.getItem('subList')))
    let routes = handleMenu.mergeRoutes(subList)
    this.$router.addRoutes(routes)
    // this.$router不是响应式的,所以手动将路由元注入路由对象
    this.$router.options.routes.push(routes)
   }
  }
 }
</script>
ログイン後にコピー
このようにすると、更新されてもルーティングが再構成されます。

3. ページボタンのレベル制御に関しては、これを行うためのコマンドをカスタマイズできます。対応するルートのメタオブジェクトに権限リストを入れているため、各ページの現在のページで現在のユーザーが持つ権限に簡単に戻ることができます

カスタム手順については公式ドキュメントを参照してください

結論

作業が完了したら、vue-router2 に追加された addRoutes メソッドのおかげで、それ以外の場合は

この記事の事例を読んだ後はメソッドを習得したと思います。さらに興味深い情報については、注目してください。 PHP 中国語 Web サイトの他の関連記事へ!

推奨読書:

phpでカスタムの長さのランダムな文字列を生成する手順の詳細な説明

php画像のトリミングとサムネイルの使用方法の説明

以上がvue addRoutes を使用して動的許可ルーティング メニューを実装する手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ワンクリックで root 権限を有効にします (root 権限をすばやく取得します) ワンクリックで root 権限を有効にします (root 権限をすばやく取得します) Jun 02, 2024 pm 05:32 PM

ルート権限は、Android システムの管理者権限です。 root 権限を取得するには、通常、一連の面倒な手順が必要ですが、これは一般ユーザーにとってはあまり使いやすいものではないかもしれません。この記事では、ワンクリックで root 権限を有効にすることで、ユーザーがシステム権限を簡単に取得できるシンプルかつ効果的な方法を紹介します。 root 権限の重要性とリスクを理解し、root 権限を使用すると、ユーザーは携帯電話システムを完全に制御できるようになります。セキュリティ管理を強化し、テーマをカスタマイズし、ユーザーはプリインストールされたアプリケーションを削除できます。ただし、たとえば、システム ファイルを誤って削除してシステム クラッシュを引き起こしたり、root 権限を過剰に使用したり、マルウェアを誤ってインストールしたりすることも危険です。 root権限を使用する前に

QQスペースで権限アクセスを設定する方法 QQスペースで権限アクセスを設定する方法 Feb 23, 2024 pm 02:22 PM

QQ スペースで許可アクセスを設定するにはどうすればよいですか? QQ スペースで許可アクセスを設定できますが、ほとんどの友達は QQ スペースで許可アクセスを設定する方法を知りません。次は、QQ スペースで許可アクセスを設定する方法の図です。ユーザー向けのエディタです。テキストチュートリアルです。興味のある方はぜひ見に来てください。 QQ 使い方チュートリアル QQ スペース アクセス権限の設定方法 1. まず QQ アプリケーションを開き、メインページの左上隅にある [アバター] をクリックします; 2. 次に、左側の個人情報領域を展開し、[設定] 機能をクリックします左下隅にある; 3. 設定ページに移動します スワイプして [プライバシー] オプションを見つけます; 4. 次にプライバシー インターフェイスで、[アクセス許可設定] サービスを選択します; 5. 次に、最新のページに挑戦し、[スペース ダイナミクス] を選択します]; 6. QQスペースに再度セットアップします

Discuz フォーラムの権限管理: 読み取り権限設定ガイド Discuz フォーラムの権限管理: 読み取り権限設定ガイド Mar 10, 2024 pm 05:33 PM

Discuz フォーラムの権限管理: 権限設定ガイドをお読みください。 Discuz フォーラム管理では、権限設定は重要な部分です。その中でも、読み取り権限の設定は、フォーラム内でさまざまなユーザーが表示できるコンテンツの範囲を決定するため、特に重要です。この記事では、Discuz フォーラムの読み取り許可設定と、さまざまなニーズに合わせて柔軟に設定する方法を詳しく紹介します。 1. 読み取り権限の基本概念 Discuz フォーラムでは、読み取り権限には主に次の概念が含まれており、理解する必要があります。 デフォルトの読み取り権限: 新規ユーザー登録後のデフォルト

Java Apache Camel: 柔軟で効率的なサービス指向アーキテクチャの構築 Java Apache Camel: 柔軟で効率的なサービス指向アーキテクチャの構築 Feb 19, 2024 pm 04:12 PM

Apache Camel は、異種のアプリケーション、サービス、データ ソースを簡単に統合して、複雑なビジネス プロセスを自動化できる Enterprise Service Bus (ESB) ベースの統合フレームワークです。 ApacheCamel はルートベースの構成を使用して、統合プロセスを簡単に定義および管理します。 ApacheCamel の主な機能は次のとおりです。 柔軟性: ApacheCamel は、さまざまなアプリケーション、サービス、データ ソースと簡単に統合できます。 HTTP、JMS、SOAP、FTP などの複数のプロトコルをサポートします。効率: ApacheCamel は非常に効率的で、大量のメッセージを処理できます。非同期メッセージング メカニズムを使用しているため、パフォーマンスが向上します。拡張可能

TrustedInstaller 権限を取得する方法「TrustedInstaller 権限を取得するための推奨手順」 TrustedInstaller 権限を取得する方法「TrustedInstaller 権限を取得するための推奨手順」 Feb 06, 2024 pm 05:48 PM

この記事では、TI の本質を理解し、powershell および NtObjectManager モジュールを利用して TI 権限を取得し、オペレーティング システムで必要な操作を完了する方法をさらに詳しく説明します。 Windows システムを管理したことがある場合は、trustedInstaller (TI) グループの概念に精通しているはずです。 TI グループは、システム ファイルとレジストリの操作における重要な権限を持っています。たとえば、System32 フォルダにあるファイルのプロパティを表示できます。セキュリティ オプションでは、TI グループとファイル所有者にファイルの削除と変更の権限があります。管理者であってもセキュリティ オプションを直接変更することはできません。したがって、システムファイルとレジストリの操作には、次のことが必要です。

win7 コンピューターで全員のアクセス許可を設定する方法の紹介 win7 コンピューターで全員のアクセス許可を設定する方法の紹介 Mar 26, 2024 pm 04:11 PM

1. 電子ディスクを例に挙げます。 [コンピュータ]を開き、[eDisk]をクリックし、右クリックして[プロパティ]をクリックします。図に示すように: 2. [ウィンドウ] ページで、インターフェイスを [セキュリティ] オプションに切り替え、下の [編集] オプションをクリックします。図に示すように: 3. [アクセス許可] オプションで、[追加] オプションをクリックします。図に示すように: 4. ユーザーとグループ ウィンドウが表示され、[詳細] オプションをクリックします。図に示すように: 5. [今すぐ検索] - [全員] オプションをクリックして順に展開し、完了したら [OK] をクリックします。図に示すように: 6. [E Disk Permissions] ページの [Group or User] にユーザー [Everyone] が追加されていることが確認できたら、[Everyone] を選択し、[フル コントロール] の前のチェックボックスをオンにします。設定が完了したら、[OK]を押すだけです。

JavaScript 関数を使用して Web ページのナビゲーションとルーティングを実装する JavaScript 関数を使用して Web ページのナビゲーションとルーティングを実装する Nov 04, 2023 am 09:46 AM

最新の Web アプリケーションでは、Web ページのナビゲーションとルーティングの実装は非常に重要な部分です。 JavaScript 関数を使用してこの関数を実装すると、Web アプリケーションをより柔軟でスケーラブルで使いやすいものにすることができます。この記事では、JavaScript 関数を使用して Web ページのナビゲーションとルーティングを実装する方法を紹介し、具体的なコード例を示します。 Web ページ ナビゲーションの実装 Web アプリケーションの場合、Web ページ ナビゲーションはユーザーが最も頻繁に操作する部分です。ユーザーがページをクリックしたとき

共有フォルダーのアクセス許可をどこに設定しますか? Win10 で共有フォルダーのアクセス許可を読み取り専用に設定し、変更できないようにするためのヒント 共有フォルダーのアクセス許可をどこに設定しますか? Win10 で共有フォルダーのアクセス許可を読み取り専用に設定し、変更できないようにするためのヒント Feb 29, 2024 pm 03:43 PM

Win10で共有フォルダーの読み取り専用アクセス許可を設定するにはどうすればよいですか?ホストがフォルダーを共有した後、一部のユーザーは、他のユーザーがファイルにアクセス、読み取り、表示することだけを望み、他のユーザーがホスト上のファイルを変更することを望まないことがあります。この記事は、共有フォルダーのアクセス許可を読み取り専用に設定し、変更できないようにする方法に関するチュートリアルです。 1. まず、通常の手順に従ってフォルダーを共有します。ホスト側で、共有する必要があるフォルダーを右クリックし、[プロパティ]-[共有]-[詳細な共有]-[このフォルダーを共有する] にチェックを入れます。デフォルトでは、Everyone アカウントですが、存在しない場合は、Everyone アカウントを追加します。 3. 以下の読み取り権限のみをチェックし、[OK] をクリックします。 4. フォルダのプロパティ - セキュリティを見つけて、Ever アカウントを追加します。

See all articles