【分布式系统框架教程】-如何给用户分配角色、删除角色
导读部分
前面我们已经介绍了权限、角色的增删改查和如何给角色分配权限、删除权限等功能,下面就该介绍如何给用户分配角色、删除角色了。和角色权限一样,用户和角色的关系也是用一张表来保存数据的,用户和角色也属于多对多的关系,这张表的字段就2个,和角色权限关系表一样都很简单,用户角色关系表的2个字段:用户id,角色id。
其实给用户分配角色和删除角色和给角色分配权限、删除权限是类似的逻辑,如果大家对上一篇理解的比较透彻的话,这一篇也就比较好理解了。
看下链接url:UserRole.aspx?userId=f1f7a32808594222996a5c977dfeba5b,就是给分配角色的页面传递了一个用户id,对了,本次将第一版的用户id换成了现有的guid生成的string类型了,这个主要是便于以后更新和扩展等。
下面是给用户分配角色的页面效果:
相对于分配权限来说,分配角色在显示是比较简单的,只需要将所有的角色列表提取出来,在前端通过foreach给循环出来即可,下面是初始化分配角色页面得三个点:
1.首先提取所有的角色列表
2.通过传递过来的userId到用户角色关系表里将该用户原来有的角色列表提取出来。
3.循环所有的角色列表时,将该用户的角色列表进行比对,如果用户拥有该角色,则角色前面的复选框checked,否则不checked。
下面我直接贴前端代码了,后台关于提取所有的角色列表和通过userId从用户角色关系表提取的该用户的所有角色ids就不贴了,大家知道是这个意思就行了:
[HTML] 纯文本查看 复制代码 <table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="20">
</td>
</tr>
<tr>
<td height="40" class="font42">
<table width="100%" border="0" id="listShow" cellpadding="4" cellspacing="1" bgcolor="#464646"
class="newfont03">
<tr bgcolor="#EEEEEE">
<td width="5%">用户名称</td>
<td width="5%">分配角色</td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="30"><%=userName%></td>
<td width="5%">
<ul>
<%
if (rlist.Any())
{
//循环所有的角色列表
foreach (var r in rlist)
{
//roleids即通过传递过来的userId查找其所具有的角色id的list<int>集合
if (roleids.Contains(r.ID))
{
%>
<li><input type="checkbox" name="cked" value="<%=r.ID %>" checked="checked"/><%=r.RoleName%></li>
<%}
else
{ %>
<li><input type="checkbox" name="ck" value="<%=r.ID %>"/><%=r.RoleName%></li>
<%
}
}
} %>
</ul>
</td>
</td>
</tr>
</table>
</td>
</tr>
<tr><td colspan="3" align="center">
<asp:Button ID="btnOK" runat="server" Text="提交" /></td></tr>
</table>
好了,通过上面的代码,我们可以看到,提取的时候进行比对,如果包含的角色就用name=“cked”命名,不包含的角色就用name=“ck”命名,这样命名是为了在提交时便于区分是添加角色还是删除角色。提交时的逻辑如下:
1.首先获取页面加载未被选中的也就是name=“ck”的复选框被选中的ids列表,通过Request["ck"]来获取过来提交时被选中的ids,ids的是1,2,3这种格式的,我们可以转换一下成数组之类的,然后进行循环,依次进行插入到用户角色关系表里,当然在插入时需要通过roleId和userid来判断是否重复,重复就不插入,不重复就插入。
2.最后就是删除角色了,可以通过Request["cked"]来获取所有页面加载时就被选中的ids列表,获取过来之后和roleids(页面加载时从用户角色关系表里提取的放在内存里的该用户所拥有的所有角色id集合)进行判断,如果Request["cked"]过来的角色id不在roleids中的就提取出来进行删除即可。
关于这段的代码就不贴了,大家可以自己看例子,再结合教程就很清晰了。
|