Vue保持用戶登錄及權限控制

vue-router-power-demo

核心內容有兩點: 一是保持用戶登錄狀態,二是根據登錄用戶的角色動態掛在路由

使用vuex保持用戶登錄

  1. 點擊登錄按鈕,使用vuex的actions分發登錄操作,發送用戶名和密碼到后臺獲取登錄token, 并存入vuex的state和cookie中
  2. 使用導航守衛,每次跳轉頁面的時候檢查是否有token,以此來判斷用戶是否登錄

動態掛在路由

  1. 登錄成功后拉去用戶信息,包括用戶角色,用戶名等
  2. 根據用戶角色循環判斷預設路由表,將符合要求的路由篩選出來,使用addRoutes()動態掛載

src項目結構

src
│  App.vue
│  main.js
│  permission.js   // vue router 守衛導航,對token和role進行判斷
├─api              // 統一管理前端與服務器之間的api接口
├─layout           // 主視圖的結構管理,包括header,side-bar,main-body等
│  │  index.vue
│  └─components
│      ├─header
│      │      index.vue
│      └─sidebar
│              index.vue
│              side-item.vue  // side-bar菜單動態渲染的核心組件
├─mock            // 前端模擬服務器獲取數據,modules下的文件名和api接口一一對應
│  │  index.js
│  └─modules
│          getuserinfo.js
│          login.js
│          logout.js
├─router          // 路由表,本身只需要一個index,為了結構分離了兩個路由表
│      asyncRoutes.js       // 需要動態掛載的路由表
│      constantRoutes.js    // 常規路由表,通常為 login、404等一些不需要權限的路由表
│      index.js
├─store           // 加載 store 模塊和 getters
│  │  getters.js  // 全局getters
│  │  index.js
│  └─modules      // 模塊形式的store
│          permission.js
│          user.js
├─style
│      index.scss
├─utils
│      request.js // 封裝了axios,這里只是簡單封裝,但實際項目中肯定有各種需求
└─views           // 各個頁面內容├─document│      index.vue├─error-page│      404.vue├─login│      index.vue├─page1│      index.vue├─page2│      index.vue└─permissionpage.vuesuper.vueuser.vue

敲黑板,劃重點

permission.js

放置全局導航守衛,和文件名含義一樣,對用戶的跳轉行為進行許可判斷,主要是利用vuex.store中的token和role進行判斷,并完成路由的動態加載行為

store/modules/user.js

用戶的全局狀態,最關鍵的兩個變量,token 和 role 。

token的默認值可以用cookies.get('token')獲取,因為當頁面刷新時,vuex.store中的所有狀態都會重置,本身就需要判斷和從cookie中獲取,這樣寫省了一次判斷,而且更為便捷。

actions的內容分發,主要有三個,login獲取后臺token并保存,getUserInfo獲取用戶信息并保存,logout清除本地的token和role等信息

store/modules/permission.js

用于儲存全局路由表,有兩個作用,一是獲取需要動態掛載的路由表,二是用于側邊欄的導航渲染。

actions的主要內容時用role對asyncRoutes路由表進行篩選

router/constantRoutes.jsrouter/asyncRoutes.js

constantRoutes.js asyncRoutes.js這兩個路由表很簡單,本來就是和index.js一起配置的,但是為了清晰邏輯和結構把這兩個表分離了出來。constantRoutes是默認加載路由,asyncRoutes是需要使用role進行篩選的路由,路由表的結構及配置是需要配合store/modules/permission.js一起使用。

這里使用的篩選邏輯:對每個route判斷是否配置了meta.roles,如果沒有,則表示該route全局可用,如果有,再查找meta.roles中是否有role的值,如果有表示該用戶有使用這個route的權限。

最后很重要的一點,asyncRoutes路由表的最后需要配置{ path: '*', hidden: true, redirect: '/404' },并且只能配置在最后,用來跳轉非合法的url

不在重點中的重點

這個說法有點矛盾,之所以說不在重點中,是因為上面的js中已經完成了用戶的登錄及頁面權限的分配。

但是,我要說但是了,網頁是需要導航頁來引導用戶的,如果將所有連接都放入導航頁,那么沒有權限的用戶點擊會跳轉到404頁,這在用戶體驗上不好,那么就需要在渲染導航頁的時候對role進行判斷。導航頁少的時候還不麻煩,導航頁一多就會顯得十分繁重,而且不易維護。所以使用路由表動態的渲染出導航。

store/modules/permission.js的state中有個routes存儲了該用戶完整的權限路由表,導航菜單就是循環渲染這個路由表,但是該路由表中有許多路由時不需要在導航頁中出現的,比如login,404等。這個時候就需要用到路由表中的hidden設置了,渲染的時候通過hidden來判斷是否將該路由渲染到導航菜單中。

官方的標準路由表中是沒有hidden這個配置的,這個選項其實應該是寫在meta中的,只是可能為了方便寫在了最外層,網上能找到的很多路由權限實列都是這樣寫的。所以如果有多個導航菜單并存的情況下,hidden不妨也可以改寫成showOnTopshowOnSide,渲染的時候使用對應的選項進行判斷即可。

既然導航菜單是用路由表渲染的,那么路由表的結構和順序就顯得十分重要的,這和渲染出來的導航菜單順序及結構是一直的,復雜的導航菜單通常都有二級菜單和三級菜單,這用到了組件的遞歸,因為比較復雜,所以這個demo只做了簡單的一級導航,目的是為了清晰的展示登錄和頁面權限管理

DEMO預覽地址

DEMO預覽地址

DEMO項目地址

在GitHub上配置的靜態文件的問題記錄:在GitHub的靜態頁面上,頁面內部跳轉沒有問題,刷新后就找不到頁面了。
根本原因在于demo展示的實際地址是https://cliff-rhine.github.io/vue-router-power-demo/,而vue的路由配置是在根目錄上的,導致在頁面內容跳轉url之后,瀏覽器的url地址已經變成根目錄依賴,而非/vue-router-power-demo/。所以在刷新頁面時找不到文件。vue-router的url跳轉機制實際上是html5的history.pushStatehistory.replaceState

項目在本地配置沒有問題,可以正常刷新頁面

TODO

  • 頁面按鈕權限管理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281313.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java B2B2C Springcloud多租戶電子商城系統-Spring Cloud Sleuth

在微服務框架中,一個由客戶端發起的請求在后端系統中會經過多個不同的的服務節點調用來協同產生最后的請求結果,每一個前段請求都會形成一條復雜的分布式服務調用鏈路,鏈路中的任何一環出現高延時或錯誤都會引起整個請求最后的失敗。 愿意了解…

C#性能測試BenchmarkDotnet

1.簡介在我們開發高性能代碼時,需要各種針對性能優化進行編碼。那么如何才能知道我們所加的代碼是否有性能方面的正向優化呢?有了BenchmarkDotNet,做性能對比測試就非常容易了,只需要把你的測試方法加上特性[Benchmark], 想做不同…

Requests獲取連接的IP地址

在接口自動化的時候,需要獲取到連接的本地IP地址,方法如下 1 import requests 2 3 rsp requests.get("http://www.baidu.com", streamTrue) 4 print rsp.raw._connection.sock.getpeername()[0] 5 print rsp.raw._connection.sock.getsockna…

阿里云APP(V4.3) SSH遠程登錄功能設置操作指南

阿里云APP V4.3 發布了,這次的升級,不僅在iOS和android平臺上支持SSH遠程登錄ECS功能,也支持密鑰登錄哦~~~ SSH遠程登錄,這是一個連阿里巴巴自己的技術人員都開心不已的功能! 各位攻城獅們,從更新到V4.3的那…

JS專題之節流函數

本文共 2000 字,讀完只需 8 分鐘上一篇文章講了去抖函數,然后這一篇講同樣為了優化性能,降低事件處理頻率的節流函數。 一、什么是節流? 節流函數(throttle)就是讓事件處理函數(handler&#xf…

vue 2.6 插槽v-slot用法記錄

v-slot用法簡記用法示例匿名插槽與具名插槽插槽作用域組件使用插槽動態命名總結用法示例 vue2.6統一了插槽的語法v-slot 匿名插槽與具名插槽 在其他組件中使用child組件 <child><template v-slot:slotName>hello world</template> </child>child組…

Latex排版全解(轉)

Latex排版全解 http://blog.csdn.net/langb2014/article/details/51354238轉載于:https://www.cnblogs.com/yifdu25/p/8338399.html

git-ftp Can't access remote 'ft://...', exiting...問題記錄

環境 服務器&#xff1a;西部數碼虛擬主機 本地系統&#xff1a;windows 10 (LTSC 2019) 軟件&#xff1a; Git Bash&#xff0c;gti-ftp (版本1.6.0) 問題 在使用git ftp init初始化上傳代碼的時候會出現 $ git ftp init fatal: Cant access remote ftp://dmkt:***dmkt.goto…

【Flutter教程】從零構建電商應用(一)

在這個系列中&#xff0c;我們將學習如何使用google的移動開發框架flutter創建一個電商應用。本文是flutter框架系列教程的第一部分&#xff0c;將學習如何安裝Flutter開發環境并創建第一個Flutter應用&#xff0c;并學習Flutter應用開發中的核心概念&#xff0c;例如widget、狀…

為OWA自定義快捷鍵

這篇短文分享一下如何為自己常用的網頁添加自定義功能&#xff0c;例如添加快捷鍵。我這里用一個常用的網站作為范例。它是Outlook Web Access (OWA), 它的地址一般如下。我在寫郵件時希望能用一些快捷鍵來提高工作效率&#xff0c;但系統默認自帶的快捷鍵特別少&#xff0c;而…

數據結構 快速排序

快速排序是對冒泡排序的一種改進&#xff0c;是所有內部排序算法中平均性能最優的排序算法。其基本思想是基于分治法的&#xff1a;在待排序數組L[1...n]中任取一個元素pivot作為基準&#xff0c;從數組的兩端開始掃描。設兩個指示標志&#xff08;low指向起始位置&#xff0c;…

Finally語句塊的運行

一、finally語句塊是否一定運行&#xff1f; Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被運行&#xff1f;非常多人都說不是。當然他們的回答是正確的&#xff0c;經過試驗。至少下面有兩種情況下finally語句是不會被運行的&#xff1a; &#xf…

vue-cli 3.0 跨域請求代理

官方文檔中指明&#xff0c;跨域請求可以通過配置vue.config.js中的devServer.proxy選項來進行配置。 這個選項配置的本質實際上就是http-proxy-middleware中間件的用法&#xff0c;和Webpack-dev-server的proxy一樣。 vue-cli 3.0中介紹了兩種常見的用法&#xff1a; modul…

小米人員架構調整:組建中國區,王川任總裁

12月13日上午&#xff0c;小米內部發布人員調整公開信&#xff0c;信中傳達了兩個重要內容&#xff1a;將銷售與服務部改組為中國區&#xff0c;任命集團高級副總裁王川兼任中國區總裁。 在今年9月份&#xff0c;也就是小米上市前夕&#xff0c;雷軍在一封內部信中宣布對公司組…

在 .NET 7上使用 WASM 和 WASI

WebAssembly&#xff08;WASM&#xff09;和WebAssembly System Interface&#xff08;WASI&#xff09;為開發人員開辟了新的世界。.NET 開發人員在 Blazor WebAssembly 發布時熟悉了 WASM。Blazor WebAssembly 在瀏覽器中基于 WebAssembly 的 .NET 運行時上運行客戶端。WASI通…

Java基礎 五 方法

方法 1.1 方法概述 在我們的日常生活中&#xff0c;方法可以理解為要做某件事情&#xff0c;而采取的解決辦法。 如&#xff1a;小明同學在路邊準備坐車來學校學習。這就面臨著一件事情&#xff08;坐車到學校這件事情&#xff09;需要解決&#xff0c;解決辦法呢&#xf…

django rest framework 過濾 lim分頁

一.過濾 1.首先引用diango 自帶的過濾配置 2.導入模塊 from django_filters.rest_framework import DjangoFilterBackend from django_filters import rest_framework as filters 3.一種簡單的過濾: class BookView(ModelViewSet):queryset Book.objects.all()serializer_clas…

MySQL用戶及權限管理

MySQL用戶及權限管理查看用戶及權限查看用戶及作用域&#xff08;使用范圍&#xff09;查看用戶權限創建用戶及授權字段參數用戶管理使用命令提示符登錄MySQL mysql -h localhost -u root -p查看用戶及權限 mysql中的用戶信息和權限等都存儲在一個名為mysql的數據庫中。其中主…

附近有什么?8款可以查周邊的App

如今科技發達的時代&#xff0c;手機的功能不僅僅只是能通訊聊天&#xff0c;而是逐漸的走進了人們的生活中。因為有了APP&#xff0c;我們的生活才更豐富&#xff0c;并且有很多是我們生活中不可缺少的軟件&#xff0c;而這些軟件便是根據手機中的GPS定位系統而來的。簡單來說…

MyEclipse小問題與漢字處理

今天在使用MyEclipse時&#xff0c;遇到工作目錄報錯(如上圖)&#xff0c;解決方法如下&#xff1a;找到對應工作區(查看工作區的方法為&#xff1a;單擊File → Switch Workspace 即可)依次打開 .metadata文件夾 → .plugins文件夾 → org.eclipse.core.runtime文件夾 → .set…