最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解vue各種權(quán)限控制與管理實現(xiàn)思路

 更新時間:2023年03月28日 14:11:54   作者:Le的寶葫蘆  
這篇文章主要為大家介紹了vue各種權(quán)限控制與管理的實現(xiàn)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、 菜單權(quán)限

  • 菜單權(quán)限:控制用戶在系統(tǒng)中能夠看到哪些菜單項
  • 菜單權(quán)限指的就是后臺系統(tǒng)中的左側(cè)的菜單欄,前端可以根據(jù)后端接口返回的權(quán)限數(shù)據(jù)結(jié)合element-ui菜單組件循環(huán)拼接而成即可,有什么權(quán)限就展示什么菜單
  • 通過vuex+持久化插件(本地存儲)解決刷新頁面菜單欄不顯示問題
  • 實現(xiàn)退出登錄功能時,通過clear()方法清除本地數(shù)據(jù),跳轉(zhuǎn)后通過window.location.reload()刷新當前頁面,可實現(xiàn)清除vuex數(shù)據(jù)的操作

二、 路由權(quán)限

  • 路由權(quán)限為了防止用戶惡意通過在地址欄輸入地址發(fā)生強行跳轉(zhuǎn),可以通過動態(tài)路由對用戶權(quán)限做出相關(guān)限制,有權(quán)限則跳轉(zhuǎn),無權(quán)限則跳轉(zhuǎn)404頁面
  • 路由權(quán)限的方法需要在兩個時機調(diào)用initDynamicRoutes,分別是登錄成功時和頁面創(chuàng)建時,否則動態(tài)路由為默認值,刷新無法訪問
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/layout'
import store from '@/store'
Vue.use(VueRouter)
// 動態(tài)路由規(guī)則
const tableRule = {
  path: '/table',
  name: 'table',
  component: () => import('@/views/table/index.vue')
}
const imageRule = {
  path: '/image',
  name: 'image',
  component: () => import('@/views/image')
}
const userRule = {
  path: '/users',
  name: 'users',
  component: () => import('@/views/users')
}
// 路由規(guī)則和字符串的映射關(guān)系
const ruleMapping = {
  table: tableRule,
  users: userRule,
  image: imageRule
}
//靜態(tài)路由
const routes = [
  {
    path: '/login',
    // name: 'login', // 這里如果有name 控制臺會提示
    component: () => import('@/views/login')
  },
  {
    path: '/',
    component: Layout,
    children: [
      {
        path: '',
        // name: 'home',
        component: () => import('@/views/home')
      },
      {
        path: '/chart',
        component: () => import('@/views/chart')
      }
    ]
  }
]
const router = new VueRouter({
  routes
})
//路由權(quán)限:用戶登錄后接口返回,存儲到本地緩存
const rightList = [
  {
    id: 1,
    authName: "基本頁面",
    icon: "el-icon-connection",
    children: [
      {
        id: 11,
        authName: "表格頁面",
        icon: "el-icon-s-grid",
        path: "table",
        rights: ["view", "edit", "add", "delete"]
      },
      {
        id: 12,
        authName: "素材頁面",
        icon: "el-icon-s-marketing",
        path: "image",
        rights: ["view", "edit", "add", "delete"]
      }
    ]
  },
  {
    id: 2,
    authName: "用戶權(quán)限",
    icon: "el-icon-set-up",
    children: [
      {
        id: 21,
        authName: "權(quán)限頁面",
        icon: "el-icon-s-custom",
        path: "users",
        rights: ["view", "edit", "add", "delete"]
      }
    ]
  }
];
//在登錄(login.vue)、頁面刷新(App.vue)的時候,調(diào)用initDynamicRoutes
export function initDynamicRoutes () {
  // 根據(jù)二級權(quán)限 對路由規(guī)則進行動態(tài)的添加
  const currentRoutes = router.options.routes
  rightList.forEach(item => { // 如果是沒有子路由的話 就直接添加進去 如果有子路由的話就進入二級權(quán)限遍歷
    if (item.path) {
      const temp = ruleMapping[item.path]
      // 路由規(guī)則中添加元數(shù)據(jù)meta
      temp.meta = item.rights
      currentRoutes[1].children.push(temp)
    }
    item.children.forEach(item => {
      // item 二級權(quán)限
      const temp = ruleMapping[item.path]
      // 路由規(guī)則中添加元數(shù)據(jù)meta,用于按鈕權(quán)限控制
      temp.meta = item.rights
      currentRoutes[1].children.push(temp)
    })
  })
  // 添加路由規(guī)則
  router.addRoutes(currentRoutes)
}
export default router

三、 按鈕權(quán)限

所謂的按鈕權(quán)限是指在某個菜單的界面中,我們需要根據(jù)后端返回的該角色當前操作模塊中對應(yīng)的按鈕權(quán)限數(shù)據(jù),展示出可進行操作的按鈕,比如刪除,修改,增加等按鈕.

如果要實現(xiàn)按鈕的權(quán)限控制,我們需要使用vue的自定義指令去實現(xiàn): 首先需要創(chuàng)建一個按鈕權(quán)限控制的指令,我們定義這個指令的名稱為: v-permission

在這個指令的內(nèi)部獲取到當前用戶的按鈕權(quán)限(vuex|本地緩存中)數(shù)據(jù)

在通過binding.value獲取到自定義制定屬性值的數(shù)據(jù)

判斷從vuex|本地緩存中獲取到的按鈕權(quán)限數(shù)據(jù)是否包含了自定義指令包含的權(quán)限

如果不包含,我們在設(shè)置el.style.display = “none”,或者使用el.parentNode.removeChild(el)刪除當前 按鈕元素

<el-button v-permission="[$route.path, 'add']">添加</el-button>
directives: {
        // 檢測全選的指令
        permission: {
            // 綁定此指令的標簽插入到dom節(jié)點觸發(fā)
            inserted(el, bind) {
                // el:綁定該指令標簽
                // bind:對象格式 當前綁定指令標簽上的數(shù)據(jù)情況
                // 獲取按鈕上的value值,就是用戶當前要使用的權(quán)限和請求的路由地址
                let value = bind.value//['/user','add']
                //模擬后端返回的當前角色對應(yīng)的權(quán)限
                let rules = {
                    '/menu': ['add', 'edit'],
                    "/user": [ 'edit', 'remove'],
                    "/goods": ['add']
                }
                // 根據(jù)訪問的路由地址獲取該模塊的操作權(quán)限
                let allow = rules[value[0]]
                // 檢測當前操作是否合法
                if (!allow.includes(value[1])) {
                    // 不合法隱藏操作按鈕
                    el.style = "display:none"
                }
            }
        }
 }

四 、數(shù)據(jù)權(quán)限

  • 數(shù)據(jù)權(quán)限就是不同的角色用戶看到的表格數(shù)據(jù)是不一樣的
  • 比如張三是項目經(jīng)理就可以看到某一個業(yè)務(wù)表格中的所有數(shù)據(jù)和字段信息
  • 李四是普通員工只能看到表格中自己的數(shù)據(jù)
  • 代碼實現(xiàn): 前端在請求頭統(tǒng)一封裝,攜帶用戶信息,最后由后端檢測該用戶權(quán)限解析返回對應(yīng)的數(shù)據(jù)即可;
import axios from 'axios'
import router from '@/router'
const request = axios.create()
// 映射
const actionMapping = {
  get: 'view',
  post: 'add',
  put: 'edit',
  delete: 'delete'
}
// request.defaults.baseURL = 'http://127.0.0.1:7001' // 注釋掉之后調(diào)的接口將是Mock數(shù)據(jù)
// 請求攔截器
request.interceptors.request.use(req => {
  // console.log(req.url)
  // console.log(req.method)
  if (req.url !== '/login' && req.url !== '/roles') {
    // 不是登錄的請求 也不是獲取權(quán)限的請求 則在請求頭中加入token  不知道如何使用Mock來驗證請求頭中的token 故此處注釋
    // req.headers.Authorization = sessionStorage.getItem('token')
    const action = actionMapping[req.method]
    // 判斷非權(quán)限范圍內(nèi)的請求
    // console.log(router)
    const currentRight = router.currentRoute.meta
    // console.log(currentRight)
    if (currentRight && currentRight.indexOf(action) === -1) {
      // 沒有權(quán)限
      alert('沒有權(quán)限')
      return Promise.reject(new Error('沒有權(quán)限'))
    }
  }
  return req
})
export default request

以上就是一文詳解vue各種權(quán)限控制與管理實現(xiàn)思路的詳細內(nèi)容,更多關(guān)于vue權(quán)限控制管理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中插值表達式使用的示例詳解

    vue中插值表達式使用的示例詳解

    Vue的插值表達式是一種特殊的語法,用于在模板中動態(tài)地將數(shù)據(jù)綁定到視圖中,一般使用雙大括號 ("{{ }}")將表達式包裹起來,下面我們就來根據(jù)三個案例來深入了解下插值表達式的使用吧
    2023-11-11
  • JavaScript的Vue.js庫入門學習教程

    JavaScript的Vue.js庫入門學習教程

    Vue的很多思想借鑒于Angular,但卻比較輕量和自由,這里我們整理了JavaScript的Vue.js庫入門學習教程,包括其架構(gòu)思想與核心的數(shù)據(jù)綁定方式等,需要的朋友可以參考下
    2016-05-05
  • antd vue 刷新保留當前頁面路由,保留選中菜單,保留menu選中操作

    antd vue 刷新保留當前頁面路由,保留選中菜單,保留menu選中操作

    這篇文章主要介紹了antd vue 刷新保留當前頁面路由,保留選中菜單,保留menu選中操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue項目刷新后h5樣式失效的原因及解決方案

    Vue項目刷新后h5樣式失效的原因及解決方案

    今天遇到一個bug,有一個Element的message組件,用它做的一個進度條,它是寫在一個頁面上,并且是用js控制dom元素的,web端一切正常,但是,H5頁面刷新的時候它樣式加載不出來了,所以本文主要介紹了Vue項目刷新后h5樣式失效的原因及解決方案,需要的朋友可以參考下
    2024-10-10
  • vue快捷鍵與基礎(chǔ)指令詳解

    vue快捷鍵與基礎(chǔ)指令詳解

    這篇文章主要介紹了vue快捷鍵與基礎(chǔ)指令詳解,需要的朋友可以參考下
    2017-06-06
  • vue實現(xiàn)圖片拖拽及鼠標滾輪放大縮小的示例代碼

    vue實現(xiàn)圖片拖拽及鼠標滾輪放大縮小的示例代碼

    本文主要給大家介紹如何vue實現(xiàn)圖片拖拽及鼠標滾輪放大縮小,文中有詳細的代碼供大家參考,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • Element Timeline時間線的實現(xiàn)

    Element Timeline時間線的實現(xiàn)

    本文主要介紹了Element Timeline時間線的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 關(guān)于vue 項目中瀏覽器跨域的配置問題

    關(guān)于vue 項目中瀏覽器跨域的配置問題

    這篇文章主要介紹了vue 項目中瀏覽器跨域的配置問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Vue3和Vue2的響應(yīng)式原理

    Vue3和Vue2的響應(yīng)式原理

    這篇文章我們將探討Vue3框架的優(yōu)秀特性、使用原理、周邊生態(tài)和實戰(zhàn)應(yīng)用,系統(tǒng)的學習Vue生態(tài)體系,希望和大家共同成長,我們一起探討下Vue3和Vue2的響應(yīng)式原理,那究竟什么是“響應(yīng)式”,接下來跟著小編一起來學習吧
    2023-05-05
  • 詳解vue填坑之解決部分瀏覽器不支持pushState方法

    詳解vue填坑之解決部分瀏覽器不支持pushState方法

    這篇文章主要介紹了詳解vue填坑之解決部分瀏覽器不支持pushState方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07

最新評論

开江县| 隆德县| 宝应县| 正宁县| 界首市| 汤原县| 天门市| 精河县| 高清| 承德市| 高平市| 潜山县| 佳木斯市| 合肥市| 教育| 安福县| 高淳县| 兰溪市| 深泽县| 凤冈县| 天台县| 千阳县| 项城市| 新邵县| 齐齐哈尔市| 福鼎市| 云林县| 沙湾县| 巴中市| 长汀县| 阿合奇县| 朝阳市| 云安县| 仁化县| 财经| 平凉市| 连云港市| 兴义市| 承德市| 枝江市| 洪洞县|