fe-drone-ci/src/store/modules/permission.js

133 lines
3.4 KiB
JavaScript

import { asyncRouterMap, constantRouterMap, routerMode } from '@/router'
import { validatenull } from '@/utils/validate'
// for get menus from server
import { getMenuByRole } from '@/api/menu'
import Layout from '@/views/layout/Layout'
/**
* 通过meta.role判断是否与当前用户权限匹配
* @param roles
* @param route
*/
function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
}
/**
* 递归过滤异步路由表,返回符合用户角色权限的路由表
* @param routes asyncRouterMap
* @param roles
*/
function filterAsyncRouter(routes, roles) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (hasPermission(roles, tmp)) {
if (tmp.children) {
tmp.children = filterAsyncRouter(tmp.children, roles)
}
res.push(tmp)
}
})
return res
}
const permission = {
state: {
routers: [],
addRouters: []
},
mutations: {
SET_ROUTERS: (state, routers) => {
state.addRouters = routers
state.routers = constantRouterMap.concat(routers)
}
},
actions: {
GenerateRoutes({ commit }, data) {
// default routerMode is local
if (routerMode === 'local') {
return new Promise(resolve => {
const { roles } = data
let accessedRouters
if (roles.includes('admin')) {
accessedRouters = asyncRouterMap
} else {
accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
}
commit('SET_ROUTERS', accessedRouters)
// return for add to router
resolve(accessedRouters)
})
} else {
const { roles } = data
return new Promise((resolve, reject) => {
getMenuByRole(roles[0]).then(response => {
if (!response.data) {
reject('GenerateRoutesFromServer failed, please try later again.')
}
const menus = response.data
if (menus.length === 0) {
reject('menus data is null')
}
const accessedRouters = buildRouter(menus)
// final add 404
accessedRouters.push({ path: '*', redirect: '/404', hidden: true })
// commit to stores
commit('SET_ROUTERS', accessedRouters)
// return for add to router
resolve(accessedRouters)
})
})
}
}
}
}
/** ************************************
* build Router by menu api
* add 20190213
***************************************/
function buildRouter(aMenu) {
const aRouter = []
aMenu.forEach(item => {
if (!validatenull(item.component)) {
const oRouter = {
meta: { 'title': '', 'icon': '' },
children: []
}
if (item.component === 'Layout') {
oRouter.component = Layout
} else {
oRouter.component = require('@/views/' + item.component + '.vue').default
}
oRouter.path = item.path
oRouter.name = item.name
oRouter.id = item.id || null
oRouter.redirect = item.redirect || null
oRouter.meta.icon = item.icon
oRouter.meta.title = item.title
oRouter.meta.noCache = item.noCache || false
oRouter.meta.breadcrumb = item.breadcrumb || true
oRouter.children = validatenull(item.children) ? [] : buildRouter(item.children)
aRouter.push(oRouter)
}
})
return aRouter
}
export default permission