Alain 菜单权限控制

栏目: ASP.NET · 发布时间: 6年前

内容简介:动态菜单管理,用户对应角色,角色对应菜单。为用户进行设置角色,登陆系统后,用户可使用其拥有角色对应的所有菜单。功能实现很简单,这里就不进行代码的讲解了,直接讲一下我所实现的思路。

问题描述

动态菜单管理,用户对应角色,角色对应菜单。

为用户进行设置角色,登陆系统后,用户可使用其拥有角色对应的所有菜单。

功能实现很简单,这里就不进行代码的讲解了,直接讲一下我所实现的思路。

实现

原设计

系统设置中,前台菜单遵循如下格式:

menus: [
    {
        text: '主导航',
        group: true,
        children: [
            {
                text: '首页',
                link: '/main',
                icon: 'anticon anticon-compass'
            },
            {
                text: '系统设置',
                link: '/setting',
                icon: 'anticon anticon-setting'
            }
        ],
    }
]

所以最开始的思路也很简单,后台的 Menu 实体中存储菜单所有相关的信息。

后台直接就查出当前登录用户所有的菜单,前台根据返回来的菜单数据构建前台菜单。

问题

能实现肯定是能实现,但我们进行设计时,考虑的不应仅仅是实现,考虑的更多的是我这么实现,效率高不高?以后好不好改?能不能被以后维护的人员快速理解?

斟酌之后,断然抛弃了这种实现,因为,不能把所有的数据都放在后台。

就拿 icon 字段来说,如果我们采用了上述实现:

那当我们以后想修改前台菜单图标的时候,需要去修改后台的数据初始化。这显然不合理,以后维护的人员肯定会存在一个疑问,这是谁设计的菜单?我改个前台的图标为什么要动后台?

新设计

既然不能讲数据都放在后台,那前后台就各司其职。

前台:包含菜单名称,菜单图标,菜单路由等信息。负责前台菜单的格式显示。

后台:只保留,菜单名,菜单路由,父菜单三项信息。负责后台用户的菜单授权。

核心思想就是:前台配置好所有的菜单,但默认将菜单隐藏。

应用启动时,查询后台接口,获取当前用户的所有授权菜单,授权一个,前台就显示一个。

前台菜单:写菜单时将 hide 置为 true ,默认隐藏。

menus: [
    {
        text: '主导航',
        group: true,
        children: [
            {
                text: '首页',
                link: '/main',
                hide: true,
                icon: 'anticon anticon-compass'
            },
            {
                text: '系统设置',
                link: '/setting',
                hide: true,
                icon: 'anticon anticon-setting'
            }
        ]
    }
]

然后就是具体的逻辑,先获取前台的菜单,即所有菜单。

获取当前用户授权菜单列表,以路由表示该菜单唯一,如果路由被授权,就把 hide 置为 false

/**
 * 获取所有被授权的菜单
 */
getAllAuthMenu(): Observable<Array<Menu>> {
    // 获取前台菜单
    const menus = AppConfig.menus as Array<Menu>;
    return this.httpClient.get('/menu/allAuthMenu')
        .pipe(map((allAuthMenus: Array<WebAppMenu>) => {
            // 对菜单进行处理
            menus.forEach((menu: Menu) => {
                menu.children.forEach((childMenu: Menu) => {
                    childMenu.hide = !WebAppMenuService.checkMenuAuthOrNot(childMenu, allAuthMenus);
                });
            });
            return menus;
        }));
}

总结

先完成,再完美。这里仅实现了菜单的隐藏,需要再编写权限控制逻辑,使我们的系统更安全,但那是我们以后要考虑的事情。现在先加个 TODO

先把客户想要的功能先实现了,至于你实现得如何,代码如何,客户统统不关心,我们在先满足客户对开发速度需求的前提下,以后再抽出时间将程序的某些功能完美。


以上所述就是小编给大家介绍的《Alain 菜单权限控制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何把事情做到最好

如何把事情做到最好

乔治·伦纳德 / 张乐 / 中国青年出版社 / 2014-2 / 29.90元

•改变全球9800万人的人生指导书 •全美第一本系统阐述学习与成功之道的经典著作 •长期盘踞全美畅销书榜单 •21年后,这本传奇之书终于在中国震撼上市 •把事情做到最好,第一不强求天赋,第二不介意起步的早晚,你要做的就是“起步走”并“不停地走” 《如何把事情做到最好》出 版于1992年,经久不衰,经过一代又一代的读者口碑相传后,畅销至今。作者以其独特的视角告诉人们,如......一起来看看 《如何把事情做到最好》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具