Java開源生鮮電商平臺-購物車模塊的設計與架構(源碼可下載)

来源:https://www.cnblogs.com/jurendage/archive/2018/05/15/9039195.html
-Advertisement-
Play Games

ava開源生鮮電商平臺-購物車模塊的設計與架構(源碼可下載) 說明:任何一個電商無論是B2C還是B2B都有一個購物車模塊,其中最重要的原因就是客戶需要的東西放在一起,形成一個購物清單,確認是否有問題,然後再進行下單與付款. 1. 購物車資料庫設計: 說明:業務需求: 1》購物車裡面應該存放,那個買家 ...


Java開源生鮮電商平臺-購物車模塊的設計與架構(源碼可下載)

 

說明:任何一個電商無論是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下麵進行下載。 

 

相關的運營截圖如下:

 

 

          

 

 

 

 

 

      

 

 

 

   

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信授權、獲取用戶openid-純前端實現——jsonp跨域訪問返回json數據會報錯的純前端解決辦法 ...
  • 1、事件:addEventListener('click', function(){}或者方法名字) 可以添加多個處理器,語法: 對應的有removeEventListener()。 2、阻止表單預設行為: preventDefault();當在事件對象上調用該函數 3、阻止事件冒泡: stopPr ...
  • 閱讀目錄: 1. ELK Stack 簡介 2. 環境準備 3. 安裝 Elasticsearch 4. 安裝 Kibana 5. Kibana 使用 6. Elasticsearch 命令 最近在開發分散式服務追蹤,使用 Spring Cloud Sleuth Zipkin + Stream + ...
  • 在整理模板方法之前,先來說點廢話吧。除了記錄學習總結,也來記錄一下生活吧。 我們公司的老闆在北京,老闆也會因為項目來公司,不過不是天天來。公司有個同事,只要老闆不在就天天遲到,而且一天比一天晚,經常來了公司沒多久,午飯的外賣就送到公司了。前幾天,外賣竟然比他還來的早(外賣11點半送到的),公司一個不 ...
  • 一、什麼是裝飾模式 裝飾模式(Decorator),動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。UML結構圖如下: 其中,Component是抽象構件,定義一個對象介面,可以給這些對象動態地添加職責;ConreteComponent定義一個具體對象,也可以給這個對象 ...
  • 剛畫出來的,裡邊配的騷詞出自本人,夠騷吧! ...
  • Java反射, 修改欄位值, 實例化對象, 繞過構造器來實例化對象 ...
  • 概述 分散式平臺的核心在於併發,容錯。 而 Elixir 的優勢正是在於對於併發和容錯的處理。 分散式模型 1. CSP(Communicating Sequential Process) 模型 :: 多個進程通過管道(channel)進行交互 2. Actor 模型 :: 每個進程管理自己的內部狀 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...