【分布式系统框架教程】-如何给角色分配权限、删除权限
导读部分
这一篇,来介绍如何给角色分配权限,首先需要说明的是,角色和权限的对应关系是存放在了一张表里,这张表存放了角色id、权限id,我们之前说过,角色和权限是一种多对多的关系,所以判断是否重复的情况是需要联合角色id和权限id的。 首先了我们看下图:
来看下链接地址:RoleFunction.aspx?roleId=5,就是传递了一个角色roleId到分配权限这个页面:
我们看到这个页面将所有的权限都显示出来了,每个名称对应的添加、修改、删除等权限都很清晰的显示出来了,而且每个权限前面都有一个复选框,当我们点击这个复选框被选中的情况下,点击提交按钮,就给对应的角色分配了相应的权限。在页面初始化的时候需要做两件事情:
1.先查找出所有父级权限的集合列表。
2.通过传递过来的roleId从角色权限关系表里来查找所有该角色原有的权限列表。
首先我们查找所有的父级权限是为了显示权限时的遍历,而获取所有该角色的原有的权限列表是为了知道这个角色原本就有了那些权限,这样在遍历的时候我们就可以判断,如果这个角色拥有这个权限,那么该权限前面的复选框就是选中状态,否则就是未选中状态的,因为判断是否拥有该权限,就是将权限id进行匹对判断,所以在后台代码中可以先将该角色拥有的权限集合处理一下,变成一个存放该角色所有的权限id对应的list<int>的集合。
[C#] 纯文本查看 复制代码 if (!string.IsNullOrWhiteSpace(Request["roleId"]))
{
string str = Request["roleId"];
int roleid = 0;
if (!int.TryParse(str, out roleid))
{
return;
}
//获取角色所拥有的所有权限list
List<RoleFunctionInfo> rflist = rfbll.FindListByRoleId(roleid);
//获取角色所拥有的权限id list<int>
funids = rflist.Select(rf => rf.FunctionID).ToList();
}
//获取所有父级权限list
funclist = fucbll.FindTopFuncList(pgindex, pageSize, out totalcounts);
好了,下面来看下前端是如何循环的:
[HTML] 纯文本查看 复制代码 <table width="100%" border="0" id="listShow" cellpadding="4" cellspacing="1" bgcolor="#464646"
class="newfont03">
<tr bgcolor="#EEEEEE">
<td width="5%" height="30">ID</td>
<td width="5%">名称</td>
<td width="5%">功能</td>
</tr>
<% if (funclist.Any())
{
//首先在循环父级权限列表时获取所有的权限列表 供以下循环时调用 避免重复访问数据库
var funcalllist = fucbll.FindALL();
foreach (var f in funclist)
{
%>
<tr bgcolor="#FFFFFF">
<td height="30"><%=f.ID%></td>
<td><%=f.FunctionName%></td>
<td width="5%">
<ul>
<%
//每次循环只是在内存中进行linq查询 减少了多次请求数据库
var list = funcalllist.Where(func => func.ParentId == f.ID);
if (list.Any())
{
foreach (var s in list)
{
//判断角色是否拥有该权限、拥有则checked 否则no checked
if (funids.Contains(s.ID))
{
%>
<li><input type="checkbox" checked="checked" name="cked" value="<%=s.ID %>"/><%=s.FunctionName%></li>
<%}
else
{ %>
<li><input type="checkbox" name="ck" value="<%=s.ID %>"/><%=s.FunctionName%></li>
<%}
}
} %>
</ul>
</td>
</td>
</tr>
<%}
}%>
</table>
</td>
</tr>
<tr><td colspan="3" align="center">
<asp:Button ID="btnOK" runat="server" Text="提交" /></td></tr>
</table>
上面就是关于显示的,传递过来的roleId有该权限,那么该权限就checked,否则就不checked,下面我们就来研究一下如何添加和修改以及删除权限。
这里呢,通过上面的代码大家应该发现了一个问题,就是被选中的权限复选框和没有选中的复选框的name是不一样的,这是为什么呢,因为后台是需要通过这个来判断是否删除和添加该权限,我的思路是这样的,下面给大家分享一下我的后台提交事件的逻辑:
1.首先获取页面加载未被选中的也就是name=“ck”的复选框被选中的ids列表,通过Request["ck"]来获取过来提交时被选中的ids,ids的是1,2,3这种格式的,我们可以转换一下成数组之类的,然后进行循环,依次进行插入到角色权限关系表里,当然在插入时需要通过roleId和FuncId来判断是否重复,重复就不插入,不重复就插入。
2.最后就是删除权限了,可以通过Request["cked"]来获取所有页面加载时就被选中的ids列表,获取过来之后和funids(页面加载时从角色权限关系表里提取的放在内存里的该角色所拥有的所有权限id集合)进行判断,如果Request["cked"]过来的权限id不在funids中的就提取出来进行删除即可。
关于这段的代码就不贴了,大家可以自己看例子,再结合教程就很清晰了。
|