v如果P层依赖Q层,则P的编号一定大于Q。
(2)开闭原则。
对扩展开放,对修改关闭。
具体到N层架构中,可以描述为:
当H-1层有了一个新的具体实现时,它应该可以在不修改H层的情况下,实现与H层的无缝链接,顺利交互。
(3)单一职责原则。
任何一个类都应该有单一的职责,属于单独的一层,而不能担负两种职责或数与多个层。
(4)接口平行原则。
某一个实体对应的接口组应该是平级且是平行的,而不应该跨越多个实体或多个级别。
(5)面向接口编程原则。
第H层不应该有H-1层的的类,而是依赖H-1层的接口。
(6)封装变化原则。
应用中需要变化的独立出来,不要和那些不需要变化的代码混杂在一起[11]。
2.1.2.NET分层结构
(1)表示层——位于最外层,离用户最近。
用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。
它对流入的数据的正确性和有效性负责,对呈现样式负责,对呈现友好的错误信息负责。
(2)业务逻辑层——处于数据访问层与表示层中间,在数据交换中起承上启下的作用。
对于数据访问层而言,它是调用者;对于表示层而言,它是被调用者。
依赖与被依赖的关系都在业务逻辑层上。
(3)数据访问层——有时候也称为持久化层,其功能主要负责数据库的访问,可也访问数据表的SELECT、INSERT、UPDATE和DELETE操作[12]。
2.1.3模块划分及交互设计
综合以上分析,可在宏观上将整个系统分为以下几个模块:
v实体类模块——一组实体类的集合,负责整个系统中数据的封装及传递。
v数据访问层接口族——一组接口的集合,表示数据访问层的接口。
v数据访问层模块——一组类的集合,完成数据访问层的具体功能,实现数据访问层接口族。
v业务逻辑层模块——一组类的集合,完成业务逻辑层的具体功能,实现业务逻辑层接口族。
v表示层模块——程序及可视元素的集合,负责完成表示层的具体功能。
辅助类模块——完成辅助性功能[13]。
各个模块的划分及交互性如图1所示:
(其中单向箭头表示实泛化,双向箭头表示依赖与调用。
)
图1模块划分及交互图
2.2数据库的设计
2.2.1数据库的概念设计
E-R图是一种对实体型、联系和属性进行表现的方法并且是描述现实世界的概念模型,即实体-关系图(Entity-RelationshipDiagram)[14]。
实体型(Entity):
—般属性一样的实体都有着共同的性质和特点,那么就能够以实体名或其属性名的集合对一类的实体进行刻画和抽象;如E-R图结构里,用矩形表示实体并将实体名写入矩形内部,像员工王某就属于实体。
属性(Attribute):
它是实体的某种特性,一般能够用许多属性来表示。
如E-R图结构里,以椭圆形来代表,使用直线把它与对等的实体相连,像员工的姓名、男女和年龄。
联系(Relationship):
联系对等于关系,用来表现实体内部和实体之间的关联性。
前者对应的是某个实体的属性的相互关系;后者对应的是各个实体集的相互关系。
如E-R图结构里以菱形来代表,其框内标注关系名称,并用直线与对应实体相连接,同时在线上注明关系的类型。
系统总E-R图描述的是整个系统中各个实体,及各个实体之间的联系,根据系统的需求,不只是实体有属性,而且联系也可以有属性。
实体之间不仅有一对一的情况,还有一对多和多对多的情况。
本系统总体E-R图如图2所示:
图2数据库总体E-R图
对于此图的解释是:
一个客户可以订购多种产品,一种产品可以被多个客户订购。
一个客户只能预测一个销售机会,一个销售机会只能被一个客户预测。
客户人员可以分析多种销售机会,一个销售机会可以被多个客户人员分析。
这三组都是不同实体之间的一对一或者多对多关系。
实体内部也有多对多的关系,比如客户群之间,一个客户可以与其他多个客户存在联系。
2.2.2数据库的物理设计
客户管理系统的数据库采用SQLServer2008来设计,根据所需要的数据建立了
六个数据表,分别是合同表、合同明细表、客户表、客户销售表、产品表和用户表,如表1-表6所示:
表1合同表
列名
数据类型
允许NULL值
备注:
Contract-id
int
False
主键(合同编号)
Custom-id
int
True
客户编号
Contract-state
int
True
合同状态
Contract-start
datetime
False
合同签署态
Contract-send
datetime
True
合同执行态
Contract-finishi
datetime
True
合同完成态
Contract-person
Nvarchar(20)
True
合同签署人
Contract-price
Decimal(18,2)
True
合同签署价
表2合同明细表
列名
数据类型
允许Null值
备注:
Contract-id
int
False
主键(合同编号)
Product-id
int
True
产品编号
Product-book
int
True
产品订购
Product-send
int
True
产品发货
Product-price
Decimal(19,2)
True
产品价格
表3客户销售表
列名
数据类型
允许Null值
备注:
ID
int
False
主键
Custom-id
int
True
客户编号
Product-id
int
True
产品编号
Product-sale
int
True
产品销售
Product-price
Decimal(19,2)
True
产品价格
Product-date
datetime
True
产品日期
表4客户表
列名
数据类型
允许Null值
备注:
Custom-id
int
False
主键(客户编号)
Custom-name
Nvarchar(20)
True
客户姓名
Custom-charge
Nvarchar(20)
True
客户负责人
Custom-introduce
Nvarchar(20)
True
客户简介
Custom-level
int
True
客户级别
表5产品表
列名
数据类型
允许Null值
备注:
Product-id
int
False
主键(产品编号)
Product-name
Nvarchar(50)
True
产品名称
Product-describe
Nvarchar(200)
True
产品描述
表6用户表
列名
数据类型
允许Null值
备注:
User-id
int
False
主键(用户编号)
User-Password
Nvarchar(50)
False
用户密码
User-name
Nvarchar(50)
False
用户姓名
User-Power
int
False
用户权限等级
第3章客户管理系统需求分析与功能设计
3.1客户信息管理
客户信息管理功能为最主要功能,用于管理客户各种信息。
注册账户所添加的所有用户均可使用。
该模块主要提供两方面功能:
客户基本信息管理、客户分类管理。
系统用途:
其中客户基本信息管理功能包括客户信息查询和客户基本维护。
客户信息查询是对客户基本信息及特定信息进行查询操作,找到相应的客户;客户基本维护是对客户信息添加、删除、修改。
客户分类管理功能是为了能够迅速找到想要的客户信息,那么就必须对每个客户进行分类,客户可分为以下类别:
普通客户、重要客户、合作伙伴、消失客户。
对于客户的级别不同可以享受不同的优惠与待遇,使老客户能够保留,促使新客户不断购买产品[15]。
在查询客户时,可以根据客户的各种分类快速查询;删除客户信息需要支持批操作;客户分布统计结果的展现应该直观明了,即需要以图形结构的实行表示结果。
如图3所示:
图3客户管理信息模块
3.2客户合同管理
与客户建立合作的终极目标是签订合同,所以合同管理也是客户管理系统中不可缺失的功能模块。
合同管理模块包括合同管理、开票信息管理、交付管理和回款管理。
如图4所示:
合同信息管理:
包括合同信息查询和信息维护,合同相关信息的增加、删除、更改、查询操作[16]。
开票信息管理:
对票的记录进行增、删、改、查操作;
交付信息管理:
包括交付计划信息和叫记录信息的管理;
回款信息管理:
包括回款计划信息和回款记录信息的管理。
图4客户合同管理模块
3.3客户销售统计
客户销售统计模块的作用是为了统计客户在一个月或者一年内在本公司消费况,包括销售额统计和销售产品统计,其目的就在于为公司反馈有价值的信息,进而为公司下一步进货做出预判,以使公司在下一阶段的损失降到最低。
此外,此模块还设有录入新客户销售情况模块从而使客户不断积累与更新。
客户销售统计包括月销售额统计和年销售额统计,此模块的还有销售产品记录、客户编号、产品编号、销售数量、销售单价等。
各个模块之间存在相互依赖关系,依赖关系如图5所示:
图5客户销售统计
3.4销售统计
作为第三方物流客户管理系统,销售统计模块处于极其重要地位,它是公司进行利益损失统计的模块,以及新老客户级别判定的标准,若某个客户销售商品在一年内达到公司所定的客户级别标准,那么此客户将会升级客户级别,享受公司更多的利益。
销售统计最大的好处是,利用统计销售额[17],判断那种商品更受客户欢迎,公司从而可以为下一步进货有侧重点,使公司获得的利益更大。
销售统计中,销售产品、客户、以及日销售统计、月销售统计和年销售统计模块之间的关系如图6所示:
图6销售统计
3.5其它模块简介
除了上面介绍的主要功能模块以外,客户管理系统还包括下面模块:
用户信息模块。
此模块包括用户号、用户名、密码和用户类型四个板块,其中用户类型又包括管理员、合同部、销售部、客户部四个类型。
管理员可以登录用户信息模块对其进行增加删除操作,其余三个则没有这样的权限。
其余的只能登录相应的模块进行操作,而不能登录用户信息模块。
产品信息模块:
有产品名称、产品编号和产品描述三个板块。
其功能主要是显示产品信息即产品名称和产品出产地。
此模块还可以对产品进行增加删除、编辑操作。
修改密码模块:
此模块就是对原有密码改变。
用户须输入用户名和原始密码才能进行新密码的操作[18]。
第4章客户管理系统的实现
4.1系统界面的实现
系统界面的实现即客户管理系统的登录界面、用户信息、客户信息、产品信息、客户销售统计、销售统计、合同管理和修改密码界面的实现,由于板块太多,下面只
列出登录界面和合同管理中合同添加页面的实现。
其中登录界面的实现如图7所示:
图7客户管理系统登录界面
实现其功能的相关代码如下所示:
protectedvoidImageBtn_login_Click(objectsender,ImageClickEventArgse)
{
YS.BLL.UsersUserLogin=newYS.BLL.Users();
stringpwdMd5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Tbx_pwd.Text.Trim(),"md5");
Stringstrsql="User_name='"+Tbx_name.Text.Trim()+"'andUser_Password='"+pwdMd5+"'";
Session["Login_UserID"]=int.Parse(UserLogin.GetValue("User_name='"+Tbx_name.Text.Trim()+"'","User_id").ToString());
if(UserLogin.Exists(strsql)==true)
{
Session["User_Power"]=UserLogin.GetList(strsql).Tables[0].Rows[0]["User_Power"].ToString();
if(Session["User_Power"].ToString()=="0")
{
Response.Redirect("users.aspx");
}
elseif(Session["User_Power"].ToString()=="1")
{
Response.Redirect("contract.aspx");
}
elseif(Session["User_Power"].ToString()=="2")
{
Response.Redirect("contract_stat.aspx");
}
else
{
Response.Redirect("customer.aspx");
}
}
else
{
Lbl_note.Text="登录失败,请检查输入!
";
}
}
添加新合同管理界面的实现如图8所示:
图8添加合同登录界面
实现其功能的相关代码如下:
publicpartialclassaddcontract:
System.Web.UI.Page
{
SqlConnectioncn;
doublex;
protectedvoidPage_Load(objectsender,EventArgse)
{
Stringstrconn=Convert.ToString(ConfigurationManager.ConnectionStrings
["SQLConnectionString"]);
SqlConnectioncn0=newSqlConnection(strconn);
if(!
IsPostBack)
{
cn0.Open();
stringmysql="select*fromcustomer";
SqlCommandcm0=newSqlCommand(mysql,cn0);
SqlDataReaderdr0=cm0.ExecuteReader();
while(dr0.Read())
{
Ddl_customer.Items.Add(newListItem(dr0["Custom_Name"].ToString(),
dr0["Custom_ID"].ToString()));
}
cn0.Close();
cn0.Open();
stringmysql1=