关闭

ASP.NET网站权限设计实现(二)——角色权限绑定

标签: asp.netaspserverpermissionstextboxfunction
3708人阅读 评论(5) 收藏 举报
分类:

 

上一篇:ASP.NET网站权限设计实现(一)——使用PowerDesigner进行数据库设计

 

1、关于使用的几张表的说明

(1)Module:模块表,记录模块名称、编码等模块基本数据。 
(2)Permissions:权限表,记录所有模块权限distinct之后的数据。

 

(3)ModulePermissions:模块权限,记录每个模块对应的权限,一个模块可能存在多条数据,每条表示该模块的一个操作权限。

 

(4)Roles:角色表,记录角色名称、编码等角色基本数据。

 

(5)RolePermissions:角色权限表,记录每个角色对应的权限,一个角色可能存在多条数据,每条数据表示该角色在某个模块的一个操作权限;表中的数据其实记录的是角色编码跟ModulePermissions表中的主键对应,表ModulePermissions中特定主键的数据行就表示了某个模块的一个操作权限。

 

(6)SUser:用户表,记录用户名等用户基本信息。

 

(7)UserRole:用户角色表,记录每个用户对应的角色,可以是多个,但本例只设置对应一个,只要用户具有了某个角色,那么该用户就具有了和角色一样的权限。

 

2、关于PowerDesigher :上一篇介绍了初次在数据库生成表的过程,实际上还可以实现更新和逆向操作(根据数据库中的表在PD中生成表模型)。

 

3、模拟数据

(1)表Module

 

(2)表Permissions 

 

(3)表ModulePermissions 

 

 

4、角色分页显示和删除

这里实现功能的代码基本都是最初级的代码,后面另一个版本会在架构、UI、代码等方面进行较大的改进;另外这里的代码纯粹是演示,不会考虑注入、异常等方面的处理。

 

(1)分页显示数据直接使用GridView了 

 

 

(2)在列表页面可以全选本页数据一次性删除,全选/全取消使用JQuery实现,选中时将值(这里是角色编码)保存在一个隐藏域中,隐藏域中的值的格式:'值1','值2',...(数据库中的RoleCode列的数据类型是nvarchar);取消选中时将隐藏域中的值清空;单行CheckBox选中/取消时,将当前行的值追加到隐藏域的值或从隐藏域的值中移除当前行的值 。删除时先判断隐藏域的值是否为空,如果为空提示”选中数据“,如果不为空提示”确定删除吗?“,确认删除后,根据隐藏域中的值构造delete语句(使用in子句)将数据删除。

 

 

 

(3)代码

Index.aspx

说明: 

$("#txtKeys") :JQuery得到ID为txtKeys的元素

$("#txtKeys").val() ;:获得ID为txtKeys的元素的值

$("#txtKeys").val("");:设置ID为txtKeys的元素的值,这里是空字符串

$(":checkbox").each(function () { });:遍历当前文档中CheckBox类型的元素,并在function中进行处理

$(this).attr("checked");:获得当前遍历到的CheckBox的checked属性的值

$(this).attr("checked", $("#cbAll").attr("checked"));:设置当前CheckBox的选中状态跟“全选”CheckBox一样,实际上就是通过这种方式给当前CheckBox的checked属性

注意所有CheckBox都有客户端onclick事件,触发时会调用不同JavaScript函数执行 

用到的Web服务器控件:TextBox 、Button、HiddenField、GridView、HyperLink、LinkButton

 

Index.aspx.cs 

 

说明:

SqlHelper:是数据访问类,包含一些方法提供对数据库的访问和操作 

ExecuteNonQueryWithTran:调用SqlCommand的ExecuteNonQuery方法执行insert、update、delete语句,添加了事务处理

 

5、角色新增和修改

(1)新建角色

 这儿的关键是绑定权限、全选或全取消及获取选中项的值、构造insert语句,先看一下页面运行后的结果 

 

(1.1)绑定权限 

使用两个GridView嵌套,最外面的(gvParent)显示顶级模块名称;嵌套在内的(gvChild)在gvParent的RowDataBound中进行数据绑定以显示二级模块名称(根据gvParent当前行的模块编码Moudle表中查询数据; 在gvChild的RowDataBound中绑定权限复选框列表,数据根据gvChild当前行的模块编码从下面视图(V_ModulePermissions)中查询,这里的复选框用的是<input type="checkbox" />,首先跟权限的数量构造CheckBox的html代码字符串,然后用Label显示出来,由于Label在客户端生成的代码中将变为所有这些CheckBox的父元素,所以也方便将来实现单模块的全选或者全取消,具体内容看后面代码。

视图V_ModulePermissions:

 

SQL:

SELECT     dbo.Permissions.PermissionName, dbo.ModulePermissions.ModuleCode, dbo.ModulePermissions.PermissionCode, dbo.ModulePermissions.ID
FROM         dbo.ModulePermissions INNER JOIN
                      dbo.Permissions ON dbo.ModulePermissions.PermissionCode = dbo.Permissions.PermissionCode INNER JOIN
                      dbo.Module ON dbo.ModulePermissions.ModuleCode = dbo.Module.ModuleCode
WHERE     (dbo.Module.ModuleVisible = 1) AND (dbo.Permissions.PermissionVisible = 1)

 

 (1.2)全选或全取消及获取选中项的值

每一个CheckBox的Click事件触发时都会调用一个JavaScript函数执行,这些函数不仅是完成选中或者取消选中,还要完成获得并追加或移除相应的CheckBox的值,最终构造的字符串是这种格式:,1,,2,,3,,4,...,并存储在隐藏域中。代码后面附上 。

 

(1.3)构造insert语句 

获取隐藏域的值进行字符串替换和拆分,遍历拆分出来的数据,构造insert语句,最后执行。 

 

(2)修改角色

 关键是设置当前角色已有权限项选中,先看页面结果

 

 

这里的处理是根据URL参数RoleCode的值从视图V_RolePermissions查询该角色的所有权限,然后构造一个字符串,在构造<input type="checkbox" />时判断该字符串是否包含此权限的标识,如果包含,就添加 checked属性。

 

SQL:

SELECT     dbo.V_ModulePermissions.ID, dbo.RolePermissions.RoleCode
FROM         dbo.V_ModulePermissions INNER JOIN
                      dbo.RolePermissions 
ON dbo.V_ModulePermissions.ID = dbo.RolePermissions.ModulePermissionID

 

(3)新建、修改全部代码

Edit.aspx

  

Edit.aspx.cs 

 

 

(4)操作成功后的提示及页面跳转

 

 

Redirect.html

使用setInterval函数倒计时 

获取传递过来的路径(传递的是相对路径),倒计时到0秒时,使用window.clearInterval(intervalId)清除setInterval事件,并指定window.location.href=路径,使得由当前页跳转到目的页

 

 

OK,到此全部完成,感觉说的太多了,所以有些内容没介绍,看代码吧。 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:90182次
    • 积分:1100
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:2篇
    • 评论:171条
    文章分类
    最新评论