路由权限的设计思路:

首先,我们的需要校验权限的路由的 url,全部由后端返回,后端会返回当前用户的路由树数组。
前端在进入页面前请求接口,把数据拿到:

其次,前端会维护一个路由映射组件的列表,如果路由中拿到 url, 匹配到了对应的组件,那么将该组件添加到路由对象中去,相当于,前端路由都是动态生成的。

前端拿到这个路由树数组后,进行递归遍历,将路由树里的一级菜单、二级菜单,寻找对应的组件。

// main.js
const vm = new Vue({
router,
store,
i18n,
render: h => h(App),
beforeCreate() {
getMenu(); // 进入系统前,请求接口
}
}).$mount("#app"); // 请求后台接口函数,拿到菜单数据和按钮权限数组,
export const getMenu = async () => {
const req: any = {};
return new Promise(resolve => {
Http.get(Url.base.getMenu, req).then((response: AxiosResponse) => {
let result = response.data;
if (result.code === Code.SUCCESS) {
let resultMap = {};
let menu = result.data.menuInfoMapList; // 拿到菜单 url 的 list map
let permission = result.data.operateMapList; // 拿到按钮权限数据的数组
let formatedRoutes = formatRoutes(menu); // 递归菜单,格式化后的菜单树,
let formatedPermission = formatPermission(permission); // 权限数组
resultMap = {
formatedRoutes,
formatedPermission
};
router.addRoutes(formatedRoutes); // 利用 vue-router 的 addRoutes 方法,将格式化后的代码添加到路由对象中
store.commit("base/saveMenu", formatedRoutes); // 将格式化的菜单树放入状态管理中保存。
store.commit("setPermission", formatedPermission); // 将格式化的权限数组也放入状态管理中保存
resolve(resultMap);
} else {
resolve([]);
}
});
});
}; /**
* 格式化菜单数据为 vue-router 路由对象格式
*/
export const formatRoutes = (menu: any) => {
if (!menu) {
return [];
}
let result = menu.map((item: any) => {
let children = [];
if (item.child) {
children = formatRoutes(item.child); // 递归遍历权限树
}
return {
path: item.url || "/layout", // 如果没有 url, 做一个容错处理,避免路由没有 path
component: lazyload(item.url), // loayload 是一个方法,传入 url 作为键,返回 url 对应的组件引用。
meta: {
title: item.name
},
children: children
};
});
return result;
}; 前端拿到的数据大致为:
data: {
menuInfoMapList: [
{
url: "/fruits",
name: "水果",
child: [
{
url: "/fruits/apple", // 二级菜单
name: "苹果"
} ,
{
url: "/fruits/banana", // 二级菜单
name: "香蕉"
}
]
}
],
operateMapList: [
"/eatApple", // 按钮权限 code
"/eatBanana" // 按钮权限 code
]
} // 下面就是 loazload.ts 文件,维护了后台传来的 url, 和页面编写好的 组件位置。导出一个函数,就是上面的 loazload 函数。
const routes: any = {
// ===== 权限管理 =====
"/friuts": () => import("@/layout/Layout.vue"), // 一级菜单的 url 和组件
"/friuts/apple": () => import("@/views/Apple.vue"), // 二级菜单的 url 和组件
"/friuts/banana": () => import("@/views/Banana.vue"), // 二级菜单的 url 和组件
};
export default (path: any) => routes[path]; // 下面是按钮权限的控制,比较简单,就是把按钮的 code) 传入校验函数,校验函数就是判断 按钮的 url 在没有在 后台返回的 url 列表中。
export function authHelper(authCode: string) {
let isExist = store.getters["getPermissionList"].includes(authCode);
return isExist;
} // 页面组件上,通过 权限 code 控制按钮权限
<Button v-if="$authHelper("/eatApple")" @click="handleEat">苹果</Button>

vue路由菜单权限设置就button权限设置的更多相关文章

  1. vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题.当然解决问题的方法无非两种——前端控制和后端控制.我们公司这边的产品迭代速度较快,所以我们是从前端控制路由迭代到后端控制路由.下面我会分别介绍这 ...

  2. vue路由守卫用于登录验证权限拦截

    vue路由守卫用于登录验证权限拦截 vue路由守卫 - 全局(router.beforeEach((to, from, next) =>来判断登录和路由跳转状态) 主要方法: to:进入到哪个路 ...

  3. vue项目实践-前后端分离关于权限的思路

    前后端分离后权限的思路 最近看到许多关于权限的思路,但好像都是使用动态加载路由的方式,现在也分享下我在项目中使用的解决方案. 前后端分离关于权限的处理每个人都不一样,根据项目选择制定合适的方案就好 我 ...

  4. vue中如何实现后台管理系统的权限控制

    vuejs单页应用的权限管理实践 一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单 ...

  5. 在linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  6. redis密码设置、访问权限控制等安全设置

    redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护,方法有2,如下. 1.比较安全的办法是采用绑定IP的方式来进行控制.  请在redis.conf文件找到如下配置 # If y ...

  7. Windows下给鼠标右键菜单添加获得完全控制权限的菜单项

    这段时间计算机C分区里多了很多无用的文件,而且不在同一个目录下,搜索出来删除的时候提示没有管理员权限,需要在右键属性里面修改,非常麻烦,于是查询了一下发现可以在文件右键菜单添加一个获取权限的菜单项,这 ...

  8. linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  9. php创建文件夹后设置文件夹权限(转)

    原文链接:http://www.phpstudy.net/b.php/69873.html PHP mkdir()无写权限的问题解决方法 使用mkdir创建文件夹时,发现这个函数有两个参数,第二个参数 ...

随机推荐

  1. jsp对数据库的使用

    JDBC由Sun公司制定,全称JavaDataBase Connectivity,是一种可以执行SQL语句并可返回结果的javaAPI,支持多种关系型数据库,封装在Java.sql.* 它的具体位置在 ...

  2. 解决Vuex持久化插件-在F5刷新页面后数据不见的问题

    页面刷新后,想保存页面未保存的数据.我们总是习惯于放在浏览器的sessionStorage和localStorage中.但是用了vue后,vuex便可以被应用了. vuex优势:相比sessionSt ...

  3. 使用hexo中遇到的问题

  4. spring实战学习笔记(一)spring装配bean

    最近在学习spring boot 发现对某些注解不是很深入的了解.看技术书给出的实例 会很疑惑为什么要用这个注解? 这个注解的作用?有其他相同作用的注解吗?这个注解的运行机制是什么?等等 spring ...

  5. kubeproxy源码分析

    kubernetes离线安装包,仅需三步 kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解iptables模式的原理 ...

  6. Unity基础之:UnityAPI的学习

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  7. Spring 常犯的十大错误,答应我 打死都不要犯好吗?

    1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现, ...

  8. Selenium+java - Ajax浮动框处理

    Ajax浮动框 我们常遇到的某些网站首页输入框,点击后显示的浮动下拉热点,如下图: 实际案例 模拟场景如下: hao123首页搜索输入框,单击搜索框,点击浮动框中的哪吒票房破30亿,单击后选项的文字内 ...

  9. Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器

    写在前面的废话:今天俺又来了哈哈,真的好棒棒! 今天的内容:之前我们大概描述了,我们自己定义的顶点坐标是如何被加载到GPU之中,并且介绍了顶点缓冲对象VBO用于管理这一块内存.今天开始详细分析它的具体 ...

  10. Docker 前沿概述

    目录 Docker 前沿概述 什么是Docker? Docker的基本概念 容器(Container) -- 镜像运行时的实体 镜像(Image) -- 一个特殊的文件系统 仓库(Repository ...