• 电子商务B2C网站购物车设计


    宝宝这月8号的预产期,结果到今天都没出来,估计是怕冷不想出来。。。
    为了陪产,把工作给辞了,离职已一月有余,难得的一段时间。
    坚持天天看看博客园,就像公务员天天喝茶,是种习惯了,或许又是怕自己离开社会太久,没技术了到时候找不着工作~
    很久没有更新自己的博客,怕再不写点什么就要生杂草了。
    原来就职于戴维尼珠宝网,代码基本上是自己码出来的,用的MVC2.0+SPARK视图引擎。
    我发现SPARK中文方面的文章就只有我自己写的那篇,国外用的人挺多,看stackoverflow上问相关问题的就挺多,是个很优秀的视图引擎
    不过在VS2010没有智能提示是个不爽的地方,说实话,我当时写也是拿VS2010当记事本来用的。。。

    闲话不多说,在本文中我想说的是在电子商务中购物车的设计与实现
    购物车是网站的咽喉之地,订单是白花花的银子,所有银子都必然流经购物车,购物车不能有失。
    优秀的购物车设计至少需要完成两项使命:一是方便用户多买货多掏银子;二是帮用户保管好待购的货品,方便下次接着掏银子。


    一般来说,可以使用session,cookie和数据库来记录购物车数据
    1,不过不提倡使用session,这货占用服务器资源,还有过期时间,客户关掉浏览器时session即消失,下次再上来,又得重新选产品。
    2,cookie这东西不错,放在客户端的,给个一年的过期时间,只要客户不清掉,每次来都能记得上次的购物车信息。大家可以看看京东,
    在购物车cookie中存了不少东西,有产品编码和购买的数量等信息,如京东:yCartOrderLogic={&TheSkus&:[{&Id&:437741$&Num&:2}]},
    原来凡客的cookie中也以JSON的形式存了很多信息。
    所以,我以学习的心态,将产品编码,价格,名称,类型和数量等购物信息做成一个对象,然后对象序列化成JSON,存在客户端的COOKIE中,
    在读取cookie时,在刚开始的时候很好用,反序列化cookie值成购物车条目对象就可以了,但是当产品类型多起来之后,而且有套装那种多件产品时,
    甚至产品不是来自同一个数据表时,比如普通首饰和钻石,表的结构都不一样了,还得到不同的表格中去取,当然首先你得判断产品类型
    这时候一个购物条目对象已经有多条子对象,往往一个查询中嵌套着两重以上的循环加上多个switch case,当购物车中有十个复杂的条目时,读取速度
    将超过十秒,不管怎么优化,速度就摆在那里,不快不慢。。。而且你不能保证客户不下100个或更多的复杂购物车记录,最重要的是cookie是有
    存储大小限制的,这种做法有产品很复杂时是不利的,果断放弃!
    3,数据库这东西好啊,不会像cookie那种容易丢失,也没有客户端的限制,你想怎么存,存多少都行。

    购物车数据存数据库好处有很多,可以分析购买行为,可以为客户保存购买信息(不会因为浏览器关闭而丢失)等。
    还需要考虑的一个问题是用户是否登录,淘宝使用的就是cookie记录,你可以试试,未登录时可以加20个商品,登录后可以加50个,这就是因为
    cookie客户端的限制。
    我这里因为产品线的复杂性,所有购物车条目都保存在数据库中。

    购物车数据库设计成两个关联表
    1,Basket,购物车主表
    基本字段有:BasketId,AddTime,UserId,AddressId,Payment,Status等,不解释了,看英文意思就行
    2,BasketDetail,购物车条目表
    基本字段有:BasketDetailId,BasketId,Type,Code,Qty,ParentId等,ParentId用作子行标识,其它不解释
    两个表之间使用BasketId做为关联
    当用户登录状态时,添加产品到购物时,查看Basket中是否有Status为True的购物车,没有则添加一条新的Basket记录,并将产品信息相关数据添加至BasketDetail表中
    当用户未登录时,使用cookie记录一个BasketId值,不往Basket表中插入数据,只往BasketDetail插入数据,其中的BasketId值使用cookie中的BasketId值,当用户登录
    后,查看Basket中是否有Status为True的购物车记录,有则合并(更新cookie和BasketDetail中的BasketId为查询出来的Basket表中的BasketId值),无则添加一条新的
    Basket记录,并将BasketId值置为Cookie中记录的basketid值

    购物车C#对象也设计两个(主要用于获取数据)
    1,BasketModel,大体如下:
    public class BasketModel:Basket
    {
    public decimal TotalPrice{get;set;}
    public int TotalMP{get;set;}
    public List<BasketDetailModel> BasketDetailModels{get;set;}
    }
    2,BasketDetailModel,大体如下:(这里的ViewBasketDetail是一个视图,上面BasketDetail设计中没有产品价格,用视图关联到相关的表,获取价格,为什么不设计价格字段,不解释。。。)
    public class BasketDetailModel
    {
    public ViewBasketDetail Detail{get;set;}
    public List<ViewBasketDetail> SubDetails{get;set;}
    }

    至此,基本上购物车的设计就完成了,剩下的就是编码了
    个人觉得这样的设计还是比较健壮的,很好的完成了购物车的两项使命,大家如果有更好的设计可以拿出来分享一下

    用以上设计思想,完成了以下两个网站的购物车设计
    www.520.cn (mvc2.0,spark,entity)
    www.tojik.cn (mvc3.0,razor,entity)
    最后说一句,还是razor好用啊,有智能提示!~

  • 相关阅读:
    centos yum安装报错could not resolve host: mirrorlist.centos.org
    feign拦截器和解码器
    git error:invalid path
    Codeforces Round #689 (Div. 2)
    RSA加解密,Java和C#互通
    C# WinForm遍历窗体控件的3种方法
    vs2019如何自动生成有下划线前缀的字段名?
    C# EF Core 后端代码已定义的用户实体,如何扩展字段?
    SQL Server 查询分析及优化方法
    SQL Server 新增函数大全(各版本)
  • 原文地址:https://www.cnblogs.com/bestfc/p/basket.html
Copyright © 2020-2023  润新知