-
-
Notifications
You must be signed in to change notification settings - Fork 30.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
请问路由配置可以动态的改变吗? #293
Comments
只要将 |
请问可以详细的指点下吗?
大概应该怎样实现呢?因为asyncRouterMap还跟components相关联,因此不太理解应该怎样实现,非常感谢~ |
再做一个asyncRouterMap.components的name 和 本地components 做一个映射 const map={
login:require('login/index').default // 同步的方式
login:()=>import('login/index') // 异步的方式
}
//你存在服务端的map类似于
const serviceMap=[
{ path: '/login', component: 'login', hidden: true }
]
//之后遍历这个map,动态生成asyncRouterMap
并将 component 替换为map[component] |
非常感谢,按照您的方法已经成功实现了~ |
@PanJiaChen 请问asyncRouterMap在服务器端怎么存取比较好?目前我们公司的后台给的解决方案是把name和role作为两个字段存在数据库中,其它字段作为一个payload存起来,获取asyncRouterMap时候再拼出来,这样子的实现感觉很奇怪,请问有什么好的实现方法吗? |
name 和 role作为存储的关键词也没什么问题,选择自己合适的交互方式就行了,反正前端总归需要洗数据的。 |
@gaoshijun1993 能提供怎么实现后台动态权限的实现么?后端人员确实不知道前端怎么整理。 |
其实和上面处理方式差不多。 //后台返回的权限表 :结构和本地的asyncRouterMap层级一致
let roleTypes = [{
meta: {
title: 'example',
roles: ['admin', 'editor']
},
children: [{
meta: {
title: 'createArticle',
roles: []
}
}]
}, {
meta: {
title: 'table',
roles: ['admin', 'editor']
},
children: [{
meta: {
title: 'dynamicTable',
roles: ['admin', 'editor']
}
}, {
meta: {
title: 'complexTable',
roles: ['editor']
}
}]
}]
//判断是否是管理员
if (roles.indexOf('admin') >= 0) {
//动态给所有权限
for (let j = 0; j < asyncRouterMap_copy.length; j++) {
if ('roles' in asyncRouterMap_copy[j]['meta']) {
asyncRouterMap_copy[j]['meta']['roles'] = ['admin'];
}
if ('children' in asyncRouterMap_copy[j]) {
for (let k = 0; k < asyncRouterMap_copy[j]['children'].length; k++) {
asyncRouterMap_copy[j]['children'][k]['meta']['roles'] = ['admin'];
}
}
}
} else {
//如果不是全局配置的管理员
//判断后端正确返回的路由表
if (roleTypes.length <= 0) {
asyncRouterMap_copy = []
} else {
for (let j = 0; j < asyncRouterMap_copy.length; j++) {
for (let i = 0; i < roleTypes.length; i++) {
//遍历父级
if (roleTypes[i]['meta']['title'] === asyncRouterMap_copy[j]['meta']['title']) {
asyncRouterMap_copy[j]['meta']['roles'] = roleTypes[i]['meta']['roles']
}
//遍历子级
if ('children' in asyncRouterMap_copy[j]) {
for (let k = 0; k < asyncRouterMap_copy[j]['children'].length; k++) {
if ('children' in roleTypes[i]) {
for (let e = 0; e < roleTypes[i]['children'].length; e++) {
if (asyncRouterMap_copy[j]['children'][k]['meta']['title'] === roleTypes[i]['children'][e]['meta']['title']) {
asyncRouterMap_copy[j]['children'][k]['meta']['roles'] = roleTypes[i]['children'][e]['meta']['roles']
}
}
}
}
}
}
}
}
} 前端本地是有一份完整的菜单结构,但是初始化的时候,都不给权限,然后后端只返回权限类型就可以了。 如果能解决路由中:component: () => import ('@/views/permission/page'), 这个由后台返回的话解析的话,其实整个asyncRouterMap都可以由后端返回。 其实真正开发的时候,新加一个菜单功能,配置component这个必然前端要做修改的。所以我认为放一份全部的菜单在前端是合理的。 我这里只是做了两级的一个判断,有需要大家可以写个递归。 |
@PanJiaChen |
@baidan 还是看需求,简单项目权限比较固定,权限角色比较少的情况下前端控制一下就好了。 举个例子,我现在在维护的一个项目,刚开始就十个左右权限角色,每个权限角色对应的权限和页面也很固定。但随着迭代,角色和页面越来越多,之间的划分就变得很麻烦了。所以现在做成了,权限表存在后端,前端提供一个配置每个权限角色能访问的页面的可视化页面。让产品或者专门的人来维护它。程序员不要再思考每个页面需要什么权限了。 |
@PanJiaChen 我觉得把每个页面的权限 从原来的角色 改成为 权限字段 即可 , 每次登陆的时候 根据当前的用户的角色, 获取当前角色的 权限列表信息 比如 这样做有如下好处
相当于 与角色解耦了。 前后端都很轻松了 去除了 有些方案中产生的 菜单列表 这种 api ,以及对应产生 要对菜单列表数据 进行router 转换。 |
求教一下,动态路由在component赋值的时候遇到的问题。我的asyncmap路由表整个是从后台拼好返回的。由于component要求是对象。
请教一下为什么第一种方式不行。 |
自答一下,是不是因为在我请求的时候已经编译成js文件了,再拼进去已经不走webpack了,所以没法找到组件。而第二种方式是在run dev的时候已经把需要的组件找到了。。。 |
我想说,目前处理权限处理阶段,真他么要崩溃了,记录一下2020.8.13,发发牢骚!!! |
我想把菜单全部由后台查询出来,前端不用配置,请问这个要怎么弄呢?取出来了,也显示了,但是就是不能折叠,点击也是空白页 |
各位大哥们,如果一开始按照 @/router/index.js 中的 asyncRouterMap 分配角色,将不同的角色对应不同的路由表保存到数据库中。但是一段时间后,源码中的 @/router/index.js 中的 asyncRouterMap 路由表发生变化。那么之前已经被之前增加的角色保存到数据库的路由怎么更新。难道要写个接口把最新的 @/router/index.js 中的 asyncRouterMap 发给后端让后端处理遍历角色表中的路由嘛?有遇到这种情况的嘛?万分感谢! |
官方给的文档很不明确,希望能给一个切实可行的demo |
嗯,我也在尝试这个方式,根本也不需要前端去 role 啥的。后端直接生成好对用用户权限的路由就很舒服了。现在遇到 compoent 的时候 can't find module 的问题, |
可是,坑呀,遇到 chunk-libs.102e56c5.js:46 Error: Cannot find module '@/views/system/permission/index 这样的问题。怎么整呢。 |
文档还是不错的,只是没有那么周全,把所有的都呵护到。 |
是否可以换一个思路,前端路由表在控制权限的时候,是通过meta{roles:[]}这样来实现的,然后后端只需要存储一个能和前端路由表映射的数据,然后前端在登录之后,本身用户已经获取角色信息了,后端不用根据用户角色身份来获取路由表,而是直接将所有的权限查出,然后映射给前端路由,当然这样就会变成纯粹的前端控制路由,但是后端已经存储了路由角色的权限关系,如果需要后端验证,再动态向后端验证就可以了,这样做,只要用户登录,不是根据用户去查路由表,而是默认去查路由表的权限的角色,然后赋值给前端, |
@EUEHBin 我上面说的就是你的意思,但是我觉得你有个地方会报错 `function makePermissionRouters(serverRouter, clientRoutes)
}
} 这里我用的标识是path,因为有的我没有写name这个参数,但是path是必须的, |
后端根据登录的用户返回该用户可访问的页面路由name,前端根据此数据过滤路由。 按钮权限的话,后端返回该用户可操作的按钮action,前端在某权限A按钮上判断这个A是否在action列表中,如果有就说明有权限操作该按钮。 这样就不需要考虑角色问题,角色可访问页面和可操作按钮都是可以动态配置的。 不知这样实现可行吗? |
映射这样写
] src/store/permission.js // 遍历后台传来的路由字符串,转换为组件对象 const loadView = (view) => require( |
|
我也是遇到这种问题 |
@hanhaiyuntao 检查你的路径 大大概率是 写错了 。 @/${route.component}.vue` 注意@符号后面的分隔符 |
现在基于这套思路封装了插件,可以直接使用,https://github.com/BWrong/auth-tool |
你这样做的话还是不够灵活 没办法直接去动态设置路由的标题 图标啥的 ,有什么修改需要重新编译打包才行 |
图标是在后台数据返回的,修改图标直接去后台修改就行了,同理需要在管理端控制的都可以放到后台去维护.如菜单名字、图标等等,因为除了permission这个字段,其他是完全解耦的,你想在后台控制什么就取决于你的数据结构 |
看了下 你这种方式和另外一种方式直接返回对应角色路由表区别并不大 |
这个看自己吧,我这样做主要是最大程度和后台解耦,这样path和component就完全由前端自己控制,而不是我要调整一下组件位置或者路由还需要去后台修改一下,而且也可以减少一些配置项,不用在后台暴露前端路由组件的文件结构 |
我觉得这个思路是最棒的 |
component: () => import('@/views/${component}') + babel-plugin-dynamic-import-webpack 可以实现动态加载菜单,但是不能热更新了开发模式下 |
@wcooltime 你能详细说明下吗?,动态加载菜单是没问题,关键是我想用后端实现,而现在我打算用node来处理前端文件 |
使用babel-eslint(官方废弃了此包)会导致下面这种import动态导入写法报错
换成 |
思路基本差不多,根据后端返回的权限树,动态匹配出一份路由 再 addRoutes |
通过递归后台传过来的数据 转成router |
前端的路由应该被描述为资源(或者叫权限点),而不是和role耦合在一起。 具体做法是把路由表中的roles(哪些角色能访问)改为permission(这个路由的资源名称)。后台负责维护登录人具有哪些角色,角色具有哪些permission,前端通过接口获取当前登录人的permissionList,与路由表permission匹配出正确的动态路由表再addRoutes。 同理,按钮级的permission也应该被描述为资源,而不是和role耦合在一起。 |
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
我的解决方案 |
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
可以的,你本地把所有的路由组件进行平铺展开,然后在每个文件里,去写一下对应的router-view,和对应router.name的隐藏显示逻辑,然后后端返回父子集的包含关系,你这边拿到遍历一下填入对应的components,就可以实现了
…------------------ 原始邮件 ------------------
发件人: "PanJiaChen/vue-element-admin" ***@***.***>;
发送时间: 2023年7月23日(星期天) 晚上10:01
***@***.***>;
***@***.******@***.***>;
主题: Re: [PanJiaChen/vue-element-admin] 请问路由配置可以动态的改变吗? (#293)
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: ***@***.***>
|
我们现在想要增加一个功能,就是管理员可以更改每个菜单的可访问角色列表,我想在进入页面之前从服务器获取每个路由的可访问列表并更改,请问这样子可以实现吗?
The text was updated successfully, but these errors were encountered: