/** * 权限管理 */ import { routes } from '@/router' import { getMenus } from '@/api/login' /** * 通过meta.permission判断是否与当前用户权限匹配, 该方法暂时废弃,old * @param roles * @param route */ // function hasPermission(menus, route) { // debugger // if (route.meta && route.meta.permission) { // return menus.some(menu => { // 遍历menus,查找route.meta.permission是否有匹配的menu // route.meta.permission.includes(menu.url) // }) // } else { // return true // } // } /** * 判断路由是否在菜单列表里,在则返回菜单对象,否则返回undefined * @param menus 菜单列表(用户拥有权限的菜单列表) * @param route 路由 * @returns menu_res 匹配成功的菜单对象 */ function getMenu(menus, route) { let menu_res if (route.meta && route.meta.permission) { menu_res = menus.find(menu => { // 遍历menus,查找route.meta.permission是否有匹配的menu return route.meta.permission.includes(menu.url) }) } return menu_res } /** * 递归过滤异步路由表,返回符合用户权限的路由表 * @param routes asyncRouterMap 动态路由表 * @param menus 用户可看到的菜单项 */ function filterAsyncRouter(routes, menus) { const res = [] // 遍历每一个路由,判断是否有权限 routes.forEach(route => { const tmp = { ...route } // if (hasPermission(menus, tmp)) { // 如果有权限,添加该路由,old // if (tmp.children) { // tmp.children = filterAsyncRouter(tmp.children, menus) // } // res.push(tmp) // } const menu = getMenu(menus, tmp) if (menu) { // 如果有权限,添加该路由,并根据url的icon更新图标 tmp.meta.icon = menu.icon // 给route更新icon tmp.meta.title = menu.name // 给route更新名称 if (tmp.children) { tmp.children = filterAsyncRouter(tmp.children, menus) } res.push(tmp) } else { if (!tmp.meta) { res.push(tmp) } } }) return res } const permission = { state: { routers: routes, addRouters: [], menus: [], // 菜单 btns: [] // 按钮 }, mutations: { SET_ROUTERS: (state, routers) => { state.addRouters = routers state.routers = constantRouterMap.concat(routers) }, SET_MENUS: (state, menus) => { state.menus = menus }, SET_BTNS: (state, btns) => { state.btns = btns }, }, actions: { // 获取用户权限 GetMenus({ commit, state }) { console.log('in store.permission.js:GetMenus:') return new Promise((resolve, reject) => { getMenus(state.token).then(response => { // 处理返回值 console.log('get Menus success!') const data = response.data const menus = [] // 仅菜单 const btns = [] // 非菜单 if (data.menus && data.menus.length > 0) { commit('SET_MENUS', data.menus) for (const menu of data.menus) { // 遍历菜单,获取所有的权限项 if (menu.ismenu === '1') { // 将是菜单的放入menus const menu_tmp = {} menu_tmp.url = menu.url menu_tmp.icon = menu.icon menu_tmp.name = menu.name menus.push(menu_tmp) } else { // 将非菜单的放入btns const btn_tmp = {} btn_tmp.url = menu.url btn_tmp.name = menu.name btn_tmp.icon = menu.icon btns.push(btn_tmp) } } } // 过滤路由表 // const accessedRouters = filterAsyncRouter(asyncRouterMap, menus) commit('SET_BTNS', btns) // commit('SET_ROUTERS', accessedRouters) resolve(response) }).catch(error => { reject(error) }) }) } } } export default permission