简略的UML活动图如下:
数据库有:
登录日志信息表LogInfo
操作日志信息表sysOptLog
机构基本信息表mrBranch
部门基本信息表mrDepartment [机构比部门大一级,机构可以包括多个部门]
人员基本信息表mrBaseInf [也就是用户表]
模块基本信息表sysFuncDic
角色基本信息表sysRolesDic
用户角色关系表sysEmpRoles
模块角色关系表sysFuncRights
目录基本信息表sysTab
一个用户可以对应多个角色,而一个角色可以包含多个用户:一个角色可以包含多个模块,一个模块也可以对应多个角色.所以,他们全部都是多对多的关系,可以处理复杂的权限问题.
一.管理登录日志
对SQL操作全部使用存储过程.;对所有的页面全部继承基类PageBase.cs
1.通用类中用到一个比较常用的函数:(删除不可见字符函数)
public
static
string
DeleteUnVisibleChar(
string
sourceString)
{
System.Text.StringBuilder sBuilder = new System.Text.StringBuilder( 131 );
for ( int i = 0 ;i < sourceString.Length; i ++ )
{
int Unicode = sourceString[i];
if (Unicode >= 16 )
{
sBuilder.Append(sourceString[i].ToString());
}
}
return sBuilder.ToString();
}
{
System.Text.StringBuilder sBuilder = new System.Text.StringBuilder( 131 );
for ( int i = 0 ;i < sourceString.Length; i ++ )
{
int Unicode = sourceString[i];
if (Unicode >= 16 )
{
sBuilder.Append(sourceString[i].ToString());
}
}
return sBuilder.ToString();
}
2.自由操纵DataGrid.
可以使用一些技巧来自由操纵DataGrid:
(1)比如要在每行头部加入CheckBox,可以加入一个模板列,模板中放入一个CheckBox控件:
<
asp:TemplateColumn
>
< ItemTemplate >
< asp:CheckBox id = " CheckBox1 " runat = " server " ></ asp:CheckBox >
</ ItemTemplate >
</ asp:TemplateColumn >
其他的绑定列不要变,这样就会出现一个CheckBox,比如用于选中的多项删除操作.但是如何在程序中实现删除操作呢?首先将datagrid的DataKeyField关键字段设置为要删除所需的关键字段(比如用户ID),然后在删除处理时,通过对每行的第一列的第一个控件(即CheckBox,但没有ID,所以必须这样做)来判断:
< ItemTemplate >
< asp:CheckBox id = " CheckBox1 " runat = " server " ></ asp:CheckBox >
</ ItemTemplate >
</ asp:TemplateColumn >
foreach
(DataGridItem thisItem
in
DataGridLogininfo.Items)
{
if (((CheckBox)thisItem.Cells[ 0 ].Controls[ 1 ]).Checked) // 表示此一行的第一列中的第一个控件
{
string strLoginID = DataGridLogininfo.DataKeys[thisItem.ItemIndex].ToString(); // 设定DataGridLogininfo的DataKeyField为LoginID
DelLoginLog(strLoginID);
}
}
这样,"全部选中"的CheckBox2的代码也简单了:
{
if (((CheckBox)thisItem.Cells[ 0 ].Controls[ 1 ]).Checked) // 表示此一行的第一列中的第一个控件
{
string strLoginID = DataGridLogininfo.DataKeys[thisItem.ItemIndex].ToString(); // 设定DataGridLogininfo的DataKeyField为LoginID
DelLoginLog(strLoginID);
}
}
foreach
(DataGridItem thisItem
in
DataGridLogininfo.Items)
{
((CheckBox)thisItem.Cells[ 0 ].Controls[ 1 ]).Checked = CheckBox2.Checked;
}
{
((CheckBox)thisItem.Cells[ 0 ].Controls[ 1 ]).Checked = CheckBox2.Checked;
}
同样,我们可以扩展,比如为每条记录前面加个序号,如何加?
有两种方法:
第一种,和前面一样,加一个模板列,用一个页面全局变量的number++;
第二种,对绑定前得到的DataTable进行处理,加入一列:
DataTable mytable
=
myclass.Getalllogininfo ();
DataColumn mycolumn = mytable.Columns.Add ( " number " ,System.Type .GetType ( " System.String " )); // 在数据源DataTable中加入一列,注意技巧
for ( int i = 0 ;i < mytable.Rows.Count ;i ++ )
{
mytable.Rows [i][ " number " ] = (i + 1 ).ToString ();
}
这是一个很重要的方法,如果要对绑定数据实现复杂的操作,常常要用到这个原理.
DataColumn mycolumn = mytable.Columns.Add ( " number " ,System.Type .GetType ( " System.String " )); // 在数据源DataTable中加入一列,注意技巧
for ( int i = 0 ;i < mytable.Rows.Count ;i ++ )
{
mytable.Rows [i][ " number " ] = (i + 1 ).ToString ();
}
还有,如何加入比较复杂的功能,比如,鼠标到每一条记录上都变色呢?
这个可以通过DataGrid的ItemDataBound事件来处理,可以给每一项加上属性,方法如下:
//
绑定Javascript脚本到每行,是鼠标指向时颜色变化
private void DataGridLogininfo_ItemDataBound( object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
ListItemType itemType = e.Item.ItemType;
if (itemType == ListItemType.Item )
{
e.Item.Attributes[ " onmouseout " ] = " javascript:this.style.backgroundColor='#dedfde'; " ;
e.Item.Attributes[ " onmouseover " ] = " javascript:this.style.backgroundColor='#fff7ce';cursor='hand'; " ;
}
else if ( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes[ " onmouseout " ] = " javascript:this.style.backgroundColor='#ffffff'; " ;
e.Item.Attributes[ " onmouseover " ] = " javascript:this.style.backgroundColor='#fff7ce';cursor='hand'; " ;
}
}
private void DataGridLogininfo_ItemDataBound( object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
ListItemType itemType = e.Item.ItemType;
if (itemType == ListItemType.Item )
{
e.Item.Attributes[ " onmouseout " ] = " javascript:this.style.backgroundColor='#dedfde'; " ;
e.Item.Attributes[ " onmouseover " ] = " javascript:this.style.backgroundColor='#fff7ce';cursor='hand'; " ;
}
else if ( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes[ " onmouseout " ] = " javascript:this.style.backgroundColor='#ffffff'; " ;
e.Item.Attributes[ " onmouseover " ] = " javascript:this.style.backgroundColor='#fff7ce';cursor='hand'; " ;
}
}
二.管理操作日志
与上面一个没什么区别,同样要利用PageBase的PageBegin方法,这样可以确定所在的模块并检查权限,页面基类的好处已经体现出来了.
视图状态ViewState在ASP.NET里是默认存在的,在表单的发送之间几乎所有的ASP.NET控件都会保留属性值.它实际上就是一个隐藏的表单域,即HIDDEN的INPUT.
为服务器控件添加javascript脚本:
Button1.Attributes.Add(
"
onclick
"
,
"
javascript:alert('cool!'
"
);
三.模块管理
模块管理再次证明了一点:只有想不到,没有做不到的.
里面对于权限的DataList绑定CheckBoxList的复杂处理可谓精彩绝伦.
如果对于绑定到DataList等里面的控件操作,一般都要使用
(ControlType)DataList.Items[Index].FindControl("ControlName")来取得控件,然后进行处理.
对于命令按钮,都要设置CommandName,然后在DataList_ItemCommand里面通过判断来进行处理,所以CommandName不仅仅是可以用edit或delete,还可以多种多样,处理十分灵活.
由于类中的连接常常是局部变量,外部调用时不可能关闭,所以用
DataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
这样自动关闭连接比较实用.
四.目录管理
这里主要有一个知识点:如果编辑比较简单,可以直接用DataGrid的自有编辑方法:
这里,主要有dgCatalog_EditCommand,dgCatalog_DeleteCommand,dgCatalog_CancelCommand,dgCatalog_UpdateCommand这几个事件.同样,都是先取得DataKey关键字,然后进行处理;Update的时候,同样是取得(TextBox)Cells[0].Controls[1].Text这样的值,然后再运行存储过程等等更新.