C/S模式根据权限基于反射机制实现动态生成菜单
有了一些MIS的开发经验,也用笨方法实现了根据不同用户、不同角色、不同权限分配不同菜单的功能,但总觉得那还不是自己想要的。因为那时有进度约束着的,为了赶工而投机取巧了罢了。
实现方法是这样的:
1、数据库中设计了用户表、用户角色表、角色权限表、角色基本表和菜单结构表,不同的用户可分配不同的角色,不同的角色分配不同的权限。
2、在主程序中加好菜单并建立了两个数组,一个字符型的(存储菜单名),一个布尔型的(存储菜单状态),二者等长。第一个数组的元素跟菜单结构表中的菜单名一一对应,第二个数组的元素全是false。
在主程序的Load事件里面加入代码:
int i = 0;
menuItem1.Visible = menuStates[i];//menuStates就是第二个数组
menuItem1.Enabled = menuStates[i++];//如果只设置菜单项不可见,菜单的快捷键还是能响应的
……
注意:此处menuItem一定要和实际的菜单一一对应。
3、在权限设置模块实现给用户分配角色,给角色分配权限既菜单。在给角色分配权限时其实是把菜单结构表中菜单名分配给角色,加到角色权限表中。角色的权限是一串字符,就是菜单结构表中的菜单名累加起来(中间加上特定的分隔字符,相同要进行约减)。
4、用户登录的时候就直接在主程序中取用户的角色,再根据角色取权限,再把权限串加到一起,就得到这个用户的所有权限。然后将权限串按照分割符分开成数组,再将分割后的数组与2中第一个数组中元素一一进行比较,如果相同就将对应位置的菜单状态数组元素设为true。这要在2中代码之前处理。
这样,菜单的动态显示就能实现了
最近又看了一些关于动态菜单的文章,其中大多是讲用XML实现的,也有提到反射的,恍然发现我之前的方法确是微不足道的,所以还想做些这方面的研究。经过一个晚上的努力,终于实现了一个“XML+反射”的动态菜单,把菜单的功能单独做到一个dll,然后动态添加到主程序,增加新的功能只需要重新生成一个dll,然后再XML文件中配置,不需要重新安装主程序。但是权限还是没有去做,因为我开始感到迷茫,这样做是否合理、是否高效?动态生成菜单有没有更好的解决方案呢?