程序框架的设计与实现
在开发电子商务系统的过程中,重复性的工作在所难免,然而像权限管理、程序
的模块的添加、可扩展性等方面的工作,可以通过一定的方法避免重复性的工作以提高工作
效率,正如Pittsburgh-based LogicLibrary公司的创办人Brent Carlson所说,可以通过人工实
现。
本文将首先介绍ASP.NET的基本技术和继承技术,然后在此基础上,给出电子商务系统中程序框架的一种具体方法。
继承的思想
为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块。C#这种完全面向对象的程序设计语言提供了两个重要的特性--继承性inheritance 和多态性polymorphism。本文主要涉及到继承性。
继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。为了更清楚地说明问题,举例如下:
using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void
{
ChildClass child = new ChildClass();
child.print();
}
}
输出结果如下:
Parent Constructor.
Child Constructor.
I'm a Parent Class.
在以上代码中,首先声明了一个基类:ParentClass,然后用public class ChildClass : ParentClass声明了它的一个子类,从输出结果可以看出:该子类并没有自己的print()方法,但它使用了ParentClass中的 print()方法,输出了:“I'm a Parent Class. ”,从而我们可以得到一个结论:如果我们在开发一个电子商务系统之前,首先设计一个基类,然后让所有的web窗体(实质上都是一个类)都从此类继承,那么我们要实现程序框架的整体统一将是一件非常有意义的是工作。
在以上理论的基础上,我们来设计并实现一个基于ASP.NET的电子商务系统的
程序架
程序框架的设计与实现
下面将从类的设计、数据库的设计等方面来具体阐述实现过程:
1、数据库中表的设计
首先,在数据库中设计用户表、角色表和功能模块表、用户角色关系表、角色功能模块关系表等五个表。
(1) 功能模块表
为了管理好用户的权限,首先要组织好系统的模块,为此设计了一个功能模块表。
字段名 |
类型 |
描述 |
默认值 |
ID |
Int |
唯一标识 |
|
PID |
Int |
父ID |
|
NAME |
nvarchar |
模块名称 |
|
DEL_FLAG |
bit |
删除标志 |
0 |
表:SYS_GROUP
(2) 角色表
为了增加权限控制的方便,在系统中加入了角色表。
字段 |
类型 |
描述 |
默认值 |
ID |
int |
唯一标识 |
|
NAME |
Nvarchar |
角色名称 |
|
DEL_FLAG |
Bit |
删除标志 |
0 |
表:SYS_ROLE
(3) 用户表
字段 |
类型 |
描述 |
默认值 |
ID |
Int |
唯一标识 |
|
NAME |
Nvarchar |
用户名 |
|
PASSWORD |
Nvarchar |
密码 |
|
DEL_FLAG |
Bit |
删除标志 |
0 |
表:SYS_USER
(4)用户与角色表关系表
为了提高系统的灵活性,用户与角色之间是多对多的关系。
字段 |
类型 |
描述 |
默认值 |
ID |
Int |
唯一标识 |
|
USER_ID |
Int |
用户ID |
|
ROLE_ID |
int |
角色ID |
|
表:SYS_USERROLE
(5) 角色与功能模块关系表
同样,本设计方案也支持角色与功能模块之间的多对多的关系,同时为了进一步细化权限,在此表中加入了权限级别属性。支持无限级权限,具体的设计需要设计前开发人员共同遵守共同的约定,例如(1:查看权限,2:添加权限,3:修改权限,4:删除权限……)。
字段 |
类型 |
描述 |
默认值 |
ID |
Int |
唯一标识 |
|
ROLE_ID |
Int |
角色ID |
|
GROUP_ID |
Int |
功能模块ID |
|
GROUP_JB |
Int |
模块权限级别 |
|
表:SYS_ROLEGROUP
2、以上五个标志间的关系可以用下面的视图表示:
运用此视图,修改得到另外一个表:
SELECT MAX(dbo.SYS_ROLEGROUP.GROUP_JB) AS jb, dbo.SYS_USER.ID AS ryid,
dbo.SYS_ROLEGROUP.GROUP_ID AS mkid
FROM dbo.SYS_USER INNER JOIN
dbo.SYS_USERROLE ON
dbo.SYS_USER.ID = dbo.SYS_USERROLE.USER_ID INNER JOIN
dbo.SYS_ROLE ON dbo.SYS_USERROLE.ROLE_ID = dbo.SYS_ROLE.ID INNER JOIN
dbo.SYS_ROLEGROUP ON
dbo.SYS_ROLE.ID = dbo.SYS_ROLEGROUP.ROLE_ID INNER JOIN
dbo.SYS_GROUPS ON
dbo.SYS_ROLEGROUP.GROUP_ID = dbo.SYS_GROUPS.ID
GROUP BY dbo.SYS_ROLEGROUP.GROUP_ID, dbo.SYS_USER.ID
字段 |
类别 |
描述 |
Ryid |
Int |
用户ID |
Mkid |
Int |
功能模块ID |
Jb |
Int |
功能模块最高级别 |
由此表可以看出,如果一个用户对某一个模块进行访问只需要知道这个用户的ID和功能模块ID就可以了。
2、设计所有WEB窗体(类)的基类BaseForm:
public class BaseForm: System.Web.UI.Page
{
public BaseForm()
{
}
public int QXJB;
public void InitialJB(int User_ID,int Group_ID)
{
int count;
string CnString="ConnectionString";
string Sql=@"select JB From (SELECT MAX(dbo.SYS_ROLEGROUP.GROUP_JB) AS jb, dbo.SYS_USER.ID AS ryid,
dbo.SYS_ROLEGROUP.GROUP_ID AS mkid
FROM dbo.SYS_USER INNER JOIN
dbo.SYS_USERROLE ON
dbo.SYS_USER.ID = dbo.SYS_USERROLE.USER_ID INNER JOIN
dbo.SYS_ROLE ON dbo.SYS_USERROLE.ROLE_ID = dbo.SYS_ROLE.ID INNER JOIN
dbo.SYS_ROLEGROUP ON
dbo.SYS_ROLE.ID = dbo.SYS_ROLEGROUP.ROLE_ID INNER JOIN
dbo.SYS_GROUPS ON
dbo.SYS_ROLEGROUP.GROUP_ID = dbo.SYS_GROUPS.ID
GROUP BY dbo.SYS_ROLEGROUP.GROUP_ID, dbo.SYS_USER.ID) where ryid='"+User_ID+"'and mkid='"+Group_ID+"'";
System.Data.DataSet DD=new DataSet();
DD=DS(CnString,Sql,"qxzb");
count=DD.Tables["qxzb"].Rows.Count;
if (count>0)
{
QXJB=int.Parse(DD.Tables["qxzb"].Rows[0]["jb"].ToString());
}
else
{
QXJB=0;
}
}
public System.Data.DataSet DS(string ConnectionString,string Sql,string TBName)
{
System.Data.SqlClient.SqlConnection Cn=new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ConnectionString]);
System.Data.SqlClient.SqlDataAdapter DA=new System.Data.SqlClient.SqlDataAdapter(Sql,Cn);
System.Data.DataSet DS=new System.Data.DataSet();
DA.Fill(DS,TBName);
return DS;
}
}
在窗体中的具体用法:
public class WebForm1 :BaseForm//继承基类
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.InitialJB(1000,1);
//this.QXJB;//此处就是以后程序开发的基点
}
}
由上所述,可以清楚地看出,在这个框架的基础上,只要知道用户和用户要访问的功能模块就可以判断用户能不能访问此模块、以及该用户在此模块的可访问权限级别,这样整体规划之后,以后的工作就是添加、完善电子商务系统的功能模块。