路由权限的设计思路:

首先,我们的需要校验权限的路由的 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. nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist

    org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may ...

  2. Linux打开网易云的问题

    网易云需要ROOT权限启动,期间终端不能关闭退出,否则网易云音乐会自动退出.    终端输入:sudo netease-cloud-music &u

  3. python练习题-1

    1.输出正方形 x=input("请输入:") x=int(x) for i in range(0,x): if (i==0) or (i==x-1): print("* ...

  4. TP5使用API时不可预知的内部异常

    最常见的错误形式例如 controller不存在或者 action不存在之类的 我们第一时间想到的 就是 使用 try{}catch(){} 来捕获 例如: /** * show方法在common里定 ...

  5. Docker入门-搭建docker私有仓库

    Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来使用. 注册登录 可 ...

  6. 用友网络科技Java高级开发面试题(2019)

    面试时间:2019年8月18日上午9:30 面试岗位:Java高级开发 面试形式:电话面试 这些天在boss上逛了下,看见北京Java开发工资比较诱人,便萌生了去北京的想法,做一名北漂的程序猿.约了几 ...

  7. [ PyQt入门教程 ] PyQt+socket实现远程操作服务器

    来需求了..干活啦.. 需求内容 部分时候由于缓存刷新.验证码显示不出来或者浏览器打不开或者打开速度很慢等原因,导致部分测试同事不想使用浏览器登录服务器执行命令.期望有小工具可以替代登录浏览器的操作, ...

  8. Docker系列之AspNetCore Runtime VS .NetCore Runtime VS .NET Core SDK(四)

    前言 接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了,在开始之前如题,我们需要搞清楚一些概念,要不然看到官方提供如下一系列镜像,我们会一脸懵逼,不知道到底要使用哪一个. AspN ...

  9. VS引用文件出现黄色感叹号丢失文件,应该如何解决?

    VS是微软开发的一款超级强大的IDE,深受广大.net开发者喜爱. 但是再强大,也会有它的bug和缺点. 多人协同开发时,不知道你有没有遇到一个这样的情况:第二天上班,早早来到公司,打开电脑,拉取一下 ...

  10. Log2Net的部署和运维

    前面几节中,笔者介绍了Log2Net组件的方方面面.但是,有人说,我用不起来,各种头疼的小问题.下面,我们就具体的看一看要怎么把这个组件应用到实际的项目中吧. 一.Log2Net组件的发布 前文中,我 ...