路由权限的设计思路:

首先,我们的需要校验权限的路由的 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. 基于 HTML5 Canvas 的可交互旋钮组件

    前言 此次的 Demo 效果如下: Demo 链接:https://hightopo.com/demo/comp-knob/ 整体思路 组件参数 绘制旋钮 绘制刻度 绘制指针 绘制标尺 绘制文本 1. ...

  2. 使用secureCRT上传下载

    secureCRT 的 下载 http://pan.baidu.com/s/1c1Mz1ks 下载完成后,输入yum install lrzsz,安装这个东西, 然后就可以直接在secureCRT中输 ...

  3. IIS网站服务器性能优化攻略

    Windows Server自带的互联网信息服务器(Internet Information Server,IIS)是架设网站服务器的常用工具,它是一个既简单而又麻烦的东西,新手都可以使用IIS架设一 ...

  4. 在WPF中嵌入WebBrowser可视化页面

    无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrow ...

  5. kafka集群跨双网段及多网段通信问题解决

    一.问题场景: 实际生产环境总存在很多kafka集群跨网段的问题.kafka集群可能存在多个网卡,对应多个网段.不同网段之间需要同时与集群通信,即跨网段生产消费问题. 二.解决方法:自定义listen ...

  6. X-Admin&ABP框架开发-系统日志

    网站正常运行中有时出现异常在所难免,查看系统运行日志分析问题并能够根据错误信息快速解决问题尤为重要,ABP对于系统运行日志这块已经做了很好的处理,默认采用的Log4Net已经足够满足开发过程中的需要了 ...

  7. dubbo文档笔记

    配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...

  8. 在线图片base64编码

    图片Base64编码https://oktools.net/image2base64 在线工具https://oktools.net JSON格式化https://oktools.net/json U ...

  9. 自练Eclipse搭建SSH全自动注解博客项目笔记

    1.创建一个动态的java项目 2.导入搭建所需要的jar包 3.配置web.xml文件 1).头文件 2).struts2的拦截器 3).定位加载Spring容器的配置文件 4).监听 5). 6) ...

  10. Linux lsof工具介绍

    引言 在<Linux fuser工具介绍>一文中,与大家一起学习了fuser工具的使用方法."lsof"——list open files,lsof也是Linux下用于 ...