vue 사용자 정의 명령 과 동적 경로 구현 권한 제어

기능 개요:
  • 백 엔 드 에 따라 인 터 페 이 스 를 되 돌려 주 고 경로 의 동적 디 스 플레이
  • 를 실현 합 니 다.
  • 버튼(HTML 요소)단계 권한 제어 실현
  • 관련 지식 포인트:
  • 루트 수위
  • Vuex 사용
  • Vue 사용자 정의 명령
  • 내 비게 이 션 수위
    전단 공 사 는 Github 오픈 소스 프로젝트Vue-element-admin를 템 플 릿 으로 하고 이 프로젝트 의 주 소 는Github | Vue-element-admin입 니 다.
    Vue-element-admin 템 플 릿 프로젝트 의 src/permission.js 파일 에서 경로 가 지 키 고 동적 경 로 를 불 러 오 는 실현 방안 을 제시 하여 서로 다른 캐릭터 를 바탕 으로 동적 경 로 를 불 러 오 는 기능 을 실현 합 니 다.우 리 는 조금 만 바 꾸 면 캐릭터 로드 루트 를 권한 로드 루트 로 바 꿀 수 있다.
    내 비게 이 션 수위:경로 가 바 뀔 때 사용자 의 로그 인 상태 나 권한 을 판단 하 는 데 사용 할 수 있 습 니 다.프로젝트 중 전역 전치 수 비 를 사용 합 니 다.Vue 공식 문서 참조:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
    백 엔 드 리 턴 인터페이스

    권한 시스템 배경 은 역할 기반 권한 제어 방안role-based access control을 사용 합 니 다.위의 그림 과 같 습 니 다.
    이 사용자 정보 인 터 페 이 스 는 사용자 가 가지 고 있 는 모든 역할 을 조회 하고 이 캐릭터 들 의 권한 을 경로-조작 에 따라 통합 하여 되 돌려 줍 니 다.사용자 가 시스템 에 로그 인 한 후에 저 희 는 배경 에서 사용자 정보(개인 정보+권한 정보)를 요청 하여 전체 속성 으로 전단 에 저장 합 니 다.서로 다른 권한 을 가 진 사용자 가 보 는 페이지 가 다 르 고 이러한 속성 에 의존 하 며 경로 가 어떻게 불 러 오 는 지,페이지 가 어떻게 렌 더 링 하 는 지 결정 합 니 다.
    이러한 여러 구성 요 소 는 하나의 속성 에 의존 하 는 장면 으로 Vue 는VueX을 전체 상태 관리 방안 으로 제공 합 니 다.
    VueX 로 권한 정보 저장src/store/moudules디 렉 터 리 에서 정의permission.js1.비동기 방법 을 정의 합 니 다.방법 내부 에 HTTP 요청 이 포함 되 어 있 습 니 다.배경 에서 데 이 터 를 끌 어 올 립 니 다.
    
    import http from '../../axios';
    async function getUserInfo() {
     const res = await http.getUserInfo();
     return res;
    }
    await키 워드 를 사용 하여 실행 순서 가 정확 하도록 합 니 다.다음 처리 에 편리 하도록 인터페이스 에서 되 돌아 오 는 내용 을 확보 하기 위해 서다.
    
    const actions = {
     getPermissions({ commit }) {
     return new Promise(resolve => {
      getUserInfo().then(res => {
      if (res) {
       let permissionList = res.permissionList;
       commit('SET_PERMISSIONS', permissionList);
       //          ,           
       let accessRoutes = filterAsyncRoutesByPermissions(asyncRoutes, permissionList);
       commit('SET_ROUTES', accessRoutes);
       commit('SET_USER_INFO', { name: res.name, accountName: res.accountName })
       resolve(accessRoutes);
      } else {
       resolve([]);
      }
      }).catch(() => resolve([]));
     })
     }
    }
    VueX 에서 action 은 비동기 방법 을 정의 합 니 다.
    2.정적,동적 경로 정의src/router/index.js정적 경로:
    
    export const constantRoutes = [
     {
      path: '/redirect',
      component: Layout,
      hidden: true,
      children: [
       {
        path: '/redirect/:path(.*)',
        component: () => import('@/views/redirect/index'),
       },
      ],
     ,
     ...
     {
      path: '/404',
      component: () => import('@/views/error-page/404'),
      hidden: true,
     }
    ];
    동적 경로:
    
    export const asyncRoutes = [
     {
      path: '/system',
      component: Layout,
      name: '    ',
      meta: { title: '    ', icon: 'el-icon-user', affix: true },
      children: [
       {
        path: '/system',
        component: () => import('@/views/management/system/Index'),
        meta: { title: '    ', icon: 'el-icon-setting', affix: true },
       },
      ],
     }
    ...
    ]
    정적 루트 에서 모든 사용자 가 접근 할 수 있 는 루트 를 정 의 했 고 동적 루트 에서 동적 로드 루트 를 정의 했다.
    3.권한 에 따라 경로 필터 및 정렬
    
    export function filterAsyncRoutesByPermissions(routes, menus) {
     const res = []
     routes.forEach(route => {
     const tmp = { ...route }
     let index = menus.map(menu => menu.url).indexOf(tmp.path);
     if (index != -1) {
      //                   
      tmp.name = menus[index].name;
      // debugger;
      tmp.meta.title = menus[index].name;
      tmp.children.forEach(child => {
      if (child.path == tmp.path) {
       child.meta.title = tmp.meta.title;
      }
      })
      res.push(tmp)
     }
     });
     //         ,      
     /**
     * TODO      
     */
     res.sort((routeA, routeB) => menus.map(menu => menu.url).indexOf(routeA.path) - menus.map(menu => menu.url).indexOf(routeB.path))
     return res
    }
    url 에 따라 url 에 일치 하 는 경로 에 따라 배열 을 추가 합 니 다.최종 사용자 가 접근 할 수 있 는 경로=접근 할 수 있 는 동적 경로+권한 이 필요 없 는 정적 경로.
    4.src/permission.js 의 처리 논리
    
    //   store
    import store from './store';
    const whiteList = ['/login', '/auth-redirect']; // no redirect whitelist
    
    //     
    router.beforeEach(async (to, from, next) => {
     //start progress bar
     NProgress.start()
     if (hasToken) {
      if (to.path === '/login') {
       // ...       
       NProgress.done();
      } else { 
       //             
       const hasRoutes = store.getters.permission_routes && store.getters.permission_routes.length > 0;
       if (hasRoutes) {
        next();
       } else {
        try {
         const accessRoutes = await store.dispatch('permission/getPermissions');
         router.addRoutes(accessRoutes);
         const toRoute = accessRoutes.filter((route) => route.path == to.path);
         next({ path: toRoute.length > 0 ? toRoute[0].path : accessRoutes[0].path, replace: true });
        } catch (error) {
         next(`/login?redirect=${to.path}`);
         NProgress.done();
        }
       }
      }
     } else {
      if (whiteList.indexOf(to.path) !== -1) {
       // in the free login whitelist, go directly
       next();
      } else {
       next(`/login?redirect=${to.path}`);
       NProgress.done();
      }
     }
    });
    
    router.afterEach(() => {
     // finish progress bar
     NProgress.done();
    });
    이상 은 동적 경로 실현 방안 입 니 다.
    Vue 는 사용자 정의 명령 을 지원 합 니 다.사용 방법 은 Vue 원생 명령v-model,v-on등 과 유사 합 니 다.인터넷 에서 찾 아 볼 수 있 는 대부분의 세분 화 권한 제어 방안 은 이런 방법 을 사용 합 니 다.다음은 나의 실현 을 보 여 줄 것 이다.
    사용자 정의 명령
    사용자 정의 명령v-permission:src/directive/permission/index.js
    
    import store from '@/store'
     export default {
     inserted(el, binding, vnode) {
     const { value } = binding
     const permissions = store.getters && store.getters.permissions;
     if (value) {
      //         vue        url
      let url = vnode.context.$route.path;
      let permissionActions = permissions[url];
      // console.log(permissionActions)
      const hasPermission = permissionActions.some(action => {
      if (value.constructor === Array) {
       //    :      1,      
       return value.includes(action);
      } else {
       return action === value;
      }
      })
      if (!hasPermission) {
      el.parentNode && el.parentNode.removeChild(el)
      }
     } else {
      throw new Error(`need further permissions!`)
     }
     }
    }
    백 엔 드 에서 제공 하 는 권한 데 이 터 는 경로(url)와 작업 에 대응 하 는 Map 입 니 다.url 은 마 운 트 할 vnode 속성 을 통 해 얻 을 수 있 습 니 다.이 방법 은 AOP 와 유사 합 니 다.가상 요 소 를 마 운 트 한 후에 판단 하고 권한 이 없 으 면 부모 요소 에서 제거 합 니 다.
    사용 방법:
  • 예 를 들 어 하나의 버튼(작은 따옴표 의 쓰기 에 주의 하 세 요)
    
     <el-button @click.native.prevent="editUser(scope.row)" type="text" size="small" v-permission="'op_edit'">
              
     </el-button>
  • 예 를 들 어 2:또는 판단(배열 로 전송)은 배열 의 한 권한 만 있 으 면 요 소 를 보류 하고 모든 권한 이 없 으 면 제거 합 니 다.
  • 이전 블 로그https://www.jb51.net/article/194361.htm
    드 롭 다운 메뉴 에 제어 추가:


    해당 데이터 정의 에 action 속성 이 증가 합 니 다.
    이 방법 은 모든 장면 을 덮어 쓸 수 없 기 때문에 해당 도구 류 를 제공 합 니 다.
    
    /**
     * 
     * @param {*      } url 
     * @param {*  code e.g op_add } value 
     * @return true/false        
     */
    function checkPermission(url, value) {
    
     const permissions = store.getters && store.getters.permissions;
     let permissionActions = permissions[url];
    
     if (!permissionActions) {
      return false;
     }
    
     let hasPermission = permissionActions.some(action => {
      if (value.constructor === Array) {
       //    :      1,      
       return value.includes(action);
      } else {
       return action === value;
      }
     });
     return hasPermission;
    
    }
    이상 완료 단추 입도 권한 제어.
    이상 은 vue 사용자 정의 명령 과 동적 경로 가 권한 통 제 를 실현 하 는 상세 한 내용 입 니 다.vue 사용자 정의 명령 과 동적 경로 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기