Java生鲜电商平台-购物车模块的设计与架构

摘要:
Java生鲜电子商务平台-购物车模块设计和架构描述:任何电子商务,无论是B2C还是B2B,都有购物车模块,最重要的原因是将客户需要的东西放在一起形成购物列表,确认是否存在问题,然后下单并付款。1.购物车数据库设计:描述:业务要求:1)购物车应该存储在购物车中,买家,您购买的菜的规格和数量是什么,菜的处理方法是什么。(如果有处理方法,将在此处显示处理。)

Java生鲜电商平台-购物车模块的设计与架构

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

1. 购物车数据库设计:

Java生鲜电商平台-购物车模块的设计与架构第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下面进行下载。 

相关的运营截图如下:

Java生鲜电商平台-购物车模块的设计与架构第8张

          

 Java生鲜电商平台-购物车模块的设计与架构第9张

      Java生鲜电商平台-购物车模块的设计与架构第10张

 Java生鲜电商平台-购物车模块的设计与架构第11张

免责声明:文章转载自《Java生鲜电商平台-购物车模块的设计与架构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下基于Xampp的TestLink的安装部署建立高并发模型需要考虑的点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA中初始化ArrayList的三种方式

  下面讲一下ArrayList初始化的几种不同方式。 一、最常用的初始化方式。 1 List<String> list1 = new ArrayList<String>(); 2 list1.add("apple"); 3 list1.add("banana"); 4 list1.add("o...

jsp、freemarker、velocity对比

在java领域。表现层技术主要有三种:jsp、freemarker、velocity。 jsp是大家最熟悉的技术长处:1、功能强大,能够写java代码2、支持jsp标签(jsp tag)3、支持表达式语言(el)4、官方标准。用户群广。丰富的第三方jsp标签库5、性能良好。jsp编译成class文件运行。有非常好的性能表现缺点:jsp没有明显缺点,非要挑点...

vue项目----购物车商品的删除

1.给删除链接,绑定删除的函数,因为是a链接,要阻止默认行为。  2.再添加removegoods(item.id,index)函数 分析:我们通过item.id删除把商品从store中删除            通过index删除把商品从当前的组件中的shopcargoodslist中删除。 3.要想删除state里面的数据,不能直接操作,要在muta...

OpenWRT UCI API的使用 (libuci库的使用)

摘自:http://www.openwrt.pro/post-37.html OpenWRT UCI API的使用 LUCI配置文件简介 LUCI的配置文件一般存储在 /etc/config目录下。比如网络配置文件则是 /etc/config/network 无线的配置文件是 /etc/config/wireless. 跟多配置文件的含义参考官方 WIKI...

python数组操作

python中的数组其实就是list,但它更像是java的arraylist,而且功能比arraylist更强大。因为python的list其实是个对象,所以对于他的操作和删除比较有讲究。 创建列表sample_list = ['a',1,('a','b')]Python 列表操作sample_list = ['a','b',0,1,3]得到列表中的某一个...

js中不同值的替换

function(button, e) { debugger; // 中断调试指令,可以手动删除它 var me = this, //this为列表视图控制器 viewModel = me.getViewModel(),...