国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue.js - Vue 簡單實現前端權限控制的示例

Vue 簡單實現前端權限控制的示例

2021-12-20 16:15前端小璐 vue.js

這篇文章主要介紹了Vue 簡單實現前端權限控制的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡要說明

最近寫了一下vue控制權限(菜單、路由)的項目,用了vuex、addRoutes動態添加路由方法等,總共100多行代碼,跟大家分享一下~

邏輯梳理

  • 除登錄接口、退出接口外,其余接口增加token驗證。
  • 打開頁面時請求獲取菜單接口,請求不成功說明未登錄,給route默認添加login頁面以及 * 重定向。
  • 登錄成功后獲取到token,把token存入session以及請求頭。
  • 登錄成功后獲取菜單接口,請求回來的路由和vuex里面全部的路由進行匹配,獲取component。
  • 把獲取完component的路由格式化,找自己的parentId,如果找到的話插入到該元素的child里面。

思路大致就是這樣,有聽得模糊的也不要緊,跟隨我的步伐看看代碼是怎樣寫的你就明白了~

實現

1.初始化

route.js

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Vue from 'vue'
import Router from 'vue-router'
import store from '@/store'
 
Vue.use(Router)
const router = new Router()
// 全局前置守衛
router.beforeEach( async (to, from, next) => {
 let userRoutes = store.state.global.userRoutes //userRoutes 當前用戶擁有的權限
 if (userRoutes.length && !userRoutes.filter(item => item.path == to.path).length) {
  next(from.path)
  return
 }
 next()
})
export default router

大家可以看到route.js里沒有路由,因為路由都是動態添加進去的,只有一個全局守衛,作用是當登陸成功后,用戶地址欄手動輸入地址,判斷路由是否正確,如果正確就讓他跳轉。

vuex

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//state.js
export default {
 // 全部路由
 allRoutes: [
  //登錄頁面
  {
   path: '/demo',
   name: 'demo',
   component: () => import('@/views/demo')
  },
  {
   path: '*',
   redirect: '/demo'
  },
  //主頁面
  {
   path: '/',
   component: () => import('@/views'),
  },
  {
   path: '/home',
   name: 'home',
   component: () => import('@/views/home')
  }
 ],
 // 用戶匹配的路由,要用addRoutes添加到route
 userRoutes: [],
 // 渲染用戶菜單
 userMenus: []
}

state中需要定義全部的路由,這個用來跟后臺請求到的權限進行匹配,并且獲取component組件。

actions.js里面是主要的邏輯,其中getMenu方法是本文的核心

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
數據返回時格式
menu = [
 {id: 1, name: '首頁', path: '/home', parentId: 0},
 {id: 2, name: '系統設置', path: '', parentId: 0},
 {id: 3, name: '角色配置', path: '/roles', parentId: 2},
 {id: 4, name: '用戶配置', path: '/users', parentId: 2}
]
需要處理成
menu = [
 {id: 1, name: '首頁', path: '/home', parentId: 0},
 {id: 2, name: '系統設置', path: '', parentId: 0,
   child: [
     {id: 3, name: '角色配置', path: '/roles', parentId: 2},
     {id: 4, name: '用戶配置', path: '/users', parentId: 2}
    ]
  },
]

所以在下方需要用到遞歸來處理↓

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//actions.js
 
// 獲取當前用戶權限
 getMenu: async ({ state, commit, dispatch }) => {
  //請求當前用戶所擁有的權限
  let result = await axios('/api/menu/find')
  if (result.data.code > 0) {
   let userRoutes = result.data.result
   userRoutes.forEach(item => {
    item.child = []
    state.allRoutes.forEach(res => {
     if (item.path == res.path) {
      item.component = res.component
     }
    })
   })
   let oneArr = [], anotherArr = []  //oneArr 一級路由 anotherArr 其他級別路由
   oneArr = userRoutes.filter(item => !item.parentId)
   anotherArr = userRoutes.filter(item => item.parentId)
   anotherArr.forEach(item => {
    oneArr.forEach(obj => {
     if (item.parentId == obj.id) { //如果匹配 說明找到父級,直接push到父級的child里面
      if (!obj.child.filter(k => k.id == item.id).length) {
       obj.child.push(item)
      }
     } else //如果沒有,說明本級路由沒有找到,去下一級別路由找父級 路由級別:1級路由,2級路由,3級路由......
      dispatch('recurrArr', {arr: oneArr, items: item})
     }
    })
   })
   commit('setState', {state: 'userRoutes', value: userRoutes})
   commit('setState', {state: 'userMenus', value: oneArr})
   return {code: 1, data: userRoutes}  //處理完成后返回 oneArr是遞歸處理后嵌套的,userRoutes是獲取到component來渲染route的
  } else {
   return {code: 0}
  }
 },
 // 遞歸找自己的parentId
 recurrArr: ({dispatch}, {arr, items}) => {
  if (!arr) {
   return
  }
  for(let i = 0; i < arr.length; i ++ ){
   let item = arr[i]
   if (item.id == items.parentId) {
    if (!item.child.filter(k => items.id == k.id).length) {
     item.child.push(items)
    }
    break;
   } else {
    dispatch('recurrArr', {arr: item.child, items: items})
   }
  }
 }

到現在為止,路由以及菜單的數據,就已經處理完了,剩下的就是addRoutes添加到route路由里面,這樣頁面就可以跳轉了~

我們接著來看登錄:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 登錄
 login: async ({ commit, dispatch}, params) => {
  let result = await axios('/api/login', {params})
  if(result.data.code > 0) {
   // 登錄成功以后 獲取當前用戶權限路由
   let userRoutes = await dispatch('getMenu')
   if (userRoutes.code > 0) {
    // 把請求回來的路由動態添加到 route 里
    router.addRoutes(userRoutes.data)
    // 添加完成后,現在可以跳轉到首頁了~
    router.push('/home')
   }
   return {code: 1, data: result.data}
  } else {
   console.log(result.data.msg)
   return {code: 0}
  }
 },

現在就已經大功告成了,你的項目可以進行正常的登錄、跳轉、動態更新路由等操作了~

但是

現在還差最后一步,退出登錄

因為在axios攔截里面,token失效后會調用退出接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
axios.interceptors.response.use(
 response => {
  if (response.status === 200) {
   // 身份驗證失敗
   if(response.data.code === -1) {
    // 執行退出登錄
    store.dispatch('global/loginOut')
   } else {
    // 如果請求頭里有token
    let token = response.headers.token
    if(token) {
     localStorage.setItem('token', token)
     axios.defaults.headers.token = token
    }
   }
   return Promise.resolve(response)
  } else {
   return Promise.reject(response)
  }
 }
)

所以才會提到開頭說:剛打開頁面的時候,不管有沒有登錄,都去請求菜單接口。

如果沒有登錄,則會調用退出登錄接口,給路由設置默認路由。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 退出登錄
loginOut: async ({ state }) => {
 // 退出登錄清空 token 和 headers 里面的 token
 localStorage.removeItem('token')
 delete axios.defaults.headers.token
 // 退出登錄要動態添加 登錄頁面 和 * 重定向頁面
 let errRoutes = state.allRoutes.filter(item => item.path == '*')
 errRoutes.push(state.allRoutes.filter(res => errRoutes[0].redirect == res.path)[0])
 router.addRoutes(errRoutes);
 router.currentRoute.path !== '/demo' ? router.push("/demo") : null
 
 let result = await axios('/api/loginOut', {params: {userId: state.userId}})
 if(result.data.code !== 1) {
  console.log('退出登錄接口異常')
 }
},

到現在為止,有項目就算大功告成了~

到此這篇關于Vue 簡單實現前端權限控制的示例的文章就介紹到這了,更多相關Vue 前端權限控制內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6909739109359550471

延伸 · 閱讀

精彩推薦
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
  • vue.jsVue項目中實現帶參跳轉功能

    Vue項目中實現帶參跳轉功能

    最近做了一個手機端系統,其中遇到了父頁面需要攜帶參數跳轉至子頁面的問題,現已解決,下面分享一下實現過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.jsVue2.x 項目性能優化之代碼優化的實現

    Vue2.x 項目性能優化之代碼優化的實現

    這篇文章主要介紹了Vue2.x 項目性能優化之代碼優化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優小U9632022-02-21
  • vue.jsVue2.x-使用防抖以及節流的示例

    Vue2.x-使用防抖以及節流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.js用vite搭建vue3應用的實現方法

    用vite搭建vue3應用的實現方法

    這篇文章主要介紹了用vite搭建vue3應用的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術團隊7992021-12-22
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲精品一二三区 | 成人tv| 久久成人国产精品 | 在线视频三级 | 91精品一区二区三区久久久久久 | 色婷婷网 | 国产精品久久久久久99999 | 亚洲一区在线日韩在线深爱 | 国产精品一区一区三区 | 欧美成人精品一区二区男人看 | 久久亚洲一区 | 综合导航 | 超碰中文字幕 | 在线小视频国产 | 91久久精品国产亚洲a∨麻豆 | 91精品国产日韩91久久久久久 | 成人a视频 | 免费在线一区二区 | 午夜影视| 九月激情网 | 久久久夜色精品亚洲 | 国产欧美一区二区三区在线看 | h在线免费| 久久最新 | 亚洲aⅴ天堂av在线电影软件 | 色视频网站在线观看 | 一级黄色大片 | 一区二区三区视频 | 最近的中文字幕在线看视频 | 欧美福利 | 久久国际影院 | 亚洲电影第三页 | 欧美一区二区三区在线 | 精品久久久久久久久久久久 | 欧美视频精品 | 国产美女自拍视频 | 久色| 羞涩网站| 中文字幕亚洲欧美日韩在线不卡 | 久久久久久99 | 久久一级 |