资讯专栏INFORMATION COLUMN

vue vuex vue-rouert后台项目——权限路由(超详细简单版)

olle / 1520人阅读

摘要:可以配合相关的官方文档学习。上面的内容说的重点,其实也算是项目的全部啦项目地址感觉还不错的话就请给个吧谢谢有什么问题欢迎提问

项目地址:vue-simple-template
共三个角色:adan barbara carrie 密码全是:123456

adan 拥有 最高权限A 他可以看到 red , yellow 和 blue 页面(共三个页面)
barbara 拥有 权限B 他可以看到 red 和 yellow 页面
carrie 拥有 权限C 他可以看到 red 和 blue 页面

技术栈
webpack         ---- 打包神器
vue             ---- JavaScript 框架
vuex            ---- 实现不同组件间的状态共享
vue-router      ---- 页面路由
babel-polyfill  ---- 将ES6代码转为ES5代码
normalize.css   ---- 重置掉该重置的样式
element-ui      ---- UI组件库
项目初始化
# cd 到项目文件夹
cd weven-simple-template
# 安装依赖 (本项目还安装了其他依赖详情 请见 package.json 文件)
npm install
# 运行项目
npm run dev
项目结构

vue-cil 脚手架初始化项目后,我只修改过src文件夹

src
├── App.vue         ---- 页面入口
├── api             ---- api请求
│   └── login.js    ---- 模拟json对象数据
├── assets          ---- 主题 字体等静态资源
│   └── logo.png
├── components      ---- 组件
│   ├── index.vue
│   └── login.vue 
├── main.js         ---- 初始化组件 加载路由
├── router          ---- 路由
│   └── index.js
└── store           ---- vuex状态管理
    ├── getters.js
    ├── index.js
    └── modules
        └── login.js
重点:

动态路由的关键在于router配置的meta字段和vuex的状态共存

// ----  router/index.js  ----
// 初始化路由
export default new Router({  
  routes: [
    {
      path: "/login",
      name: "Login",
      component: Login
    }
  ]  
});
// 动态路由 meta 定义了role
export const powerRouter =[    
    { path: "/",redirect:"/red", name: "index",component: Index,hidden:false,
      children: [
        { path: "/red", name: "red", component: red,},
        { path: "/yellow", name: "yellow", component: yellow, meta: {role: "B"}},
        { path: "/blue", name: "blue", component: blue, meta: {role: "C"}}
      ]
    }
];
//----  store/modules/login.js  actions部分  ----
Logins({ commit }, info){
          return new Promise((resolve, reject) => {
              let data={};
              loginByUserInfo.map(function (item) { //获取所以用户信息
                  if(info.username === item.username || info.pew === item.pew){
                      commit("SET_USERNAME",item.username);  //将username和role进行存储
                      sessionStorage.setItem("USERNAME", item.username); //存入 session 
                      commit("SET_ROLE",item.role);
                      sessionStorage.setItem("ROLE", item.role);
                      return data={username:item.username,introduce:item.introduce};
                  }else{
                      return data;
                  }
            });  
              resolve(data);
        }).catch(error => {
            reject(error);
        });
      },
      Roles({ commit }, newrouter){
        return new Promise((resolve, reject) => {
              commit("SET_NEWROUER",newrouter); //存储最新路由
              resolve(newrouter);
        }).catch(error => {
            reject(error);
        });
      },
// ----  main.js  ----
router.beforeEach((to, from, next) => {
    if(store.getters.role){ //判断role 是否存在
        
        if(store.getters.newrouter.length !== 0){  
               next() //resolve 钩子
        }else{
            let newrouter
               if (store.getters.role == "A") {  //判断权限
                newrouter = powerRouter
            } else {
                let newchildren = powerRouter[0].children.filter(route => {
                    if(route.meta){
                        if(route.meta.role == store.getters.role){
                            return true
                        }
                        return false
                    }else{
                        return true
                    }
                });
                newrouter = powerRouter
                newrouter[0].children = newchildren
            }
            router.addRoutes(newrouter) //添加动态路由
            store.dispatch("Roles",newrouter).then(res => { 
                next({ ...to })
            }).catch(() => {       

            })
        }      
    }else{
           if (["/login"].indexOf(to.path) !== -1) { 
           next()
        } else {
           next("/login")
        }
    }
})
// ----  components/index.vue  ----
// mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性

...mapGetters([
        "newrouter"
    ])
    

此项目拿去 捋清楚 vue+vuex+vue-router 的关系是没问题的,这可以说的超级简单的版本,适合初学。可以配合相关的官方文档学习。上面的内容说的重点,其实也算是项目的全部啦

项目地址:vue-simple-template
感觉还不错的话就请给个 star 吧~ 谢谢

有什么问题欢迎提问~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90517.html

相关文章

  • 手摸手,带你用vue后台 系列二(登录权限篇)

    摘要:我们将登录按钮上绑上事件,点击登录之后向服务端提交账号和密码进行验证。所以前端和后端权限的划分是不太一致。侧边栏最后一个涉及到权限的地方就是侧边栏,不过在前 完整项目地址:vue-element-admin 系列文章: 手摸手,带你用vue撸后台 系列一(基础篇) 手摸手,带你用vue撸后台 系列二(登录权限篇) 手摸手,带你用vue撸后台 系列三 (实战篇) 手摸手,带你用vu...

    不知名网友 评论0 收藏0
  • 一步步带你做vue后台管理框架(一)——介绍框架

    摘要:组件已经有了,我们的框架还有哪些特性呢自适应自适应现在很多框架都没有自适应功能,而很多使用场景也在手机上会有,这也是后台管理框架诞生的原因之一。 系列教程《一步步带你做vue后台管理框架》第一课 github地址:vue-framework-wz线上体验地址:立即体验  《一步步带你做vue后台管理框架》第一课:介绍框架《一步步带你做vue后台管理框架》第二课:上手使用《一步步带你做v...

    XiNGRZ 评论0 收藏0
  • vue中如何实现后台管理系统的权限控制

    摘要:二接口访问的权限控制接口权限就是对用户的校验。代码如下按扭权限指令至此为止,权限控制流程就已经完全结束了,在最后我们再看一下完整的权限控制流程图吧五路由控制完整流程图六参考文献手撸后台管理网站之权限控制手摸手,带你用撸后台之权限控制 原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 一、前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点。首先我们确定的权限控制分为两大部分,其...

    songze 评论0 收藏0
  • vue中如何实现后台管理系统的权限控制

    摘要:二接口访问的权限控制接口权限就是对用户的校验。代码如下按扭权限指令至此为止,权限控制流程就已经完全结束了,在最后我们再看一下完整的权限控制流程图吧五路由控制完整流程图六参考文献手撸后台管理网站之权限控制手摸手,带你用撸后台之权限控制 原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 一、前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点。首先我们确定的权限控制分为两大部分,其...

    iliyaku 评论0 收藏0
  • vue中如何实现后台管理系统的权限控制

    摘要:二接口访问的权限控制接口权限就是对用户的校验。代码如下按扭权限指令至此为止,权限控制流程就已经完全结束了,在最后我们再看一下完整的权限控制流程图吧五路由控制完整流程图六参考文献手撸后台管理网站之权限控制手摸手,带你用撸后台之权限控制 原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 一、前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点。首先我们确定的权限控制分为两大部分,其...

    VincentFF 评论0 收藏0

发表评论

0条评论

olle

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<