首頁 web前端 js教程 vue iview動態路由與權限驗證步驟詳解

vue iview動態路由與權限驗證步驟詳解

Apr 28, 2018 am 11:50 AM
ie 驗證

這次帶給大家vue iview動態路由與權限驗證步驟詳解,使用vue iview動態路由與權限驗證的注意事項有哪些,下面就是實戰案例,一起來看一下。

github上關於vue動態新增路由的例子很多,本專案參考了部分項目後,在iview框架基礎上完成了動態路由的動態新增和選單刷新。為了幫助其他需要的朋友,現分享出實現邏輯,歡迎一起交流學習。

Github位址

iview-dynamicRouter

#實現目標

客戶端從服務端拿到路由與權限資料後,刷新項目的路由和選單列表,並進行權限控制。

專案基礎

  • 基礎架構: iview元件庫官方範本專案iview-admin 的template分支項目,此專案為iview-admin 的基礎框架程式碼。專案位址:iview-admin 

實作邏輯

#動態路由控制載入

一般來說,動態路由控制分為兩種:一種是將所有路由數據存儲在本地文件中,然後從服務端獲取用戶的權限信息,在路由跳轉時,添加權限判斷鉤子,如果用戶前往的頁面不在權限清單內,則禁止跳轉。另一種則是本地只儲存基本路由,如錯誤處理頁面、無權限控制頁面等,而權限路由則從伺服器獲取,伺服器根據使用者的權限下發相應的路由數據,客戶端利用這些資料進行路由的動態產生和添加,本文採用的是第二種方法。

iview-admin專案將路由分為三種:

  • 不作為Main元件的子頁面展示的頁面路由,例如login、404、403等錯誤頁面路由;

  • 作為Main元件的子頁面展示但是不在左側選單顯示的路由otherRouter ,例如首頁路由;

  • ##作為Main元件的子頁面展示並且在左側選單顯示的路由appRouter ;

拿到路由數據後,我們主要進行兩部分操作,第一部分是遍歷數據,利用組件異步加載的方法,載入每個路由節點對應的元件,之後利用

router.addRoutes(routes) 完成路由清單的動態新增;第二部分是因為 iview-admin 框架下的頁面標籤和麵包屑導航,需要遍歷appRouter取得路由信息,所以我們也需要將路由資料存入vuex ,以便全域存取。

需要特別注意的是,如果404頁面為靜態路由,那麼第一次進入頁面時,這時動態路由還未加載,找不到

路由地址會默認跳轉到404錯誤頁,體驗很差,所以404路由先不寫入路由規則中,和動態路由一起載入。

主要程式碼實作如下:

資料請求及路由節點產生

//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);
 }
登入後複製

權限控制

同動態路由實作方法類似,操作權限控制也一般也分為兩種,第一種是頁面顯示時不控制權限,所有的操作,例如按鈕全部展現,然後在操作發起時,進行權限判斷,如果用戶擁有該操作的權限,則通過,否則提醒用戶無權限,第二種則是在頁面加載的時候,就進行權限判斷,無權限的操作不進行顯示。本人更喜歡第二種方法,這樣不會對用戶進行誤導,個人認為用戶看到的應該就行可操作的,不然點下按鈕再提示無權限的感覺一定很不爽。

本項目的思路來源見參考博文,原博主的具體思路是:在路由結構的meta字段中,

添加用戶操作權限列表,然後註冊全局指令,當節點初次渲染時,判斷頁面是否存在權限,如果存在,且傳入的參數不在權限清單中,則直接刪除節點。

主要程式碼實作如下:

在路由資料中新增 permission 字段,存放權限列表

//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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在PDF中驗證簽名 如何在PDF中驗證簽名 Feb 18, 2024 pm 05:33 PM

我們通常會接收到政府或其他機構發送的PDF文件,有些文件有數位簽章。驗證簽名後,我們會看到SignatureValid訊息和一個綠色勾號。如果簽章未驗證,會顯示有效性未知。驗證簽名很重要,以下看看如何在PDF中進行驗證。如何在PDF中驗證簽名驗證PDF格式的簽名使其更可信,文件更容易被接受。您可以透過以下方式驗證PDF文件中的簽名。在AdobeReader中開啟PDF右鍵點選簽名,然後選擇顯示簽名屬性點選顯示簽署者憑證按鈕從「信任」標籤將簽名新增至「受信任的憑證」清單中點選驗證簽名以完成驗證讓

微信好友輔助驗證解封的詳細方法 微信好友輔助驗證解封的詳細方法 Mar 25, 2024 pm 01:26 PM

1.打開微信進入後,點選搜尋圖標,輸入微信團隊,點選下方的服務進入。 2、進入後,點選左下方的自助工具的選項。 3、點選後,在上方的選項內,點選解封/申訴輔助驗證的選項。

如何使用正規表示式驗證IFSC代碼? 如何使用正規表示式驗證IFSC代碼? Aug 26, 2023 pm 10:17 PM

印度金融系統代碼是縮寫。參與電子資金轉移系統的印度銀行分行由一個特殊的11位元字元代碼進行識別。印度儲備銀行在網路交易中使用此代碼在銀行之間轉移資金。 IFSC程式碼分為兩個部分。銀行由前四個字元進行標識,而分行由最後六個字元進行標識。 NEFT(全國電子資金轉移)、RTGS(即時毛額結算)和IMPS(即時支付服務)是一些需要IFSC代碼的電子交易。 Method使用正規表示式驗證IFSC程式碼的一些常見方法有:檢查長度是否正確。檢查前四個字元。 Checkthefifthcharacter.Che

golang中如何驗證輸入是否為全角字符 golang中如何驗證輸入是否為全角字符 Jun 25, 2023 pm 02:03 PM

在golang中,驗證輸入是否為全角字元需要用到Unicode編碼和rune類型。 Unicode編碼是一種將字元集中的每個字元分配一個唯一的數字碼位元的字元編碼標準,其中包含了全角字元和半角字元。而rune類型是golang中用來表示Unicode字元的類型。第一步,需要將輸入轉換為rune類型的切片。這可以透過使用golang的[]rune類型來轉換,例如

golang中如何驗證輸入是否為大寫字母 golang中如何驗證輸入是否為大寫字母 Jun 24, 2023 am 09:06 AM

Golang是一門高效能、現代化的程式語言,在日常開發中經常涉及字串的處理。其中,驗證輸入是否為大寫字母是常見的需求。本文將介紹在Golang中如何驗證輸入是否為大寫字母。方法一:使用unicode包Golang中的unicode包提供了一系列函數來判斷字元的編碼類型。對於大寫字母,其對應的編碼範圍為65-90(十進位),因此我們可以使用unicod

PHP 8 新功能:增加了驗證和簽名 PHP 8 新功能:增加了驗證和簽名 Mar 27, 2024 am 08:21 AM

PHP8是PHP的最新版本,為程式設計師帶來了更多的便利性和功能。這個版本特別關注安全性和效能,其中一個值得注意的新功能是增加了驗證和簽章功能。在本文中,我們將深入了解這些新的功能及其用途。驗證和簽名是電腦科學中非常重要的安全概念。它們通常用於確保傳輸的數據是完整和真實的。在處理線上交易和敏感資訊時,驗證和簽名變得尤為重要,因為如果有人能夠篡改數據,可能會對

在PHP中使用Google reCAPTCHA進行驗證 在PHP中使用Google reCAPTCHA進行驗證 Jun 19, 2023 pm 05:38 PM

在現代網路世界中,網站的安全性以及使用者隱私的保護越來越成為重要議題。其中,人機驗證此技術方法已成為防範惡意攻擊行為的不可或缺的方式之一。 GooglereCAPTCHA,是一個被廣泛應用於人機驗證的工具,其概念已經深入人心,甚至在我們每天使用的許多網站上都能夠看到其存在的身影。在本文中,我們將探討如何在PHP中使用GooglereCAPTCHA進行驗證

win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) Feb 10, 2024 am 10:30 AM

越來越多的用戶開始升級win11系統,由於每個用戶的使用習慣不同,還是有不少用戶在使用ie11瀏覽器,那麼win11系統用不了ie瀏覽器,該怎麼辦呢? windows11還支援ie11嗎?下面就來看看解決方法。 win11無法使用ie11瀏覽器的解決方法1、先右鍵開始選單,選擇「命令提示字元(管理員)」開啟。 2.開啟之後,直接輸入“Netshwinsockreset”,回車確定。 3.確定之後再輸入「netshadvfirewallreset&rdqu

See all articles