8生鲜电商平台-购物车模块的设计与架构(代码片段)

lu-manman lu-manman     2023-01-27     116

关键词:

说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题,然后再进行下单与付款.

 

1. 购物车数据库设计:

 

技术分享图片

 

说明:业务需求:

         1》购物车里面应该存放,那个买家,买了那个菜品的什么规格,有多少数量,然后这个菜品的加工方式如何。(如果存在加工方式的话,就会在这里显示处理。)

          2》买家存在购物起送价。也就是用户放入购物车的商品的总价格如果低于配置的起送价,那么这个提交按钮就是灰色的。(不可能你点一个洋葱我们就送过去,成本太高。)

         

           系统设计:

       1. 购物车在买家APP上进行,这个时候是不需要跟后端API交互的,因为体验很差劲,用户在APP页面中不停的点击加菜以及菜的数量,如果根据后端进行交互,哪怕是每次请求是100ms,页面会存在很严重的抖动行为,速度快的话会出现卡顿,这个是不行的。

                         2.    在用户确定完成后,确认下单的时候,提交购物车,让后端可以存储用户购物车的数据。(确认下单过程)

                         3.    在用户去付款的时候,也就是提交了订单。这个时候再清理购物车。

 

相关后端代码如下:

                  

技术分享图片
/**
 * 购物车
 */
@RestController
@RequestMapping("/buyer/goodsCart")
public class GoodsCartController extends BaseController
    
private static final Logger logger = LoggerFactory.getLogger(GoodsCartController.class);
    
    @Autowired
    private GoodsCartService goodsCartService;
    
    @Autowired
    private GoodsFormatService goodsFormatService;

    
    /**
     * 生成购物车;
     * 1:先删除历史购物车;
     * 2:新增购物车数据;
     */
    @RequestMapping(value="/commitCart",method=RequestMethod.GET,RequestMethod.POST)
    public JsonResult commitCar(HttpServletRequest request, HttpServletResponse response,@RequestBody GoodsListVo goodsListVo) 
    
        try
        
            List<GoodsCart> list = goodsListVo.getList();
            
            if(null == goodsListVo.getUserId() || null == list)
                
                return new JsonResult(JsonResultCode.FAILURE, "请求参数异常", "");
            
            
            for (int i = 0; i < list.size(); i++) 
                
                if(null ==list.get(i).getBuyerId()  || null == list.get(i).getFormatId())
                    
                    return new JsonResult(JsonResultCode.FAILURE, "请求参数异常", "");
                
            
            
            int result = goodsCartService.commitCart(list,goodsListVo.getUserId());
            
            //更新购物车为空    则直接返回;
            if(list.size()<1)
                
                return new JsonResult(JsonResultCode.SUCCESS, "更新成功", new ArrayList<>());
            
            
            Long buyerId = list.get(0).getBuyerId();
            
            List<GoodsCartVo> goodsCartBuyers = goodsCartService.getGoodsCartBuyerId(buyerId);
            
            if (result == list.size()) 
            
                return new JsonResult(JsonResultCode.SUCCESS, "新增成功", goodsCartBuyers);
             
                return new JsonResult(JsonResultCode.SUCCESS, "有下架商品", goodsCartBuyers);
                
        catch(Exception e)
            
            logger.error("[GoodsCartController][commitCart]",e);
            
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        
    
    
    /**
     * 对单个数据进行修改 新增 删除;
     * @param request
     * @param response
     * @param goodsCart
     * @return
     */
    @RequestMapping(value="/updateCart",method=RequestMethod.GET,RequestMethod.POST)
    public JsonResult updateCart(HttpServletRequest request, HttpServletResponse response,@RequestBody GoodsCart goodsCart) 
    
        try
        
            
            BigDecimal goodsNumber=goodsCart.getGoodsNumber();
            
            Long formartId=goodsCart.getFormatId();
            
            BigDecimal count = goodsFormatService.getGoodsFormatById(formartId).getFormatPrice().multiply(goodsNumber);
            
            goodsCart.setCreateTime(new Date());
            
            int result = goodsCartService.updateGoodsCart(goodsCart);
            
            if (result > 0) 
            
                return new JsonResult(JsonResultCode.SUCCESS, "操作成功", count);
            
                return new JsonResult(JsonResultCode.FAILURE, "操作失败", count);
        catch(Exception e)
            
            logger.error("[GoodsCartController][updateCart]",e);
            
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        
    
    
    
    /**
     * 
     * @param request
     * @param response
     * @param goodsCart
     * @return
     */
    @RequestMapping(value="/insertCart",method=RequestMethod.GET,RequestMethod.POST)
    public JsonResult insertCart(HttpServletRequest request, HttpServletResponse response,@RequestBody GoodsCart goodsCart) 
    
        try
        
            BigDecimal goodsNumber=goodsCart.getGoodsNumber();
            
            Long formartId=goodsCart.getFormatId();
            
            BigDecimal count = goodsFormatService.getGoodsFormatById(formartId).getFormatPrice().multiply(goodsNumber);
            
            goodsCart.setCreateTime(new Date());
            
            int result = goodsCartService.insertGoodsCart(goodsCart);
            
            if (result > 0) 
            
                return new JsonResult(JsonResultCode.SUCCESS, "操作成功", count);
             
                return new JsonResult(JsonResultCode.FAILURE, "操作失败", count);
        catch(Exception e)
            
            logger.error("[GoodsCartController][insertCart]",e);
            
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        
    
    
    
    /**
     * 根据cartId 删除单个购物车项;
     * @param request
     * @param response
     * @param cartId
     * @return
     */
    @RequestMapping(value="/deleteCart",method=RequestMethod.GET,RequestMethod.POST)
    public JsonResult deleteCar(HttpServletRequest request, HttpServletResponse response, Long cartId) 
    
        
        try
        
            if(null == cartId)
                
                return new JsonResult(JsonResultCode.FAILURE, "请求参数异常", "");
            
            
            int result = goodsCartService.deleteGoodsCart(cartId);
            
            if (result > 0) 
            
                return new JsonResult(JsonResultCode.SUCCESS, "删除成功", "");
             else 
            
                return new JsonResult(JsonResultCode.FAILURE, "数据已不存在", "");
                
            
        catch(Exception e)
            
            logger.error("[GoodsCartController][deleteCart]",e);
            
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        
    
    
    @RequestMapping(value="/showCart",method=RequestMethod.GET,RequestMethod.POST)
    public JsonResult showCart(HttpServletRequest request, HttpServletResponse response,@RequestBody GoodsListVo goodsListVo) 
        try
        
            List<GoodsCart> list = goodsListVo.getList();
            Long buyerId = goodsListVo.getUserId();
            Long sellerId = goodsListVo.getSellerId();
                if(null == buyerId ||null == sellerId)
                
                return new JsonResult(JsonResultCode.FAILURE, "请求参数异常", "");
                
                goodsCartService.commitCartByBuyerIdSellerId(list,buyerId, sellerId);
                
            List<ProductVo> productVos = goodsCartService.getGoodsCartListBySellerId(buyerId, sellerId);
            
            return new JsonResult(JsonResultCode.SUCCESS, "查询成功", productVos);
        catch(Exception e)
            logger.error("[GoodsCartController][showCart]",e);
            
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        
        
技术分享图片

基本业务功能:

1.购物车可以清空。

2. 购物车可以提交。

3. 购物车可以更新。

4. 购物车也可以查询。

 

补充说明:那么APP端提交给后端的API的对象应该是怎么样的呢?

 

以下贴出代码与讲解:

 

技术分享图片
public class GoodsCart implements Serializable
    
    private static final long serialVersionUID = 7078019879911908296L;

    /**
     * 
     */
    private Long cartId;
    /**
     * 买家ID
     */
    private Long buyerId;

    /**
     * 商品规格id
     */
    private Long formatId;

    /**
     * 所属卖家ID
     */
    private Long sellerId;
    
    /**
     * 店铺名称
     */
    private String sellerName;


    /**
     * 商品数量
     */
    private BigDecimal goodsNumber;


    /**
     * 加工方式ID
     */
    private Long methodId;
    
    /**
     * 是否选择 (1是 -1否)
     */
    private Integer isSelected;

    /**
     * 创建时间
     */
    private Date createTime;
    
    /**
     * 查询创建时间
     */
    private String queryTime;

    /**
     * 买家 
     */
    private Buyer buyer;
    
    /**
     * 卖家
     */
    private Seller seller;
    
    /**
     *sku
     */
    private GoodsFormat goodsFormat;
    
    /**
     * 加工方式
     */
    private ProcessMethod processMethod;
    
    public String getSellerName() 
        return sellerName;
    

    public void setSellerName(String sellerName) 
        this.sellerName = sellerName;
    

    public Long getCartId() 
        return cartId;
    

    public void setCartId(Long cartId) 
        this.cartId = cartId;
    

    public Long getBuyerId() 
        return buyerId;
    

    public void setBuyerId(Long buyerId) 
        this.buyerId = buyerId;
    

    public Long getFormatId() 
        return formatId;
    

    public void setFormatId(Long formatId) 
        this.formatId = formatId;
    

    public Long getSellerId() 
        return sellerId;
    

    public void setSellerId(Long sellerId) 
        this.sellerId = sellerId;
    

    public BigDecimal getGoodsNumber() 
        return goodsNumber;
    

    public void setGoodsNumber(BigDecimal goodsNumber) 
        this.goodsNumber = goodsNumber;
    

    public Date getCreateTime() 
        return createTime;
    

    public void setCreateTime(Date createTime) 
        this.createTime = createTime;
    

    public Buyer getBuyer() 
        return buyer;
    

    public void setBuyer(Buyer buyer) 
        this.buyer = buyer;
    

    public Seller getSeller() 
        return seller;
    

    public void setSeller(Seller seller) 
        this.seller = seller;
    

    public GoodsFormat getGoodsFormat() 
        return goodsFormat;
    

    public void setGoodsFormat(GoodsFormat goodsFormat) 
        this.goodsFormat = goodsFormat;
    

    public String getQueryTime() 
        return queryTime;
    

    public void setQueryTime(String queryTime) 
        this.queryTime = queryTime;
    

    public Long getMethodId() 
        return methodId;
    

    public void setMethodId(Long methodId) 
        this.methodId = methodId;
    

    public Integer getIsSelected() 
        return isSelected;
    

    public void setIsSelected(Integer isSelected) 
        this.isSelected = isSelected;
    

    public ProcessMethod getProcessMethod() 
        return processMethod;
    

    public void setProcessMethod(ProcessMethod processMethod) 
        this.processMethod = processMethod;
    

    
技术分享图片

 

讲解:

            1.这个菜品的规格,以及所属卖家,买家,包括是否需要加工等等。(比如买家买了鱼,这个鱼到底是需要怎么样处理呢?活鱼,肚杀,背杀),特别说明:这个跟实际的业

务有关,如果不是做生鲜这块的话,可能很难体会。

            2. 买家肯定会买多个菜品,而不是一个,所以需要有一个List<GoodsCart> list;

 

相关实际代码如下:

     

技术分享图片
public class GoodsListVo implements Serializable

    /**
     * 
     */
    private static final long serialVersionUID = -2024011567608945523L;

    private List<GoodsCart> list;
    
    private Long userId;
    
    private Long sellerId;

    public List<GoodsCart> getList() 
        return list;
    

    public void setList(List<GoodsCart> list) 
        this.list = list;
    

    public Long getUserId() 
        return userId;
    

    public void setUserId(Long userId) 
        this.userId = userId;
    

    public Long getSellerId() 
        return sellerId;
    

    public void setSellerId(Long sellerId) 
        this.sellerId = sellerId;
    
    
技术分享图片

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载),如果需要下载的话,可以在我的github下面进行下载。 

 

相关的运营截图如下:

技术分享图片

 

 

          

 

 

 技术分享图片

 

 

      技术分享图片

 

 技术分享图片

 

 

 

转载自-- https://www.cnblogs.com/jurendage/p/9039195.html

21生鲜电商平台-通知模块设计与架构(代码片段)

说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:     1.消息推送:(采用极光推送)     2.主页弹窗通知。(比如:现在有什么新的活动,有什么新的优... 查看详情

14生鲜电商平台-搜索模块的设计与架构(代码片段)

说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面。目前也是快速的检索商品。      对于移动端的APP买家用户而言,要求的速度在3秒内完成。支持模糊查询,由于业务实战表面,... 查看详情

38生鲜电商平台-会员积分系统的设计与架构

说明:互联网平台积分体系主要用于激励和回馈用户在平台的消费行为和活动行为,一个良好的积分体系可以很好的提升用户的粘性及活跃度。一、互联网平台积分体系设计必要性互联网平台积分体系是一个独立、完整的系统模... 查看详情

java生鲜电商平台-云平台架构设计与服务治理平台架构设计(小程序/app)

Java生鲜电商平台-云平台架构设计与服务治理平台架构设计(小程序/APP)说明:Java生鲜电商平台-云平台架构设计与服务治理平台架构设计,本文只是抛砖引玉,希望对大家有所帮助.    云平台是个非常宽泛的领域,本节... 查看详情

26生鲜电商平台-rbac系统权限的设计与架构

说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上分析实现的策略以及基于目前两种比较流行的权限设计思想... 查看详情

java生鲜电商平台-电商个性化推荐引擎架构设计(小程序/app)

Java生鲜电商平台-电商个性化推荐引擎架构设计(小程序/APP) 说明:Java生鲜电商平台-电商个性化推荐引擎架构设计,个性化推荐引擎,被广泛使用在电商网站,网络广告,咨询网站中,这里我们以电商网站的使用场景为例,... 查看详情

基于springboot电商生鲜购物商城平台设计与实现(含源码+数据库文件)

主要功能:商品分类、商品详情、购物车、订单、用户管理、登录注册、个人中心等功能idea开发工具打开,导入数据库可直接运行登陆注册账号个人中心信息修改更新(个性签名)浏览查看商品信息详情添加商品... 查看详情

36生鲜电商平台-积分,优惠券,会员折扣,签到预售拼团砍价秒杀及抽奖等促销模块架构设计

说明:本标题列举了所有目前社会上常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明,仅供参考 促销体系1.1促销体系在电商和O2O领域,促销是运营人员的一个主要的让利行为,同时促销活动期间... 查看详情

130242014067“电商系统购物车功能模块”需求分析与设计实验课小结

1)分组情况介绍,小组分工合作情况介绍。陈锋、刘鑫(用户故事的细化,即功能设计)高忠杰、罗成龙(参与系统的类图设计及上台汇报)颜贵荣、李清灿(参与用户故事的讨论与设计)王绍华、丁天奇、林伟领(参与系统... 查看详情

电商项目介绍(代码片段)

目录1.自我介绍2.项目介绍3.购物车模块介绍*3.1**3.2**3.3**3.4**3.5**3.6**3.7**3.8**3.9*4.订单模块介绍5.秒杀模块介绍1.秒杀实现cdn2.超售怎么解决SQL优化字段优化建立索引优化SQL查询优化调优参数SQL三范式1.自我介绍面试官你好,我叫xx,毕... 查看详情

vivo全球商城:电商交易平台设计(代码片段)

...架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相当深刻的理解。去年初,团队承接了O2O商城的建设任务,还有即将成立的礼品中台,以及官方商城的线上购买线下门店送货需求,都需要搭建底层的商... 查看详情

35生鲜电商平台-技术方案与文档下载

说明:任何一个好的项目,都应该有好的文档与设计方案,包括需求文档,概要设计,详细设计,测试用例,验收报告等等,类似下面这个图:      有以下几个管理域:     1.开发域。&nbs... 查看详情

电商购物节现“三国杀”局面,苏宁京东在生鲜板块狭路再相逢

8月3日,生鲜领域再掀风浪,国内最大的全品类生鲜运营平台易果集团获得来自天猫的3亿美元D轮融资。彼时,易果已是苏宁生鲜板块的核心供应商,为苏宁生鲜的品质和服务保驾护航超过半年之久。进入2017年,生鲜电商热度回... 查看详情

130242014027《电商购物车模块》的需求分析与设计的课堂小结

...物模块,奇原因在于小组大部分成员均使用过电商系统的购物车模块,对其基本功能有一定的了解。其次小组成员一致认为选择购物车作为讨论的模块,其功能有一定的复杂 查看详情

基于springboot的电商购物平台设计与实现.docx

目的:近年来,随着互联网的高速发展,电商网站用户量不断攀升,电商的流量优势和便捷高效的特性彻底改变了传统的购物方式。方法:针对与消费者在购物中能够更加方便与顺利,通过市场调研分析需... 查看详情

电商平台lnmp架构之mysql高速缓存--redis(代码片段)

电商平台lnmp架构之mysql高速缓存--redis1.redis的介绍2.redis服务的安装3.Redis常用命令4.Redis异步复制5.Redis高可用6.twemproxy分片代理7.rediscluster集群8.redis的持久化9.redis与mysql的结合1.redis的介绍Redis是一个nosql(notonlysql不仅仅只有sql)数据... 查看详情

ued视觉交互设计与流程介绍

...构演化微服务与Docker介绍Docker与CI持续集成/CD互联网电商购物车架构演变案例互联网业务场景下消息队列架构互联网高效研发团队管理演进之一消息系统架构设计演进互联网电商搜索架构演化之一企业信息化与软件工程的迷思企... 查看详情

[skr-shop]购物车之架构设计(代码片段)

...册。项目地址:https://github.com/skr-shop/manuals在上一篇文章购物车设计之需求分析描述了购物车的通用需求。本文重点则在如何实现上进行架构上的设计(业务+系统架构)。(领域驱动设计)思 查看详情