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 でトランザクションのコミットとロールバックを実装する方法の詳細な例

最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

Nginx リバースプロキシの例の詳細な説明

1. リバースプロキシの例1 1. 効果を達成する(1)ブラウザを開き、www.123.comと入力...

Linux システムで Centos7 を使って ElasticSearch ミドルウェアと共通インターフェースを構築するデモ

1. ミドルウェアの紹介1. 基本概念ElasticSearch は Lucene をベースにした検...

シリアルポート使用時のvue-electronの問題解決

エラーは次のとおりです:キャッチされない TypeError: 未定義のプロパティ 'mod...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

MySQLデータ移行方法とツールの分析

この記事は主にMySQLデータ移行方法とツールの分析を紹介します。サンプルコードを通じて詳細に紹介さ...

MySQL グリーン解凍バージョンのインストールと設定手順

手順: 1. MySQLデータベースをインストールする1. MySQL-5.6.17-winx64....

初心者向けウェブサイト構築チュートリアルの概要

これら 6 つの記事を書いた後、私は少し混乱し始めました。次にどこに書けばいいのか分かりません。ドメ...

Jsモジュールパッケージのエクスポートの使用法と違いにはインポートが必要

目次1. Commonjsのエクスポートとrequireの使用1.1 CommonJS エクスポート...

Vueでシングルサインオンを実装する方法のまとめ

最近プロジェクトが中断され、RageFrame の研究は一時的に終了しました。この記事では、シングル...

Gitlab-ci を使用してリモート マシンに継続的にデプロイする方法 (詳細なチュートリアル)

簡単に言うと、今日は Gitlab-CI を使用してリモート サーバーに自動的にデプロイする方法につ...

スライドによるページめくり効果とクリックイベント問題をモバイル端末上で実装する

前述のこの記事はとても短いです〜主な目的は、モバイル端末上のクリックと js イベントのメカニズムに...

MySQLクライアントとサーバーのプロトコルの解釈

目次MySQL クライアント/サーバー プロトコルMySQL サーバーから高いパフォーマンスを得る必...