ASP.NET网上鲜花销售系统的设计

 

本系统实现了一般电子商务所具备的功能,如商品浏览、用户登录注册、网上与购物、结算、后台数据库管理等,利用这些功能可以对鲜花销售信息进行较好的管理。

网上鲜花销售系统的使用者主要是客户和销售管理者,对于客户来说,实现的功能包括客户浏览鲜花(搜索查询),存放选中的商品的购物车,最后产生订单;对于销售管理者来说,需要对客户的信息,鲜花的信息,以及销售的信息进行管理。

关键词购物车;鲜花管理;销售管理;客户管理;搜索查询

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">

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

测试开发之Python自动化 Pytest 之 fixture

Pytest 之 fixture unittest 和 nose 都支持 fixture 的,但是 fixture 在 pytest 里使用更灵活。也算是 pytest 的一个闪光点吧可以理解为一个跟 setup 和 teardown 这种前后置类似的东西。但是比它们要强大、灵活很多 fixtur 当做参数传入 # -*- coding: utf-8 -*- import …

SSL证书 购买流程

在购买SSL证书之前&#xff0c;需要知道一点相关的知识&#xff0c;通常包括以下几个环节&#xff1a; 一、确定需求 1、根据需要保护的域名数量&#xff0c;在以下三类中选择合适的证书类型&#xff1a; 单域名证书&#xff0c;只对一个域名&#xff08;例如abc.com&#x…

设计软件有哪些?渲染软件篇(4),渲染100邀请码1a12

除了之前介绍的一些渲染软件&#xff0c;这次我们继续介绍。 1、渲染100(http://www.xuanran100.com/?ycode1a12) 渲染100是网渲平台&#xff0c;为设计师提供高性能的渲染服务。通过它设计师可以把本地渲染移到云端进行&#xff0c;速度快价格便宜&#xff0c;支持3dmax、v…

数据序列包分析

基于数据序列包分析各部分的内容及含义&#xff0c;可能会考大题 基于本例分析&#xff0c;每部分含义如下&#xff1a; 时间&#xff08;Time&#xff09;&#xff1a; 时间戳显示了数据包在网络中被捕获的具体时间。在本例中&#xff0c;如"0.000000"表示第一个数据…

视频批量剪辑指南:一键合并视频并添加背景音乐,高效便捷

在数字化时代&#xff0c;视频剪辑已经成为了一项常见且重要的技能。无论是制作家庭影片、工作展示还是社交媒体内容&#xff0c;掌握高效的视频剪辑技巧都能极大地提升我们的工作效率和创作质量。本文将为您介绍云炫AI智剪中高效的视频批量剪辑方法&#xff0c;让您能够一键合…

虚拟机ubuntu配置网络重启联网

前言 一段时间没用虚拟机&#xff0c;打开发现网络一直连接不上【如下图】 flags4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:c2:5b:60:75 txqueuelen 0 (Ethernet)原因 1.以为是网络适配器选…

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…

更专业的汽车软件研发工具链,怿星重磅发布新产品

怿星科技在2024北京国际车展同期举办主题为“创新引领未来——聚焦智能汽车软件新基建”的新产品发布会&#xff0c;重磅推出1款绝对优势产品和4套场景解决方案。同时举行了4场热点技术研讨&#xff1a;国产工具链的机遇与挑战、新架构下的的车载DDS应用探索及测试方案介绍、软…

Linux 安裝 rpm包

下载 地址&#xff1a;https://developer.aliyun.com/packageSearch 安装 rpm -ivh lsof-4.87-6.el7.x86_64.rpmlsof -Ki|awk {print $2}|sort|uniq -c|sort -nr|head lsof | wc -l

vue2中npm i报错gyp info it worked if it ends with ok

当我拿到一个老的vue2项目&#xff0c;怎么也起不起来&#xff0c;后来找到报错原因&#xff0c;如上图所示&#xff0c;可以看到报错的path是node-sass&#xff0c;那么就猜想应该是sass版本和node版本不匹配。 于是我查看了我的node版本是16 而sass版本是下图所示&#xff0c…

itextpdf 7生成pdf(主要是文字和表格,支持中文)

我们经常会遇到要导出pdf的需求,方式有很多种 今天的教程是采用itextpdf的方式生成pdf itextpdf是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档&#xff0c;而且可以将Html文件转化为PDF文件。 这里先展示一下效果图 首先在pom.xml中引入相关依赖 <dep…

在 Navicat 17 创建一个数据字典

即将于 5 月 13 日发布的 Navicat 17&#xff08;英文版&#xff09;添加了许多令人兴奋的新功能。其中之一就是数据字典工具。它使用一系列 GUI 指导你完成创建专业质量文档的过程&#xff0c;该文档为跨多个服务器平台的数据库中的每个数据元素提供描述。在今天的博客中&…

Kotlin基本特性

目录 函数 if when 循环 面向对象 继承 主构造函数 接口 修饰符 ​编辑数据类 单例类 Lambda编程 集合 lambda用法 常见函数式API 空指针 判空辅助工具 字符串内嵌表达式 函数 fun add1(a:Int,b:Int):Int{return ab }fun add2(a:Int,b:Int):Int ab // 只…

CVPR 2024|多模态场景感知,高保真运动预测框架来了!

设想一下&#xff0c;你在家中准备起身&#xff0c;前往橱柜取东西。一个集成 SIF3D 技术的智能家居系统&#xff0c;已经预测出你 的行动路线&#xff08;路线通畅&#xff0c;避开桌椅障碍物&#xff09;。当你接近橱柜时&#xff0c;系统已经理解了你的意图&#xff0c;柜门…

无限集中的最小数字

题目链接 无限集中的最小数字 题目描述 注意点 1 < num < 1000 解答思路 由题意得&#xff0c;可以理解为最初集合中有1~1000之间的所有数字&#xff0c;如果集合中存在数字&#xff0c;则添加时不会有任何操作&#xff1b;在移除集合中的元素时&#xff0c;会按顺序…

表格内容高效拆分,自定义行数随心所欲,让数据处理更高效!

在信息化社会的今天&#xff0c;表格成为了我们处理数据、整理信息的重要工具。然而&#xff0c;当表格内容过于庞大时&#xff0c;如何高效地拆分表格内容成为了摆在我们面前的一大难题。传统的拆分方法往往耗时耗力&#xff0c;且难以满足我们个性化的需求。 首先&#xff0…

视频号创作分成计划实战指南:保姆级教程,带你玩转新副业

视频号的月活跃用户数量已在去年突破了8亿大关&#xff0c;并且不断增长。 在这篇文章中&#xff0c;我将与大家分享视频号的运营玩法和作品创作方向。 一、玩法流程 开通条件 要开通创作者分成计划功能&#xff0c;需要满足以下条件&#xff1a; 粉丝数量达到100及以上。 …

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀&#xff08;暴⼒求解&#xff09;&#xff08;可能会超时&#xff09;&#xff1a; 算法思路&#xff1a; 算法代码&#xff1a; 4.解法⼆&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 以输入: nums …

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c;是一种匹配字符串的方法&#xff0c;通过一些特殊符号&#xff0c;实现快速查…