在RedGlove Permission中,功能模块配置是不可缺少的一部份,先让我们来了解一个模块中所需要的元素:
元素名称 |
说明 |
ID |
这个是必须,也是唯一的 |
Name |
显示在UI上的名称,不能为空 |
PID |
上级ID,可以进行多级处理,默认为0,0为*记录 |
Depth |
记录的层次深度,默认为0,0为*记录 |
Order |
排序,想控制显示顺序还是加上吧 |
Count |
统计子集的总数,可不要 |
Tag |
这个是权限认证的标识,可为空,如果存在则要唯一 |
URL |
WEB功能模块的地址, 可为空 |
FormName |
Win Form的名称,与URL作用是一样, 可为空 |
Disabled |
模块是否启用,默认为true |
IsMenu |
是否显示到菜单上,默认为true |
Description |
描述,可不要 |
建立这样的表结构,我们就可以配置出无级的功能模块管理,这样的表结构是单表设计,也可将它分离,就在网上的RedGlove Permission中一样,分类一个表,功能模块一个表,现在我们先用单表结构讲述吧,在下一个版本中,我准备将模块管理缩成单个表,现在我们看一下详细设计,模块分类的管理,在表中用到ID, Name, PID, Depth, Order, Count, Description就够了,其它的都是给模块用的,查询出来的时候,我们只要用递归就能很容易的将数据读出来,下面就是一段读取无级分类的代码
protected void bind()
{
RGP.BLL.Modules bll = new RGP.BLL. Modules ();
DataView dvList = new DataView(bll.GetModuleList("ModuleTag=’’").Tables[0]);
LoadModuleList("0", 0, dvList);
}
/// <summary>
/// 加载模块分类
/// </summary>
/// <param name="ModulePID">分类上级ID</param>
/// <param name="Depth">分类级别深度</param>
protected void LoadModuleList(string UG_TID, int Depth,DataView dvList)
{
dvList.RowFilter = "ModuleSuperiorID=" + UG_TID; //过滤父节点
foreach (DataRowView dv in dvList)
{
string depth = string.Empty;
for (int i = 0; i < Depth; i++)
{
depth = depth + "-";
}
ModuleList.Items.Add(new ListItem(depth + dv["ModuleName"].ToString(), dv["ModuleID"].ToString()));
//递归
LoadModuleList(dv["ModuleID"].ToString(), int.Parse(dv["ModuleDepth"].ToString()) + 1, dvList);
}
}
功能中使用的方法:
方法名 |
说明 |
CreateModuleType() |
创建模块分类 |
UpdateModuleType() |
修改模块分类 |
DeleteModuleType() |
删除模块分类 |
GetModuleTypeModel() |
获取一条分类的详细信息 |
GetModuleTypeList() |
获取模块分类列表 |
CreateModule() |
创建模块,创建的同时,也将加入权限 |
UpdateModule() |
修改模块 |
DeleteModule() |
删除模块 |
ModuleTagExists() |
判断模块标签是否已经存在 |
GetModuleModel() |
获取一条分类的详细信息 |
GetModuleList() |
获取模块列表 |
GetModules() |
获取分类和模块列表 |
其它方法 |
|
SetName() |
修改名称 |
SetDescription() |
修改描述 |
SetDisabled() |
设置是否启用功能模块 |
SetIsMenu() |
设置是否显示到菜单 |
GetModuleDepth() |
获取分类/模块的深度 |
GetModuleCount() |
获取分类下的子集 |
上面已经完成了模块的配置,但功能模块要参与权限管制,就得为这些模块添加相应的权限,下面我还得继续权限列表的设计。
元素名称 |
说明 |
ID |
这个是必须,也是唯一的 |
ModuleID |
对应模块的ID |
AuthorityTag |
权限标识,这个是对应权限标字典的数据,如浏览权限为RGP_BROWSE |
功能模块的权限采用竖向表设计,这样,可以添加多个权限,功能模块的权限管理中使用的方法如下:
方法名 |
说明 |
CreateAuthorityList() |
创建模块权限列表 |
UpdateAuthorityList() |
修改模块权限列表,修改的时候,必须判断传入的是新增还是取消权限,如果是取消,将删除模块对应该的权限,还有角色,用户拥有的该模块权限 |
DeleteAuthorityList() |
删除模块权限列表,删除模块对应该的权限,还有角色,用户拥有的该模块权限 |
GetAuthorityList() |
获取一条分类的详细信息 |