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

news2024/11/27 5:26:36

 

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

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

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

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.coloradmin.cn/o/1650667.html

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

相关文章

小米手机miui14 android chrome如何取消网页自动打开app

搜索媒体打开应用 选择你要阻止打开的app&#xff0c;以github为例 取消勾选打开支持的链接。 参考&#xff1a;https://www.reddit.com/r/chrome/s/JBsGkZDkRZ

期权怎么开户?

今天期权懂带你了解期权怎么开户&#xff1f;近年来&#xff0c;随着股市的持续低迷&#xff0c;市场交易痛点越发明显的氛围中&#xff0c;所以有人看到了双向交易的期权。 期权怎么开户&#xff1f; 1、首先是证券账户内的资金需要满足50万保留20个交易日&#xff1b; 2、其…

算法提高之树的最长路径

算法提高之树的最长路径 核心思想&#xff1a;树形dp 枚举路径的中间节点用f1[i] 表示i的子树到i的最长距离,f2[i]表示次长距离最终答案就是max(f1[i]f2[i]) #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N …

Python批量计算多张遥感影像的NDVI

本文介绍基于Python中的gdal模块&#xff0c;批量基于大量多波段遥感影像文件&#xff0c;计算其每1景图像各自的NDVI数值&#xff0c;并将多景结果依次保存为栅格文件的方法。 如下图所示&#xff0c;现在有大量.tif格式的遥感影像文件&#xff0c;其中均含有红光波段与近红外…

便捷的驾驶证识别API,简化工作流程

随着社会的发展和人们生活水平的提高&#xff0c;机动车的数量也越来越多。为了确保交通安全和减少违法行为&#xff0c;每个驾驶机动车的人都需要携带驾驶证。然而&#xff0c;识别驾驶证上的信息却是一个繁琐的过程。为了简化这个工作流程&#xff0c;提高工作效率&#xff0…

echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source391a8dc379e0da60c77490e3221f097a 课程源码 国内echarts镜像站&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 echarts图表集&…

栈(使用顺序表构建)

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、栈的概念2、栈的数组构建方法2.1 前言2.2 正文2.2.1 栈的初始化2.2.2 栈的销毁2.2.3 压…

Leetcode—289. 生命游戏【中等】

2024每日刷题&#xff08;126&#xff09; Leetcode—289. 生命游戏 算法思想 实现代码 class Solution { public:void gameOfLife(vector<vector<int>>& board) {int rows board.size();int cols board[0].size();int neighbors[3] {0, 1, -1};vector<…

微搭低代码入门06分页查询

目录 1 创建自定义代码2 编写分页代码3 创建页面4 创建变量5 配置数据列表总结 我们在数据模型章节介绍了微搭后端服务编写的三种方式&#xff0c;包括Http请求、自定义代码、云函数。本篇我们详细讲解一下利用自定义代码开发分页查询的功能。 1 创建自定义代码 打开控制台&am…

Python 全栈体系【四阶】(四十一)

第五章 深度学习 九、图像分割 1. 基本介绍 1.1 什么是图像分割 图像分割&#xff08;Segmentation&#xff09;是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&a…

微软“叛变”了!本月或将推出5000亿新AI模型MAI-1,对抗谷歌和OpenAI | 最新快讯

&#xff08;图片来源&#xff1a;钛媒体 App 编辑拍摄&#xff09; 钛媒体 App 5 月 6 日消息&#xff0c;据 The information 报道&#xff0c;美国科技巨头微软公司&#xff08;Microsoft&#xff09;将推出一款参数达 5000 亿的全新 AI 模型产品&#xff0c;内部称为 MAI-1…

【LAMMPS学习】八、基础知识(5.9)LAMMPS 近场动力学

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

『 Linux 』基础IO/文件IO (万字)

文章目录 &#x1f984; 什么是IO&#x1f984; 文件IO(库级别)&#x1f47e; 文件的打开与关闭&#x1f47e; 当前路径&#x1f47e; 文件的读写 &#x1f984; 标准输入输出流&#x1f984; 文件IO(系统级别)&#x1f47e; 文件的打开&#x1f47e; 文件的关闭&#x1f47e; …

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …

latex参考文献引用网址,不显示网址问题

以引用UCI数据集为例 1、加入宏包 \usepackage{url} 2、在参考文献bib文件中加入网址文献 misc{UCI, author {{D. Dua, E. Karra Taniskidou}}, year {2024}, title {UCI Machine Learning Repository}, howpublished {\url{http://archive.ics.uci.edu/ml}} } 完成&#x…

C++细节,可能存在的隐患,面试题03

文章目录 11. C编译过程12. const vs #define12.1. 全局const vs 局部const 13. C内存分区14. C变量作用域14.1. 常量 vs 全局变量 vs 静态变量 15. C类型转换16. 函数指针17. 悬空指针 vs 野指针18. 为什么使用空指针&#xff0c;建议使用nullptr而不是NULL&#xff1f; 11. C…

CLion 写 Rust 报Project directory `/Users/.../rsheets` does not exist.

每次打开CLion都会看到像下面这样的报错&#xff0c;Project directory /Users/.../rsheets does not exist.&#xff0c;虽然不会影响你写代码&#xff0c;但每次看到还是不舒服&#xff0c;所以研究一下怎么解决。 原因是这样的&#xff0c;每当我们创建一个 Cargo 项目&…

CRC校验原理及步骤

文章目录 CRC定义&#xff1a;CRC校验原理&#xff1a;CRC校验步骤&#xff1a; CRC定义&#xff1a; CRC即循环冗余校验码&#xff0c;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#…

VMware与CentOS的安装

VMware与CentOS的安装 第一章 VMware安装第二章 CentOS上网虚拟机网络IP修改地址配置修改主机名和hosts文件修改主机名称配置Linux克隆机主机名称映射hosts文件&#xff0c;打开/etc/hosts 安装Xshell7和Xftp7 第一章 VMware安装 VMware Workstation Pro 安装包 …