权限设计——状态模式
来源:互联网 发布:手机淘宝抢拍神器 编辑:程序博客网 时间:2024/05/09 11:00
前一段公司准备开发一个二期项目,打算在原来的基础上新增一些功能模块,并且能够适合更多种用户使用。这样就面临一个问题,权限的设计问题。原来只是简单的分了几个角色,根据不同角色,分配不同的功能模块。这个让我想起了以前在学校做项目的时候,简单的分用户类型。没有想到来公司做项目后,还是使用这种,写死的东西,根本没法重用。
后来我提出了一个假设,如果我要新增加一个角色,要重新给他分配功能(在原来已有的功能基础上),因为是在已有的基础上,自然希望能够不修改代码,直接分配,这个时候,写死的东西就相形见绌了。
其实当初做毕业设计的时候,我的指导老师曾经提出过,使用字符串来管理权限,字符串的每一位对应一个功能,这样的话,权限分配会相对于比较灵活。其实,一开始也是把角色写死,给固定的权限串,我的毕业设计师做一个BS项目,是一个ASP.NET的网站。所以根据字符串动态生成页面,只不过每个角色对应的权限字符串是固定的。然而这只是一个开头,由于需求一直在变化,我天天改权限字符串,我感觉很烦,就开始考虑,能不能动态修改权限字符串(当然了,增加一个功能模块,肯定要改的,因为字符串要加一位)。
经过一番思考,我把角色放在数据库中,建立一个角色表,Role(流水号,角色名,角色权限串)。同时又建立一个权限串表。PermissionsString(字符位置,aspx地址,功能描述)。根据这俩张表,当一个用户登录的时候,获取对应的权限串,再拆分权限串,获取每一位权限对应的功能,跟生成一个string字符串,动态加载页面。其中字符串“01010111...”这种形式,0,代表没有这个功能;1,代表有这个功能。所以1,就会获得权限串表中对应的aspx地址,0的话,就跳过。
上面是动态生成首页,根据权限串,分别获得不同的链接。而修改角色的权限,可以使用checkbox,获取一个角色对应的权限串,动态生成页面,然后,打钩就获取该功能。下面是以前动态生成角色权限管理的代码,减少了很多,主要还是想说的是,可以动态修改权限。
public string getPrivilege1()
{
BLL.SystemManageBLL bll = new BLL.SystemManageBLL();
//获取全部权限列表
List<Privilege> listPrivilege = new List<Privilege>();
listPrivilege = bll.getlistPrivilege();
char[] arrPrivilege = this.arrPrivilege(); //获取权限字符数组
StringBuilder strArrange = new StringBuilder();
strArrange.Append("<ul style=\"display:none;\">");
for (int i = 0; i < listPrivilege.Count(); i++)//遍历所有用户列表
{
strArrange.Append("<li><input type=\"checkbox\" id=" + listPrivilegeID[j].ID.ToString() +" onclick=\"SelectNodes(this)\"/><label for=" + listPrivilegeID[j].ID.ToString() + ">" + listPrivilegeID[j].PermissionName + "</label> ");
strArrange.Append("</li>");
}
strArrange.Append("</ul>");
return strArrange.ToString();
}
// <summary>
/// 获得用户权限串分解的字符串数组
/// </summary>
/// <returns></returns>
public char[] arrPrivilege()
{
string existPrivilege = strPrivilege();
if (existPrivilege != ""&&existPrivilege!=null)
{
char[] arrPrivilege = existPrivilege.ToCharArray();
return arrPrivilege;
}
else
{
return null;
}
}
如果要新增加一个角色,就可以动态的为这个新增的角色选择功能。
而上面的是我当时做毕业设计时,总结的,后来我看了状态模式,我又重新构思了一下,发现可以去掉权限串表(PermissionsString),只留下一个角色表(Role)。而结合状态模式。把每一个子字符看成一个状态,其中字符内容(0,1)和字符位置(int)是状态的两个属性。如果增加功能模块,就可以增加一个状态。同时,权限字符串设长些,没有的预先设为”0“。
这些都是一些个人想法,如果大家觉得哪里不对,可以指出来,一起讨论。
- 权限设计——状态模式
- 设计模式—状态模式
- 设计模式—状态模式
- 设计模式——状态设计模式
- 设计模式——状态模式(State)
- 设计模式——状态模式
- java设计模式——状态模式
- PHP设计模式——状态模式
- 设计模式之——状态模式
- 设计模式之——状态模式
- 设计模式(19)——状态模式
- 设计模式——状态模式
- C++设计模式——状态模式
- 设计模式——状态模式
- 设计模式——状态模式
- 设计模式——状态模式
- 设计模式——状态模式
- 设计模式<五>——状态模式
- 【让这些电影给你“治病”】
- 供应链流程图
- CEdit控件中实现复制、粘贴、剪切等操作的快捷键
- 删除array元素
- vb调用vc的dll
- 权限设计——状态模式
- DNF 单机游戏 手机游戏 网络游戏 推荐游戏 TXT 小说 外挂 辅助
- 汉诺塔问题的递归求解
- 链接
- JS判断RadioButtonList是否选中
- UIPageControl实现自定义按钮
- Android与中国相互依赖,尽管目前市场很混乱
- SmartUpload综合
- 回答一位同学的问题