permission.js 1.93 KB
import { asyncRoutes, constantRoutes, resetRouter } from '@/router'
import asyncRouter from '@/utils/asyncRouter.js'
const state = {
    routes: [],
    addRoutes: false,
}

const mutations = {
    SET_ROUTES: (state, routes) => {
        state.addRoutes = true
        state.routes = routes
    },
    RESET_ROUTE: (state) => {
        state.addRoutes = false
    }
}
const actions = {
    // 添加全部菜单
    generateRoutes ({ commit }, getMenuInfo) {
        return new Promise(resolve => {
            // 将权限菜单数组转成路由树数据结构
            let permission_tree = asyncRouter(getMenuInfo)
            const mergeResult = _.cloneDeep(constantRoutes).concat(permission_tree);
            commit('SET_ROUTES', mergeResult)
            resolve(permission_tree)
        })
    },
    // 重置路由
    resetRoutes ({ commit }) {
        commit('RESET_ROUTE')
    }
}
// 树转数组
function dfs (root, fVisit) {
    let stack = Array.isArray(root) ? [...root] : [root];
    while (stack.length) {
        let node = stack.pop();
        fVisit && fVisit(node);
        let children = node.children;
        if (children && children.length) {
            for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);
        }
    }
}
// 数组转树
//需要插入父节点id,pid为null或'',就是找root节点,然后root节点再去找自己的子节点
function array2Tree (data, pid) {
    let res = [];
    data.forEach(item => {
        if (item.parentId === pid) {
            let itemChildren = array2Tree(data, item.id);
            if (itemChildren.length) item.children = itemChildren;
            res.push(item);
        }
    });
    // 菜单数据反转,保持一致
    res.reverse()
    _.each(res, c => {
        if (c.children && c.children.length > 0) {
            c.children.reverse()
        }
    })
    return res;
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}