zoukankan      html  css  js  c++  java
  • 17-----vue前端权限管理

    原理:

    1.后台同学返回一个json格式的路由表,再这个实例中,我们使用的是文件动态路由的形式;
    2.动态路由,每个路由根据自己的权限字段,设定好权限字段。
    3.利用vue-router的beforeEach、addRoutes、localStorage来配合上边两步实现效果;
    4.左侧菜单栏根据拿到转换好的路由列表进行展示;
    大体步骤:拦截路由->后台取到路由->保存路由到localStorage(用户登录进来只会从后台取一次,其余都从本地取,所以用户,只有退出在登录路由才会更新)
    1、首先定义我们的路由文件:
    import Login from './views/Login.vue'
    import NotFound from './views/404.vue'
    import Home from './views/Home.vue'
    import Main from './views/Main.vue'
    import Table from './views/nav1/Table.vue'
    import Form from './views/nav1/Form.vue'
    import user from './views/nav1/user.vue'
    import Page4 from './views/nav2/Page4.vue'
    import Page5 from './views/nav2/Page5.vue'
    import Page6 from './views/nav3/Page6.vue'
    import echarts from './views/charts/echarts.vue'
    import UserManager from './views/users/UserManager'
    import Permission from './views/users/Permission'
    import Role from './views/users/Role'
    
    let routes = [
        {
            path: '/login',
            component: Login,
            name: '',
            hidden: true
        },
        {
            path: '/404',
            component: NotFound,
            name: '',
            hidden: true
        },
        //{ path: '/main', component: Main },
    ];
    export default routes;
    
    export const powerRouter = [
        {
            path: '/',
            component: Home,
            name: '系统管理',
            iconCls: 'fa el-icon-message',//图标样式class
            role:['role'],
            children: [
                { path: '/main', component: Main, name: '主页', hidden: true }, // 子菜单列表
                // { path: '/table', component: Table, name: 'Table' },
                //{ path: '/form', component: Form, name: 'Form' },
                // { path: '/permission', component: Permission, name: '权限管理' },
                { path: '/role', component: Role, name: '角色管理' },
                { path: '/user', component: UserManager, name: '用户管理' },
            ]
        },
        {
            path: '/',
            component: Home,
            name: '导航二',
            iconCls: 'fa fa-id-card-o',
            role:['role'],
            children: [
                { path: '/page4', component: Page4, name: '页面4' },
                { path: '/page5', component: Page5, name: '页面5' }
            ]
        },
        {
            path: '/',
            component: Home,
            name: '',
            iconCls: 'fa fa-address-card',
            leaf: true,//只有一个节点
            // role:['cmdb','role','user'],
            children: [
                { path: '/page6', component: Page6, name: '导航三' }
            ]
        },
        {
            path: '/',
            component: Home,
            name: 'Charts',
            iconCls: 'fa fa-bar-chart',
            // role:['cmdb','role','user'],
            children: [
                { path: '/echarts', component: echarts, name: 'echarts' }
            ]
        },
        {
            path: '*',
            hidden: true,
            // role:['role','user'],
            redirect: { path: '/404' }
        }
    ];
    router.js
     2、路由拦截: main.js
    import routes from './routes'
    import { powerRouter  } from './routes.js';
    
    
    // 路由卫士,判断路由权限
    router.beforeEach((to, from, next) => {
        if (store.state.user) { //判断role 是否存在
            // console.log('dddddddddd', store.state.user);
            if (store.state.newrouter.length !== 0) {
                next();
            } else {
                let newrouter = [];
                let _role = store.state.user.roles;    // ##从后端获取权限,默认权限是['admin','user']这种数组形式
                _role.forEach((i) => {
                    console.log("_role:::::::::::::::::::",_role);
                    console.log('i::::::', i);// ##遍历里面的权限
                    powerRouter.forEach((k) => {
                        console.log("powerRouter::::::::::::",powerRouter);
                        console.log("k:::::::::::::::::",k)
                        // ##遍历定义的路由信息
                        if (k.role==null){
                           return true;
                        }
                        k.role.forEach((j) => {
                            console.log("k.role:::::::::::::::::",k.role);
                            console.log("j:::::::::::::::::",j)
                                if (j === i) {                         // ##相关参数做比对,符合权限的,添加到路由
                                    newrouter.push(k);
                                    console.log('kkkkkkk', k);
                                    console.log('jjjjjjj', j);
                                    console.log('iiiiii', i);
                                }
                            }
                        )
                    });
                });
                //404的页面再最后加,不然总数访问到的都是404界面
                newrouter.push({
                    path: '*',
                    redirect: '/404'
                });
                console.log('11111111', _role)
                router.addRoutes(newrouter); //添加动态路由
                store.dispatch('NewRouter', newrouter).then(res => {
                    next({...to})
                }).catch(() => {
    
                })
            }
        } else {
            if (['/login'].indexOf(to.path) !== -1) {
                next()
            } else {
                next('/login')
            }
        }
    });
    main.js

     3、vuex路由管理。

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex);
    // 创建基本状态
    const state = {
        user: JSON.parse(localStorage.getItem('user')) || '',
        newrouter: []
    };
    // 创建改变状态的方法
    const mutations = {
        // 登录
        LOGIN(state) {
            state.user = JSON.parse(localStorage.getItem('user'))
            newrouter: []
        },
        // 登出
        LOGOUT(state) {
            state.user = ''
            localStorage.removeItem('token')
            localStorage.removeItem('user')
            newrouter:  []
        },
        NewRouter(state, newrouter) {
            state.newrouter = newrouter
        },
        CleanRouter(state) {
            state.newrouter = []
        }
    }
    // 创建驱动actions可以使得mutations得以启动
    const actions = {
        // 这里先来一个驱动LOGIN的东西就叫login吧
        login({commit}) {
            commit('LOGIN')
        },
        // 同样来个logout
        logout({commit}) {
            commit('LOGOUT')
        },
        NewRouter({commit}, newrouter) {
            commit('NewRouter', newrouter)
        },
        CleanRouter({commit}) {   // 登陆之前清控路由表
            commit('CleanRouter')
        }
    }
    
    export default new Vuex.Store({
        state,
        mutations,
        actions
    })
    store.js

    4、前端根据过滤出的路由生成侧边栏,替换到路由:

        computed: {
                      routes() {
                        return this.$store.state.newrouter            
                     }
                 },
    5、剩下的就是侧边栏路由遍历信息:
    <template v-for="(item,index) in routes" v-if="!item.hidden">
     
    6、这样就形成了,不同的用户登录具有不同的展示和权限。
  • 相关阅读:
    Oracle 的字符集与乱码
    linux 时间同步的2种方法
    2 创建型模式-----工厂方法模式
    条款4:确定对象在使用前已被初始化
    条款3:尽可能地使用const
    条款2:尽量以const、enum、inline替换#define
    条款13:以对象管理资源
    条款12:牢记复制对象的所有成员
    条款11:在operator=中处理“自我赋值”
    条款10:令operator=返回一个*this的引用
  • 原文地址:https://www.cnblogs.com/edeny/p/12686890.html
Copyright © 2011-2022 走看看