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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

欧式聚类提取-------PCL

欧式聚类 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> PclTool::euclideanClustering(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud) {std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clustered_clouds;// 下采样pcl::Vox…

基于FPGA的DDS波形发生器VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的DDS波形发生器VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; DDS波形发生器VHDL 1、可以输出正弦波、方波、三角波 2、可以控制输出波形的频率 DDS波形发生器原理…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…

无人零售,重塑购物新纪元

在这个快节奏的时代&#xff0c;科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今&#xff0c;无人零售正以雷霆之势&#xff0c;颠覆传统购物模式&#xff0c;为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗&#xff1f;跟随我&a…

Linux实现Flappy bird项目

目录 1、项目介绍 2、功能总结 3、前期准备 3.1 Ncurses库 3.2 信号机制 3.2.1 设置信号响应方式 3.2.2 设置定时器 4、代码实现 4.1 头文件引用及变量、函数定义 4.2 主函数 4.3 curses初始化 4.4 设置定时器 4.5 定时器响应函数 4.6 小鸟控制相关函数 4…

Java的Fork-Join简单介绍

Java的Fork-Join框架是Java 7引入的一个用于并行处理的轻量级框架&#xff0c;它基于分治策略&#xff08;Divide and Conquer&#xff09;&#xff0c;特别适合于那些可以被分解为多个子任务的任务。Fork-Join框架的核心思想是将一个大任务&#xff08;Task&#xff09;拆分成…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot&#xff0b;vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

高等数学笔记(下中)

曲线积分 第一类曲线积分&#xff1a;对弧长的积分计算方法 定理&#xff1a;设 f ( x , y ) f(x,y) f(x,y)在曲线弧 L L L上有定义且连续&#xff0c; L L L的参数方程是 { x φ ( t ) y ψ ( t ) ( α ≤ t ≤ β ) \begin{cases} x\varphi(t)\\ y\psi(t) \end{cases}(\a…

Python实现打砖块游戏

提供学习或者毕业设计使用&#xff0c;功能基本都有&#xff0c;不能和市场上正式游戏相提比论&#xff0c;请理性对待&#xff01; 在本文中&#xff0c;我们将使用 Pygame 和 Tkinter 创建一个简单的打砖块游戏。游戏的目标是通过控制挡板来击碎屏幕上的砖块&#xff0c;同时…

PTQ4SAM、Mamba-Attention、AniTalker、IceFormer、U-DiTs、CogDPM

本文首发于公众号&#xff1a;机器感知 PTQ4SAM、Mamba-Attention、AniTalker、IceFormer、U-DiTs、CogDPM PTQ4SAM: Post-Training Quantization for Segment Anything Segment Anything Model (SAM) has achieved impressive performance in many computer vision tasks. Ho…

华为机考入门python3--(23)牛客23- 删除字符串中出现次数最少的字符

分类&#xff1a;字符串 知识点&#xff1a; 访问字典中keychar的值&#xff0c;不存在则返回0 my_dict.get(char, 0) 字典的所有值 my_dict.value() 列表中的最小值 min(my_list) 题目来自【牛客】 import sysdef delete_min_freq_char(s):# 计算字母出现的频次…

套管外径测量仪 多尺寸型号 规格全可定制

套管&#xff08;bushing&#xff09;是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管&#xff0c;后者称为穿墙套管。套管通常用在建筑地下室&#xff0c;是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

鸿蒙OpenHarmony实战开发-MiniCanvas

介绍 基于OpenHarmony的Cavas组件封装了一版极简操作的MiniCanvas&#xff0c;屏蔽了原有Canvas内部复杂的调用流程&#xff0c;支持一个API就可以实现相应的绘制能力&#xff0c;该库还在继续完善中&#xff0c;也欢迎PR。 使用说明 1.添加MiniCanvas依赖 在项目entry目录…

07 - 步骤 javaScript代码

简介 JavaScript 代码是通过 JavaScript 脚本步骤来执行 JavaScript 脚本的一种方式。这允许用户在 Kettle 的数据流程中使用 JavaScript 编写自定义的脚本逻辑&#xff0c;用于数据处理、转换、计算等操作。 使用 场景 我需要在数据流加一个字段 createTime 当前时间&…

【嵌入式DIY实例】-基于GSM的远程灌溉系统

基于GSM的远程灌溉系统 文章目录 基于GSM的远程灌溉系统1、硬件准备与接线2、软件准备3、代码实现本文将详细介绍如何搭建通过使用手机实现对灌溉系统的远程控制。该系统利用全球移动通信系统(GSM)技术在灌溉系统和移动电话之间建立通信。该系统建立在流行的开源微控制器平台…

Linux 进程间通信之共享内存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; ​ 目录 ​编辑​ 前言 共享内存直接原理…

使用双指针解决问题题集(二)

1. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 题解&a…

zabbix监控方式(zabbix-trapper)

中文&#xff1a;zabbix采集器&#xff0c;即zabbix sender 。 Zabbix-Trapper 监控方式可以一次批量发送数据给Zabbix Server&#xff0c;与主动模式不同&#xff0c;Zabbix-Trapper 可以让用户控制数据的发送&#xff0c;而不用Zabbix-Agent进程控制&#xff0c;这意味着可以…

Angular中的管道(Pipe)

Angular中的管道(Pipe) 文章目录 Angular中的管道(Pipe)前言一、内置管道1. date管道格式化日期2. currency管道格式化货币3. uppercase和lowercase管道转换字符串大小写4. 小数位数5. JavaScript 对象序列化6. slice7. 管道链 二、自定义管道 前言 Angular中的管道&#xff0…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法&#xff0c;通过边界索引确定中间索引&#xff0c;判断中间索引处的元素值和目标值的大小&#xff0c;来不断缩小查找区间。使用二分查找有如下一些限制&#…