Контроль разрешений фоновой системы на основе Vue2.0

внешний интерфейс Vue.js Vuex vue-router

Контроль разрешений фоновой системы на основе серии Vue.js 2.x + Element UI

Предисловие: Эти вещи о маршрутизации разрешений vue...

Предыстория проекта: существует система управления фоном и два типа персонала.

①Супер администратор (называемый администратором), ②Обычный пользователь (называемый редактором)

Каждый тип людей видит разные панели операций и может выполнять разные операции, поэтому программа должна решать каждую проблему с разрешениями.

Процесс трудно сказать, нелегко сказать

vue权限

【Запутанная ранняя стадия】

Я зашел в Baidu и Google и много искал о разрешениях.Может быть, доброжелательный видит доброжелательного, а мудрый видит мудрость.Различные введения еще больше меня запутывают, и я действительно не знаю, с чего начать:

1) Пусть бэкенд возвращает json данные о разрешениях, но как быть с такими данными я не знаю;

2) Он обрабатывается во внешнем роутинге, но я не знаю, как использовать какие атрибуты для достижения этой функции;

【наконец】

Последний просмотр статьиРука об руку, вы попадете на задний план с vue series 2 (разрешение на вход), но обнаружил, что в коде много функций разрешений, которые интегрированы во фреймворк.Печально, я просто хочу реализовать небольшую функцию разрешений, но мне нужно внимательно изучить код автора.

Конкретные идеи реализации

1 При создании экземпляра vue монтируйте vue-router, но в это время vue-router монтирует некоторые страницы входа или общедоступные страницы без разрешения.

2 Когда пользователь входит в систему, получите роль, сравните роль и требуемые разрешения для каждой страницы таблицы маршрутизации и создайте таблицу маршрутизации, доступную для конечного пользователя.

3. Вызовите router.addRoutes(store.getters.addRouters), чтобы добавить маршруты, доступные пользователю.

4 Используйте vuex для управления таблицей маршрутизации и визуализации компонентов боковой панели в соответствии с маршрутами, доступными в vuex.

Не беда, если я немного запутался, постараюсь объяснить каждый шаг простыми словами

1 В маршрутизации router.js объявите маршрут с разрешения администратора (asyncRouterMap для асинхронно смонтированного маршрута)

// router.js
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export const constantRouterMap = [
  {
    path: '/',
    redirect: '/login',
    hidden: true
  },
  {
    path: '/login',
    name: '登录页面',
    hidden: true,
    component: resolve => require(['../views/login/Login.vue'], resolve)
  },
  {
    path: '/Readme',
    // name: 'Readmehome',
    index: 'Readme',
    meta: {
      title: 'Readme',
      icon: 'el-icon-menu'
    },
    component: resolve => require(['../components/common/Home.vue'], resolve),
    children: [
      {
        name: 'Readme',
        path: '/',
        meta: { title: 'Readme', icon: 'el-icon-menu' },
        component: resolve => require(['../components/page/Readme.vue'], resolve)
      }
    ]
  }
]

export default new Router({
  routes: constantRouterMap
})
// 异步挂载的路由
// 动态需要根据权限加载的路由表
export const asyncRouterMap = [
  {
    path: '/permission',
    // name: 'permissionhome',
    meta: {
      title: 'permission',
      icon: 'el-icon-setting',
      roles: ['admin']
    },
    component: resolve => require(['../components/common/Home.vue'], resolve),
    children: [
      {
        name: 'permission',
        path: '/permission',
        meta: {
          title: 'permission', icon: 'el-icon-menu', roles: ['admin']
        },
        component: resolve => require(['../components/page/permission.vue'], resolve)
      }
    ]
  },
  { path: '*', redirect: '/404', hidden: true }
]

Здесь мы базируемсяофициальная рекомендация vue-routerМетод использует метатег, чтобы указать, к каким разрешениям может получить доступ страница. Например, meta: { role: ['admin','super_editor'] } означает, что на страницу могут заходить только администратор и суперредактор.

Примечание: здесь необходимо обратить внимание на то, что страница 404 должна загружаться последней.addRoutes when you've got a wildcard route for 404s does not work

2 Когда пользователь входит в систему, получите роль, сравните роль и необходимые разрешения для каждой страницы таблицы маршрутизации, вызовите router.addRoutes (store.getters.addRouters), чтобы добавить доступные пользователю маршруты, и сгенерируйте поверхность доступных маршрутов. Таблица маршрутизации существует в vuex

permission.js

// permission.js
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import { getToken } from '@/utils/auth' // 验权

const whiteList = ['/login', '/authredirect'] // 不重定向白名单

router.beforeEach((to, from, next) => {
  if (getToken()) { // 判断是否有token
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      if (store.getters.roles.length === 0) {
        console.log('roles====0')
        store.dispatch('GetInfo').then(res => { // 拉取用户信息
          const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop']
          console.log('roles?', roles)
          store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
            console.log('addrouters', store.getters.addRouters)
            router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
          })
        }).catch(() => {
          store.dispatch('FedLogOut').then(() => {
            Message.error('验证失败,请重新登录')
            next({ path: '/login' })
          })
        })
      } else {
        console.log('====1')
        next() // 当有用户权限的时候,说明所有可访问路由已生成 如访问没权限的全面会自动进入404页面
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})


3 Используйте vuex для управления таблицей маршрутизации и рендеринга компонента боковой панели (меню) в соответствии с маршрутами, доступными в vuex.

sidebar

Окончательная ссылка для предварительного просмотра

Система разрешений, реализованная vue

Начальная обучающая группа 493671066, там много красивых женщин. Садись в машину, уже поздно объяснять.

Загрузка исходного кода

Vue реализует загрузку исходного кода управления разрешениями

Спасибо искренне

打赏

Наконец, если что-то не так, пожалуйста, поправьте меня.