功能要求
不同的用户拥有不同的权限表,能打开不同的页面,没有权限的页面将重定向到404
 刷新之后数据还在并且还在当前页面
数据
后端返回权限表
"operations": [
           {
               "id": 1,
               "path": "/order",
               "name": "订单管理"
           },
           {
               "id": 2,
               "path": "/goods",
               "name": "商品管理"
           },
           {
               "id": 3,
               "path": "/cate",
               "name": "分类管理"
           },
           {
               "id": 4,
               "path": "/client",
               "name": "客户管理"
           },
           {
               "id": 5,
               "path": "/school",
               "name": "校园管理"
           },
           {
               "id": 6,
               "path": "/store",
               "name": "门店管理"
           },
           {
               "id": 7,
               "path": "/data",
               "name": "经营数据"
           },
           {
               "id": 8,
               "path": "/power",
               "name": "权限管理"
           },
           {
               "id": 9,
               "path": "/refund",
               "name": "退款管理"
           }
 代码
router/index.js
//静态路由
 export const constantRouterMap = [
   {
         path: '/home',
         name: '首页',
         meta: {
           isLogin: true
         },
         component: Home
   },
   {
     path: '/login',
     name: 'Login',
     meta: {
       isLogin: false
     },
     component: resolve => require(["@/components/Login"], resolve)
   },
   {
     path: '/',
     name: 'Login',
     meta: {
       isLogin: false
     },
     component: resolve => require(["@/components/Login"], resolve)
   },
   {
     path: '/404',
     name: 'Unfind',
     meta: {
       isLogin: false
     },
     component: resolve => require(["@/components/404"], resolve)
   },
 ]
export default new Router({
   mode: 'history',
   routes: constantRouterMap
 })
//动态路由
 export const asyncRouteMap = [
         {
           path: '/order',
           name: '订单管理',
           meta: {
             isLogin: true
           },
           component: resolve => require(["@/components/Order"], resolve)
         },
         {
           path: '/goods',
           name: '商品管理',
           meta: {
             isLogin: true
           },
           // component: require('./').default
           component: resolve => require(["@/components/goods/Goods"], resolve)
         },
         {
           path: '/cate',
           name: '分类管理',
           meta: {
             isLogin: true
           },
           component: resolve => require(["@/components/categories/Cate"], 
resolve)
         },
         {
           path: '/client',
           name: '客户管理',
           // component: require('./').default
           component: resolve => require(["@/components/client/Client"], 
resolve)
         },
         {
           path: '/school',
           name: '校园管理',
           component: resolve => require(["@/components/school/School"], 
resolve)
         },
         {
           path: '/store',
           name: '门店管理',
           component: resolve => require(["@/components/store/Store"], resolve)
         },
         {
           path: '/data',
           name: '经营数据',
           component: resolve => require(["@/components/Data"], resolve)
         },
         {
           path: '/power',
           name: '权限管理',
           component: resolve => require(["@/components/power/Power"], resolve)
         },
         {
           path: '/Cate/Management',
           name: '分类详情',
           component: CateMan
         },
         {
           path: '/orderDetail',
           name: '订单详情',
           component: OrderDetail
         }
 ]
vuex/store.js
var state = {
     routers: constantRouterMap,
     addRouters: [],
     operations: [],
     token: '',
 }
var mutations = {
     saveOpera (state, opera) {
         state.operations = opera;
     },
     saveToken(state, token) {
         state.token = token;
     },
     setRouters(state,routers) {
         state.addRouters = routers;
         state.routers = constantRouterMap.concat(routers);
     }
 }
 var actions = {
     GenerateRoutes({commit},data) {
         return new Promise(resolve => {
             const { operations } = data;
             console.log(operations)
             const accessedRouters = asyncRouteMap.filter(v => {
                 for(let i=0;i<operations.length;i++){
                     if(operations[i].path === v.path)return true;
                 }
                 return false;
             })
             console.log(accessedRouters);
             commit('setRouters',accessedRouters);
             resolve();
         })
     }
 }
 export default new Vuex.Store({
     state,
     mutations,
     actions
   })
main.js
router.beforeEach((to, from, next) => {
     console.log(store.state.token)
     const operations = store.state.operations;
     console.log(operations);
     store.dispatch('GenerateRoutes', { operations }).then(() => {
       console.log(store.state.addRouters);
       router.addRoutes(store.state.addRouters);
       router.addRoutes([{ path: '*', redirect: '/404', hidden: true 
}]);//最后添加 不然一刷新就会定向到404
     })
     next()
 })
login.vue
this.$store.commit('saveOpera', res.data.operations);
 this.$store.commit('saveToken', res.token);
App.vue
mounted() {
     //在页面加载时读取sessionStorage里的状态信息
   if (!sessionStorage.getItem("token")) {
     this.$Message["error"]({
       background: true,
       content: "请先登录"
     });
     this.$router.push('/login');
   } else {
     this.$store.commit('saveOpera', 
JSON.parse(sessionStorage.getItem("operations")));
     this.$store.commit('saveToken', sessionStorage.getItem("token"));
     const operations = this.$store.state.operations;
     this.$store.dispatch('GenerateRoutes', { operations }).then(() => {
       this.$router.addRoutes(this.$store.state.addRouters);
       this.$router.addRoutes([{ path: '*', redirect: '/404', hidden: true }]);
     })
   }
    // 在页面刷新时将vuex里的信息保存到sessionStorage里
     window.addEventListener("beforeunload",e=>{
       sessionStorage.setItem("token",this.$store.state.token)
       
sessionStorage.setItem("operations",JSON.stringify(this.$store.state.operations))
     })
   },