摘 要
本系统实现了一般电子商务所具备的功能,如商品浏览、用户登录注册、网上与购物、结算、后台数据库管理等,利用这些功能可以对鲜花销售信息进行较好的管理。
网上鲜花销售系统的使用者主要是客户和销售管理者,对于客户来说,实现的功能包括客户浏览鲜花(搜索查询),存放选中的商品的购物车,最后产生订单;对于销售管理者来说,需要对客户的信息,鲜花的信息,以及销售的信息进行管理。
关键词:购物车;鲜花管理;销售管理;客户管理;搜索查询
3系统需求分析与流程设计
3.1系统功能需求分析
网上鲜花销售系统的使用着主要是客户和销售管理者,对客户来说,实现的功能包括客户浏览鲜花,存放选中的商品的购物车,最后产生订单;对销售管理者来说,需要对客户的信息,鲜花的信息,以及销售的信息进行管理(如图2)。
前台客户功能可以概括为以下几点:
鲜花信息模块:包括鲜花信息的浏览,查询搜索等;
用户信息管理模块:处理用户注册、登录验证;
购物车模块:可以添加自己喜欢的鲜花;
订单模块:此模块中的信息由购物车结账产生,可以供客户查询订单状态,以及及时修改订单信息。
后台管理者功能可以概括为以下几点:
客户管理:可以查询、修改客户信息;
鲜花管理:可以添加、修改、删除鲜花信息;
销售管理:处理客户的订单,查询订单以及销售的情况;
5用户管理权限
管理员:在此系统中有且只有一个管理员,即系统管理员。他具有一般用户所没有的权限。他能够通过用户名(admin)密码(admin)进行登录,在管理栏中能够进行鲜花的增加与删除。
普通用户:主要是分为两种,一种之前已经注册过的用户,一种是一般的浏览网站的用户。已经注册过的用户可以浏览鲜花并且下单购买,然而一般的普通用户,只能浏览鲜花,他们只有在注册过后才能够下单购买鲜花。
6系统实现与分析
6.1购物车
购物车分为两种,一种是已经登录过的用户的购物车,在购物车编号中可以看到一个为具体数字的编号,购物车的ID等于用户ID另外一中是未登录过的用户的购物车,在购物车编号中可以看到一个字符串,该字符串保留在cookies,是利用System.GuidClass产生一个随机GUID(全局唯一标识符),回写到客户端指定的Cookie中,同时返回TempCartId作为购物车的编号。
注释:没有登录过的用户其购物车的编号是一个字符串,如图8,4906132b-567b-47f8-8be4-9a77cf697dcc,它是利用System.Guid.Class产生一个随机全局唯一标识符GUID。
图8 购物车1
注释:已登录过的用户其购物车编号为一个整型数字如图9。
主要代码如下:
public String GetShoppingCartID()
{
HttpContext Context = HttpContext.Current;
// 如果该用户已经通过验证后登录了系统,
那么以该用户的UserID作为购物车ID
if (Context.User.Identity.Name != "")
{
return Context.User.Identity.Name;
}
// 否则, 如果浏览器Cookie中已经分配给该用户一个购物车ID
if (Context.Request.Cookies["ShoppingCartID"] != null)
{
return Context.Request.Cookies["ShoppingCartID"].Value;
}
else
{
// 利用System.Guid Class产生一个随机GUID(全局唯一标识符)
Guid TempCartId = Guid.NewGuid();
// 回写到客户端指定的Cookie中
Context.Response.Cookies["ShoppingCartID"].Value = TempCartId.ToString();
// 同时返回TempCartId
return TempCartId.ToString();
}
}
注释:送货地址采用了一个必须输入验证,邮编和联系电话采用了一个必须输入验证和正则表达式验证。
主要代码如下:
1.送货地址(采用了必须输入验证)
RequiredFieldValidatorID="RequiredFieldValidator1"runat="server" ControlToValidate="tbAddress" ValidationGroup="SaveOrder" Display="Dynamic"
2.邮编(采用了必须输入验证和正则表达式验证)
RequiredFieldValidatorID="RequiredFieldValidator1"runat="server" ControlToValidate="tbAddress" ValidationGroup="SaveOrder" Display="Dynamic"
ValidationExpression="\d{6}" ValidationGroup="SaveOrder" Display="Dynamic"
3.联系电话(采用了必须输入验证和正则表达式验证)
RequiredFieldValidatorID="RequiredFieldValidator3"runat="server" ValidationGroup="SaveOrder"ControlToValidate="tbTelephone"Display="Dynamic"
ValidationExpression="\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
|\(0\d{3}\)[- ]?\d{7}|0\d{3}[- ]?\d{7}
|13\d{9}|159\d{8}”
注释:意思是以“(028)-”开头后面加8位数字或者是以“028-” 开头后面加8位数字,或者是以“(0???)-”开头后面加7位数字或者是以“0??? -”开头后面加7位数字的固定电话,再或者以“13”开头后面加9位的手机号码,或者是以“159” 开头后面加8位的手机号码。
6.2用户登录与注册
当已经注册过的用户输入其用户名以及密码单击登录按钮便可以登录,但如果为新用户,单击注册按钮,在下一个页面中输入信息后再单击注册按钮后便可成为注册用户。
用户登录主要实现过程:通过spUserLogin存储过程获得UserID,作为用户ID,在通过GetShoppingCartID()获得TempCartID,之后再调用一个存储过程spShoppingCartMigrate将购物车合并。用户注册的实现过程与用户登录的实现过程基本上一样。
主要代码如下:
if (Page.IsValid)
{
String ID = da.spUserLogin(tbUserName.Text.Trim(), tbPassword.Text.Trim());
if (ID != null)
{
String TempCartID = da.GetShoppingCartID();
// 将当前临时的购物车清单转换到登录用户名下
da.spShoppingCartMigrate(TempCartID, ID);
// 保存登录用户Cookies
Response.Cookies["ShoppingCartUser"].Value = tbUserName.Text.Trim();
// 重定向浏览器到目标页面
FormsAuthentication.RedirectFromLoginPage(ID, false);
}
else
{
da.Alert("用户名或密码错误!");
}
}
其中调用了两个存储过程:spUserLogin, spShoppingCartMigrate
CREATE PROCEDURE dbo.spUserLogin
(
@UserName CHAR(10),
@Password CHAR(10),
@UserID INT OUTPUT
)
AS
SELECT @UserID = UserID FROM Users
WHERE UserName = @UserName
AND Password = @Password
IF @@Rowcount < 1
SELECT @UserID = 0
GO
CREATE PROCEDURE dbo.spShoppingCartMigrate
(
@OldCartID VARCHAR(50),
@NewCartID VARCHAR(50)
)
AS
UPDATE ShoppingCart
SET CartID = @NewCartID WHERE CartID = @OldCartID
GO
用户注册的实现代码:
if (Page.IsValid)
{
//保存旧的购物车编号,以便注册后合并购物车
String TempCartID = da.GetShoppingCartID();
//添加用户信息到数据库
String UserID = da.AddUser(tbUserName.Value,tbPassword.Value,
tbAddress.Value, tbPostCode.Value, tbTelephone.Value);
if (UserID != "")
{
//将用户ID指定为通过安全登录的信息
FormsAuthentication.SetAuthCookie(UserID,false);
//合并购物车
da.spShoppingCartMigrate(TempCartID,UserID);
//将用户姓名保存到Cookies中
Response.Cookies["UserName"].Value = Server.HtmlEncode(tbUserName.Value.Trim());
//重定向到购物车界面
Response.Redirect("shopcart.aspx");
}
else
{
da.Alert("该用户名已被注册!");
}
}
调用了一个存储过程spShoppingCartMigrate.
CREATE PROCEDURE dbo.spShoppingCartMigrate
(
@OldCartID VARCHAR(50), @NewCartID VARCHAR(50)
)
AS
UPDATE ShoppingCart
SET CartID = @NewCartID WHERE CartID = @OldCartID
GO
在用户注册的时候需要输入电话号码,电话号码采用了一个正则表达式,只有输入正确的格式才能注册,否则将提示错误信息。
主要代码如下:
ValidationExpression="\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
|\(0\d{3}\)[- ]?\d{7}|0\d{3}[- ]?\d{7}
|13\d{9}|159\d{8}”
6.3注销
用户可以变化身份登录,主要采取的方法是用户注销,再重新以另外一种身份登录。
注销的实现过程:通过调用.NET的一个控件FormsAuthentication.SignOut()来完成。
主要代码如下:
protected void btnLogout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect("index.aspx");
}
6.4下订单
客户在购物车的页面中填完送货地址、邮编及电话后按保存按钮可以下订单,在管理页面中点击查看订单详情可以查看所下订单,如图10,11所示。
主要实现过程:1)获取当前用户的OrderID
2)利用ShoppingCart表和Flower表的内联接,将当前用户的当前购物车复制到当前所产生的订单详情中
3)利用OrderDetails 表和Flower表的内联接,扣除Flower表中的鲜花库存
4)调用另一存储过程spShoppingCartEmpty将购物车清空
图10 下订单
主要代码如下:
CREATE PROCEDURE dbo.spOrdersInsert
(
@UserID INT, @CartID NVARCHAR(50),
@Address VARCHAR(50), @PostCode CHAR(10),
@Telephone VARCHAR(50), @OrderID INT OUTPUT
)
AS
BEGIN TRAN OrdersInsert /* 产生订单 */
INSERT INTO Orders
(
UserID, Address, PostCode, Telephone, OrderDate
)
VALUES
(
@UserID, @Address, @PostCode, @Telephone
GETDATE()
)
-- 返回当前所产生的OrderID
SELECT @OrderID = @@Identity
/* 将当前用户的当前购物车复制到当前所产生的订单详情中*/
INSERT INTO OrderDetails
(
OrderID, FlowerID, Quantity
)
SELECT OrderID, ShoppingCart.FlowerID, Quantity
FROM ShoppingCart INNER JOIN
Flower ON ShoppingCart.FlowerID = Flower.FlowerID
WHERE CartID = @CartID
/*扣除相应的库存鲜花数量*/
UPDATE Flower
SET FlowerStock = FlowerStock - OrderDetails.Quantity
FROM OrderDetails INNER JOIN
Flower ON OrderDetails.FlowerID = Flower.FlowerID
WHERE OrderDetails.OrderID = @OrderID
/* 完成后, 调用另一存储过程spShoppingCartEmpty
清空当前购物车ID的所有明细*/
EXEC spShoppingCartEmpty @CartID
COMMIT TRAN OrdersInsert
GO
其中调用了一个存储过程spShoppingCartEmpty
主要代码如下:
CREATE Procedure spShoppingCartEmpty
(
@CartID nvarchar(50)
)
AS
DELETE FROM ShoppingCart
WHERE CartID = @CartID
GO
6.5撤消订单
客户可以在规定的时间内将自己所下的订单撤消,如图12。
主要实现过程:将Orders表中的Dispatched值设置为1,因为系统的默认为0,0表示未发货,1代表已发货,如果已经发了货,自然就相当于将订单删除。
图12 撤消订单
主要的代码如下:
public void spCancelOrder(int iUserID, int iOrderID)
{
ConnOpen();
SqlCommand1 = new SqlCommand("spCancelOrder", SqlConnection1);
SqlCommand1.CommandType = CommandType.StoredProcedure;
SqlParameter Param1 = new SqlParameter("@UserID", SqlDbType.Int, 4);
SqlParameter Param2 = new SqlParameter("@OrderID", SqlDbType.Int, 4);
SqlCommand1.Parameters.Add(Param1);
SqlCommand1.Parameters.Add(Param2);
Param1.Value = iUserID;
Param2.Value = iOrderID;
SqlCommand1.ExecuteNonQuery();
ConnClose();
}
其中调用了一个存储过程spCancelOrder
CREATE PROCEDURE dbo.spCancelOrder
(
@UserID INT, @OrderID INT
)
AS
UPDATE Orders SET Dispatched = 1
WHERE UserID = @UserID AND OrderID = @OrderID
GO
6.6鲜花管理
当为管理员登录的时候,会在页面的右方看见一个DetailsView的表,可以进行鲜花的添加、删除操作。如果不是管理员登录则不会显示该表,如图13。
主要实现过程:利用SQL语句中的DELETE、INSERT 、UPDATE方法分别实现鲜花的删除,新建,编辑功能。
图13 鲜花添加删除
主要代码如下:
try
{
int UserID = Convert.ToInt32(User.Identity.Name);
if (UserID == 1)
{
lblUserName.Text = "管理员";
DetailsView1.Visible = true;
}
string sSQL = "SELECT [UserID], [UserName], [IdealMoney] FROM [Users] WHERE ([UserID] = " + UserID + ")";
}
catch
{
Response.Redirect("error.aspx?info=请先登录或注册!");
}
}
SQL语句包含在页面上,主要代码如下:
DeleteCommand="DELETE FROM [Flower] WHERE [FlowerID] = @FlowerID"
InsertCommand="INSERT INTO [Flower] ([FlowerSerialNumber], [FlowerName], [FlowerStock], [FlowerPrice], [FlowerDescription], [FlowerImage]) VALUES (@FlowerSerialNumber, @FlowerName, @FlowerStock, @FlowerPrice, @FlowerDescription, @FlowerImage)"
SelectCommand="SELECT * FROM [Flower]"
UpdateCommand="UPDATE [Flower] SET [FlowerSerialNumber] = @FlowerSerialNumber, [FlowerName] = @FlowerName, [FlowerStock] = @FlowerStock, [FlowerPrice] = @FlowerPrice, [FlowerDescription] = @FlowerDescription, [FlowerImage] = @FlowerImage WHERE [FlowerID] = @FlowerID">