router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/pages/login'
import { generateRoutes } from './permission'
Vue.use(Router)

export const routes = [
    {
        path: '/login',
        name: 'login',
        hidden: true,
        component: Login
    },
    {
        path: '/',
        redirect: '/Choose'
    },
    {
        path: '/Choose',
        name: 'choose',
        component: () => import('../pages/choose')
    },
    {
        path: '/Use',
        name: 'Use',
        component: () => import('../pages/use')
    },
    {
        path: '/Sdk',
        name: 'sdk',
        component: () => import('../pages/sdk/sdk')
    },
    {
        path: '/404',
        name: '404页面',
        component: () => import('../pages/404.vue')
    }
]

// 需根据权限进行动态生成的路由
export const asyncRoutes = [
    { path: '/test1', meta: { roles: ['admin'] }, name: 'test1', component: () => import('../pages/test1') },
    { path: '/test2', meta: { roles: ['edit'] }, name: 'test2', component: () => import('../pages/test2') },
    { path: '/test3', meta: { roles: ['admin', 'edit'] }, name: 'test3', component: () => import('../pages/test3') },
    { path: '*', redirect: '/404', hidden: true }
]

const router = new Router({
    routes: routes
})

var flag = true // 页面刷新标志

router.beforeEach((to, from, next) => {
    if (to.path === '/login') {
        sessionStorage.removeItem('name')
        // sessionStorage.removeItem('pass')
        flag = true
        next()
    }
    let admin = sessionStorage.getItem('name')
    if (!admin && to.path !== '/login') {
        console.log('不是登录页面')
        next({ path: '/login' })
    } else {
        // 该处进行动态路由生成(当页面刷新时或首次进入该系统时,生成路由)
        if (flag && to.path !== '/login') {
            flag = false
            router['options'].routes = routes
            let generateAsyncRoutes = generateRoutes(asyncRoutes, sessionStorage.getItem('name')) // 根据登录角色生成动态路由
            router.addRoutes(generateAsyncRoutes)
            router['options'].routes = router['options'].routes.concat(generateAsyncRoutes)
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
        } else {
            next()
        }
    }
})

export default router

router/permission.js

function hasPermission(route, role) {
    if (route.meta && route.meta.roles) {
        return route.meta.roles.indexOf(role) !== -1
    } else {
        return true
    }
}

// 该处的role为登录角色,可根据实际需要进行动态生成
export const generateRoutes = function(asyncRoutes, role) {
    const res = []
    asyncRoutes.forEach(item => {
        const mid = { ...item }
        if (hasPermission(mid, role)) {
            if (mid.children) {
                mid.children = generateRoutes(mid.children, role) // 对子路由进行递归,防止遗漏(同时该部分支持多级子路由的递归生成)
            }
            res.push(mid)
        }
    })
    return res
}

login.vue

<template>
    <div>
        <div>登陆页面</div>
        <div @click="login">登陆</div>
    </div>
</template>
<script>
export default {
    methods: {
        login() {
            sessionStorage.setItem('name', 'admin')
            this.$router.push('/choose')
        }
    }
}
</script>

posted on 2020-04-16 00:22  佑之以航  阅读(842)  评论(0编辑  收藏  举报