Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

时间:2022-01-22 10:06:26

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

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

1. 购物车数据库设计:

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

说明:业务需求:

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

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

系统设计:

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

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

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

相关后端代码如下:

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
/**
* 购物车
*/
@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, "系统错误,请稍后重试","");
}
}
}
Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

基本业务功能:

1.购物车可以清空。

2. 购物车可以提交。

3. 购物车可以更新。

4. 购物车也可以查询。

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

以下贴出代码与讲解:

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
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;
}
Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

讲解:

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

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

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

相关实际代码如下:

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
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开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

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

相关的运营截图如下:

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)的更多相关文章

  1. Java开源生鲜电商平台-推荐系统模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...

  2. Java开源生鲜电商平台-支付模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS)   1. 数据库表设计. 说明:无论是支付宝还 ...

  3. Java开源生鲜电商平台-异常模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-异常模块的设计与架构(源码可下载) 说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那 ...

  4. Java开源生鲜电商平台-账单模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) 补充说明:Java开源生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程. 由于系统存在一个押账功能的需求,(何为押账,就是形成公司 ...

  5. Java开源生鲜电商平台-搜索模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-搜索模块的设计与架构(源码可下载) 说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面.目前也是快速的检索商品. 对于移动端的APP买家用户而言,要求的速度在 ...

  6. Java开源生鲜电商平台-售后模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-售后模块的设计与架构(源码可下载) 说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度. 1. 买家的需求维度 说明:买家 ...

  7. Java开源生鲜电商平台-订单表的设计&lpar;源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  8. Java生鲜电商平台-供应链模块的设计与架构

    Java生鲜电商平台-供应链模块的设计与架构 说明:Java开源生鲜电商平台*应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台 ...

  9. Java开源生鲜电商平台-用户表的设计&lpar;源码可下载)

    Java开源生鲜电商平台-用户表的设计(源码可下载) 说明:由于该系统属于B2B平台,不设计到B2C的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如: ...

随机推荐

  1. BZOJ 1191 【HNOI2006】 超级英雄Hero

    Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回 ...

  2. RHEL6解决无法使用YUM源问题

    RHEL的YUM源需要注册用户才能更新使用,由于CentOS和RHEL基本没有区别,并且CentOS已经被REHL收购.所以将RHEL的YUM源替换为CentOS即可.问题如下:[root@bogon ...

  3. PHP设计模式之:建造者模式

    建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...

  4. 外显子分析:cutadapt,去除序列adapter详细解析

    外显子测序时带有adapt接头,因此我们需要去除adapt接头,cutadapt的作用是去除adapt接头,一般用到如下命令: cutadapt -a AACCGGTT -o output.fastq ...

  5. &ZeroWidthSpace;ScrollView、ListView嵌套

    1.手动设置ListView高度 经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListV ...

  6. lucene 多字段查询-MultiFieldQueryParser

    /** * 搜索域加权 */ Map<String, Float> boosts = new HashMap<>(); boosts.put("title" ...

  7. 开涛spring3&lpar;3&period;4&rpar; - DI 之 3&period;4 Bean的作用域

    3.4  Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. ...

  8. &lbrack;Tool&rsqb; Git 使用 与 Git Flow

    目录 简介 Git 命令 Git Flow 简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Lin ...

  9. css3动画和animate&period;css动画库使用

    CSS3动画 css3动画可以分为两种.transition过渡动画和keyframes关键帧动画 过渡动画 第一种叫过渡(transition)动画,就是从初始状态过渡到结束状态这个过程中所产生的动 ...

  10. Spring AOP无法拦截Controller中的方法

    想使用AOP Annotation配置Spring MVC的Controller进行拦截, 发现无法拦截Controller的方法, 却可以拦截Service层的方法. 一开始: Spring的配置文 ...