Vueでルーティング権限を動的に設定する主なアイデア

Vueでルーティング権限を動的に設定する主なアイデア

以前、インターネット上で動的ルーティング設定をいくつか見たことがありましたが、現在のプロジェクトとはあまり互換性がなかったので、自分で実装しました。主なアイデアは次のとおりです。

1. ルートを設定するときに ID をバインドします。バックエンドの開発が完了したら、バックエンドと ID を同期するだけです。この ID は一意であり、変更されません。この ID に基づいて、ルート アドレスとアイコンを見つけることができます。

定数 routerArr = [
 {
 パス: ''、
 名前: ''、
 コンポーネント: () => import( /* webpackChunkName: "strategiesMaintain" */ '@/components/Layout/Index'),
 メタ: {
 認証が必要: true、
 id: 1,
 アイコン: 'iconzhanghuguanli',
 タイトル:「ルート1」
 },
 子供たち: [{ 
 パス: '/verificationLog',
 名前: 'VerificationLog',
 コンポーネント: () => import( /* webpackChunkName: "verificationLog" */ '@/views/auditManage/verificationLog'),
 メタ: {
 認証が必要: true、
 id: 101,
 アイコン: 'icon-disanfangyanzhengrizhi',
 タイトル:「ルート11」
 }
 }, {
 パス: '/systemLog',
 名前: 'SystemLog',
 コンポーネント: () => import( /* webpackChunkName: "systemLog" */ '@/views/auditManage/systemLog'),
 メタ: {
 認証が必要: true、
 id: 102,
 アイコン: 'icon-xitongcaozuorizhi',
 タイトル:「ルート12」
 }
 }]
 }
];

デフォルトの routerArr をエクスポートします。

2. 主にIDバインディングルートアドレスとiconClassに基づいて、ローカルルートとバックエンドからのルート間の接続を設定します。

「@/router/modules」から routerModules をインポートします。
'@/utils/http' から {http} をインポートします。
'@/store' からストアをインポートします。
'element-ui' から { Message } をインポートします

const formateResData = (val) =>{ // ルーティングデータをフォーマットします const obj = {};
 定数fn = (arr)=>{
  for(let i = 0,item;item = arr[i++];){
  オブジェクト[アイテム['メタ']['id']] = {
   パス: アイテム['パス'],
   アイコンクラス: item['meta']['icon']
  };
  (item.children && item.children.length > 0)の場合{
   fn(アイテム.children);
  }
  }
 }
 fn(値);
 obj を返します。
};

const MAPOBJ = formatResData(ルーターモジュール);
const dealWithData = (navData) => { // メニューデータを処理する let firstLink = "";
 定数navIdArr = [];
 定数fn = (arr) => {
  (let i = 0,item;item = arr[i++];) {
  item['iconClass'] = MAPOBJ[item.id].iconClass;
  アイテム['linkAction'] = MAPOBJ[item.id].path;
  navIdArr.push(アイテムID);
  if (!firstLink && !item.subMenu) { // デフォルトのジャンプを設定する firstLink = item['linkAction'];
  }
  if (item.subMenu && item.subMenu.length > 0) {
   fn(item.subMenu);
  }
  }
 }
 fn(ナビゲーションデータ);
 {navData、navIdArr、firstLink} を返します。
};

navIds = [] とします。

const getNav = async (to={},from={},next=()=>{})=>{ // ナビゲーション データを取得します const {code,data} = await http("/menu/list", {}, "GET"); // メニュー データを取得します // const data = require("@/mock/api/menuData"); // モック データを使用します const {navData,navIdArr,firstLink} = dealWithData(data);
 ストアをコミットします('setNavData', navData);
 navIds = navIdArr;
 if(to.fullPath == '/index'){ // ログインするかホームページに戻る next(firstLink);
 }else { // Refreshif(navIds.indexOf(to.meta.id) == -1){ // バックエンドは menuMessage.error('メニューが存在しないか、権限がありません') を返しませんでした。
  戻る;
 }
 次();
 }
}

export const setGuard = (to={},from={},next=()=>{}) =>{ // 権限を設定します if(navIds.length === 0){ // メニューデータがまだ取得されていません getNav(to,from,next);
 }else { // メニューデータを取得します if(navIds.indexOf(to.meta.id) == -1){ // バックエンドはメニューを返しませんでした Message.error('メニューが存在しないか、権限がありません');
  戻る;
 }
 次();
 }
}

3. mainjsで設定を導入する

router.beforeEach((to, from, next) => {
 トークンを wlhStorage.get("authorization");
 to.path == "/login"の場合{
 storage.clear(); // キャッシュをクリア next();
 } それ以外 {
 if (to.meta.requireAuth && token) { // ログイン setGuard(to,from,next);
 } else { // ログインしていない next("/login");
 }
 }
})

要約する

これで、Vue でルーティング権限を動的に設定する方法についての記事は終了です。Vue でルーティング権限を動的に設定する方法についての関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue の権限制御 (ルート検証) の 2 つの方法
  • Vueのルーティング権限管理に関するサンプルコード
  • Vue でルートのログイン権限を設定する方法
  • Vuexは、異なるユーザー権限に応じて異なるルーティングリスト機能を表示します。
  • Vueルーティングガード、フロントエンドページへのアクセス権限を制限する例
  • Vue ルーティングガードとページログイン権限制御を設定する方法 (2 つの方法)
  • Vue パーミッションルーティングを実装する方法の例のまとめ
  • Vueカスタム指示と動的ルーティングによる権限制御の実現
  • vue-routerはルーティング権限の実装を制御します
  • Vueルーティング権限検証機能の実装コード

<<:  ランダムな文字を生成する Java サンプルコード

>>:  ランダムロールコールテーブルを実装するためのネイティブJavaScript

推薦する

MySQLで最大接続数を達成する方法

目次データベース接続数が急増した理由は何ですか? 1. はじめに2. 知識ポイント3. 練習するIV...

MySQL トランザクション分離レベルの詳細

serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...

MySql 学習 3 日目: データ テーブル間の接続とクエリの詳細

主キー:キーワード: 主キー機能: null にすることはできず、一意である必要があります。主キーの...

MySQL はどのようにしてマスターとスレーブの一貫性を確保するのでしょうか?

目次MySQLマスタースレーブの基本原理3つのbinlog形式の比較混合形式のバイナリログが存在する...

JavaScript プロトタイプのデータ共有とメソッド共有の実装を調べる

データ共有プロトタイプにはどのようなデータを書き込む必要がありますか?共有する必要があるデータはプロ...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

モバイルレイアウト用の動的REMの実装

ダイナミックレム1. まず、現在の長さの単位を紹介しましょうpx em Mの幅 / 漢字の幅 1em...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

CentOS での samba フォルダ共有サーバー構成の詳細な説明

1. はじめに最近、CentOS での開発には多くの不便があることがわかりました。Windows/M...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...

HTML CSS JS はタブページのサンプルコードを実装します

コードをコピーコードは次のとおりです。 <html xmlns="">...

HTMLはフォームタグを使用して登録ページのサンプルコードを実装します。

ケースの説明: - ページ効果を実現するためにテーブルを使用する- ハイパーリンクを機能させたくない...

Mysqlサーバーのインストール、構成、起動、シャットダウン方法の詳細な説明

1. 公式サイトからダウンロード: https://dev.mysql.com/downloads/...

Ubuntu 18.04 に Nvidia グラフィック カード ドライバーをインストールするチュートリアル (画像とテキスト付き)

0. 事前準備BIOS でセキュア ブートを無効にします。無効にしないと、サードパーティ ソースを...

ルート権限なしでログインするためのDockerソリューション

docker コマンドを初めて使用する場合、権限の問題を確認するメッセージが表示されます。 unix...