ホームページ  >  記事  >  ウェブフロントエンド  >  vue iview 動的ルーティングと権限検証手順の詳細な説明

vue iview 動的ルーティングと権限検証手順の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-28 11:50:382406ブラウズ

今回は、vue iviewの動的ルーティングと権限の検証の手順について詳しく説明します。vue iviewの動的ルーティングと権限の検証を使用する際の注意事項は何ですか?実際のケースを見てみましょう。

github には Vue で動的にルートを追加する例がたくさんあります。いくつかのプロジェクトを参照した後、このプロジェクトは iview フレームワークに基づいて動的ルートの動的追加とメニューの更新を完了しました。困っている他の友達を助けるために、私は実装ロジックを共有します。一緒にコミュニケーションをとって学びましょう。

Githubアドレス

iview-dynamicRouter

目標を達成する

クライアントはサーバーからルーティングとパーミッションのデータを取得した後、プロジェクトのルーティングとメニューのリストを更新し、パーミッション制御を実行します。

プロジェクトの基礎

  • 基本フレームワーク: iview コンポーネント ライブラリ 公式テンプレート プロジェクト iview-admin のテンプレート ブランチ プロジェクト、このプロジェクトは iview-admin の基本フレームワーク コードです。プロジェクトアドレス: iview-admin

実装ロジック

動的ルーティング制御の読み込み

一般に、動的ルーティング制御は2つのタイプに分けられます。1つは、すべてのルーティングデータをローカルファイルに保存し、その後取得するものです。サーバーからユーザーの権限情報を取得し、ルートジャンプ時の権限判定フックを追加します。ユーザーが遷移したページが権限リストにない場合、ジャンプを禁止します。もう 1 つは、

エラー処理 ページや権限制御ページなどの基本ルートのみをローカルに保存し、サーバーはユーザーの権限とクライアントに基づいて対応するルーティング データを発行します。これらのデータを使用して、ルートを動的に生成および追加するために、この記事では 2 番目の方法を採用します。

iview-admin プロジェクトはルートを 3 つのタイプに分けます:

  • メインコンポーネントのサブページとして表示されないページルート (ログイン、404、403、およびサブとしてのその他のエラーページルート)。 - メインコンポーネントのページ。otherRouter は表示されますが、ホームページのルーティングなど、メインコンポーネントのサブページとして表示され、左側のメニューに表示されます。

  • ルーティング データを取得した後、主に 2 つのことを行います。操作の一部、最初の部分はデータを走査し、コンポーネントの非同期読み込みメソッドを使用して各ルーティング ノードに対応するコンポーネントを読み込み、ページ タグを使用します。
  • フレームワークと

    ブレッドクラム ナビゲーション

    の下で appRouter を走査してルーティング情報を取得するため、グローバル アクセスのためにルーティング データも vuex に保存する必要があります。
  • 404 ページが静的ルートの場合、初めてページに入ったとき、動的ルートはまだロードされておらず、

    ルーティング アドレス

    が見つからない場合は、デフォルトでは 404 エラー ページにジャンプし、エクスペリエンスが非常に悪いため、404 ルートは最初にルーティング ルールに書き込まれず、動的ルーティングと一緒にロードされます。
メインコードは次のように実装されます:

router.addRoutes(routes) 完成路由列表的动态添加;第二部分是因为 iview-admin データリクエストとルーティングノード生成

//util.js
//生成路由
util.initRouter = function (vm) {
 const constRoutes = [];
 const otherRoutes = [];
 // 404路由需要和动态路由一起注入
 const otherRouter = [{
  path: '/*',
  name: 'error-404',
  meta: {
   title: '404-页面不存在'
  },
  component: 'error-page/404'
 }];
 // 模拟异步请求
 util.ajax('menu.json').then(res => {
  var menuData = res.data;
  util.initRouterNode(constRoutes, menuData);
  util.initRouterNode(otherRoutes, otherRouter);
  // 添加主界面路由
  vm.$store.commit('updateAppRouter', constRoutes.filter(item => item.children.length > 0));
  // 添加全局路由
  vm.$store.commit('updateDefaultRouter', otherRoutes);
  // 刷新界面菜单
  vm.$store.commit('updateMenulist', constRoutes.filter(item => item.children.length > 0));
 });
};
//生成路由节点
util.initRouterNode = function (routers, data) {
 for (var item of data) {
  let menu = Object.assign({}, item);
  menu.component = lazyLoading(menu.component);
  if (item.children && item.children.length > 0) {
   menu.children = [];
   util.initRouterNode(menu.children, item.children);
  }
  //添加权限判断
  meta.permission = menu.permission ? menu.permission : null;
  //添加标题
  meta.title = menu.title ? menu.title : null;
  menu.meta = meta;
 }
};

動的読み込みコンポーネント

//lazyLoading.js
export default (url) =>()=>import(`@/views/${url}.vue`)
Store缓存实现
//app.js
 // 动态添加主界面路由,需要缓存
updateAppRouter (state, routes) {
 state.routers.push(...routes);
 router.addRoutes(routes);
},
// 动态添加全局路由,不需要缓存
updateDefaultRouter (state, routes) {
 router.addRoutes(routes);
},
// 接受前台数组,刷新菜单
updateMenulist (state, routes) {
 state.menuList = routes;
}
最終的にmain.jsで呼び出される

//main.js
 mounted () {
 // 调用方法,动态生成路由
 util.initRouter(this);
 }

権限制御

動的ルーティングの実装と同様操作許可制御には大きく分けて 2 種類あり、1 つはページ表示時に許可を制御しない、操作開始時に許可判定を行う方法です。 2 番目の方法は、ページの読み込み時に権限を判断し、権限のない操作は表示されません。私は、ユーザーに誤解を与えない 2 番目の方法を好みます。個人的には、ユーザーに表示されるものが操作可能であるべきだと考えています。そうしないと、ボタンをクリックした後に許可がないとメッセージが表示されるのは非常に不快です。 このプロジェクトのアイデアのソースについては、参照ブログ投稿を参照してください。元のブロガーの具体的なアイデアは次のとおりです。ルーティング構造のメタ フィールドに、

ユーザー

操作許可リストを追加し、グローバル コマンドを登録します。ノードが初めてレンダリングされるとき、ページの権限が存在するかどうかを確認し、権限が存在し、渡されたパラメータが権限リストにない場合、ノードは直接削除されます。

主なコードの実装は次のとおりです: ルーティング データに許可フィールドを追加して、許可リストを保存します

//menu.json,模拟异步请求数据
[
 {
 "path": "/groupOne",
 "icon": "ios-folder",
 "name": "system_index",
 "title": "groupOne",
 "component": "Main",
 "children": [
  {
  "path": "pageOne",
  "icon": "ios-paper-outline",
  "name": "pageOne",
  "title": "pageOne",
  "component": "group/page1/page1",
  "permission":["del"]
  },
  ...
 ]
 }
]

在遍历生成路由节点时,将 permission 字段数据存入路由节点 meta 属性中

//util.js
//生成路由节点
util.initRouterNode = function (routers, data) {
 for (var item of data) {
  ....
  //添加权限判断
  meta.permission = menu.permission ? menu.permission : null;
  ...
 }
};

定义全局命令组件,读取路由 permission 属性值获得权限列表,如果该不权限在权限列表中,则删除节点

//hasPermission.js 
const hasPermission = {
 install (Vue, options) {
  Vue.directive('hasPermission', {
   bind (el, binding, vnode) {
    let permissionList = vnode.context.$route.meta.permission;
    if (permissionList && permissionList.length && !permissionList.includes(binding.value)) {
     el.parentNode.removeChild(el);
    }
   }
  });
 }
};
export default hasPermission;

权限组件使用示例

<template>
 <p>
  <h1>page1</h1>
  <Button v-hasPermission="&#39;add&#39;">添加</Button>
  <Button v-hasPermission="&#39;edit&#39;">修改</Button>
  <Button v-hasPermission="&#39;del&#39;">删除</Button>
 </p>
</template>

全局注册组件

// main.js
import hasPermission from '@/libs/hasPermission.js';
Vue.use(hasPermission);

这种权限控制方法的优点就是,不管是管理配置还是页面处理逻辑都相对简单,没有很多重复的代码判断和节点处理,在参考对比了网上几种实现方式后,个人比较推荐这一种方法。

页面标签和面包屑导航

在我看来,页面标签和面包屑都属于系统中锦上添花的页面相关控件,提高页面管理的便捷性,在iview官方admin项目中已经实现了这两个组件。所以这个项目中,只是将其进行移植,实现了组件功能,没有深入了解,感兴趣的可以仔细研究。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

分享页面后跳转回首页

Vue自定义动态组件使用详解

以上がvue iview 動的ルーティングと権限検証手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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