Java開源生鮮電商平臺-推薦系統模塊的設計與架構(源碼可下載)

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

Java開源生鮮電商平臺-推薦系統模塊的設計與架構(源碼可下載) 業務需求: 對於一個B2B的生鮮電商平臺,對於買家而言,他需要更加快速的購買到自己的產品,跟自己的餐飲店不相關的東西,他是不關心的,而且過多無用的東西摻雜在一起,反而不便 於買家下單,用戶體驗也很差,嚴重的會因此丟了客戶。(客戶覺得太 ...


Java開源生鮮電商平臺-推薦系統模塊的設計與架構(源碼可下載)

 

業務需求:

         對於一個B2B的生鮮電商平臺,對於買家而言,他需要更加快速的購買到自己的產品,跟自己的餐飲店不相關的東西,他是不關心的,而且過多無用的東西摻雜在一起,反而不便

於買家下單,用戶體驗也很差,嚴重的會因此丟了客戶。(客戶覺得太難用了。一般都就會放棄使用.)

        對於賣家而言,他自己就調整下自己的商品的上架與下架,然後就是調整下自己商品的價格。(蔬菜類的商品會隨著市場的供求關係會有相應的波動.)

         

業務分析:

              推薦系統:根據買家的行為習慣以及購買行為來推薦些他可能需要的東西的一套演算法系統。

              對於買家而言,數量來源於以下三個維度:

                                   1. 購買記錄。-----買家實際下的訂單。

                                    2. 收藏夾。   -----對於買家而言,收藏了某個商品,但是並沒購買的,我們認為他也會購買,屬於需要推送的數據之一。

                                    3. 常用清單。----用戶最近一段時間購買的記錄,我們業務分析認為他一定會再次購買,因為相對一個餐館而言,它所做的菜從某種程度來說是一定的,所以購買的食材,也相對而言也是類似的。也就是說昨天買的,今天可能也會再次夠買,只是數量有所變化而言。

                                   4. 同類推薦。  ----對於一個餐館而言,比如說小炒類似的餐館,那麼很多類似小炒的餐館的所有菜應該也是類似的,也許存在不需要的,但是也存在可能需要的情況,也屬於我們的推薦系統中的。

                                   5. 系統推薦。  ----對於一個剛註冊的買家而言,我們希望給他更好的業務體驗,那麼在註冊的時候,他就會一定選擇一個所屬類別,根據類別,我們會把相應的類別的系統清單推薦出來,讓客戶一進來就感覺到這些他所需要的菜都好像是系統跟他量身定做的一樣。

 

根據以上的業務分析,我們理清楚了上述的所有維度,以下是資料庫的設計與思路:

 

1. 購買記錄。來源於訂單明細記錄表:

CREATE TABLE `order_item` (
  `item_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `order_id` bigint(20) DEFAULT NULL COMMENT '訂單主表id,order_info表的order_id',
  `order_number` varchar(32) DEFAULT NULL COMMENT '唯一訂單號',
  `order_status` tinyint(4) DEFAULT NULL COMMENT '訂單項狀態,1為已提交訂單,2為取消訂單',
  `format_id` bigint(20) DEFAULT NULL COMMENT '商品規格的ID',
  `buyer_id` bigint(20) unsigned DEFAULT '0' COMMENT '買家ID',
  `seller_id` bigint(20) DEFAULT NULL COMMENT '所屬賣家ID',
  `delivery_type` tinyint(2) DEFAULT '1' COMMENT '配送類型,1為平臺送,2.賣家自己送',
  `delivery_status` tinyint(2) DEFAULT '0' COMMENT '配送狀態,0 表示未收貨,1表示已收貨,送貨中,2表示已收貨,已送貨',
  `seller_status` tinyint(4) DEFAULT '0' COMMENT '賣家備貨狀態,0為備貨中,1為備貨完成,2為缺貨',
  `buyer_status` tinyint(2) unsigned DEFAULT '0' COMMENT '買家狀態,0待收貨,1為已收貨,2為換貨,3為退貨',
  `remark` varchar(255) DEFAULT NULL COMMENT '訂單項備註,由用戶提交訂單前填寫',
  `goods_number_old` decimal(12,2) DEFAULT NULL COMMENT '訂單初始商品數量',
  `goods_number` decimal(12,2) DEFAULT NULL COMMENT '商品的數量',
  `goods_price` decimal(12,2) DEFAULT NULL COMMENT '商品的單價',
  `goods_amount` decimal(12,2) DEFAULT NULL COMMENT '單項總金額',
  `delivery_money` decimal(12,2) DEFAULT '0.00' COMMENT '配送費用',
  `create_time` datetime DEFAULT NULL COMMENT '訂單創建時間',
  `delivery_receive_time` datetime DEFAULT NULL COMMENT '配送人員收貨時間',
  `delivery_finish_time` datetime DEFAULT NULL COMMENT '配送人員完成時間',
  `seller_finish_time` datetime DEFAULT NULL COMMENT '賣家完成時間',
  `buyer_finish_time` datetime DEFAULT NULL COMMENT '買家完成時間',
  `method_id` bigint(20) DEFAULT NULL COMMENT '加工方式ID',
  `delivery_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3424 DEFAULT CHARSET=utf8 COMMENT='訂單的子項目';

 

2. 收藏夾系統資料庫表:

 說明:收藏夾比較簡單,某個商品ID,那個買家,什麼時候收藏的。

    

3. 常用清單

   

說明:常用清單,維度也是對於商品而言,不是針對某一個店鋪,因為我們市場反饋給出的結論是買家關註的商品本身,而不是那個賣家。

 

  4. 同類分析。

 

說明:數據來源於類似的餐館點。我們把餐館店分為幾種類型,在地推團隊來銷售產品的時候,其實是知道那個餐館的所屬類別的。

           (客戶的類型,1為火鍋店,2為小餐館,3為中餐館,4,為燒烤)

5. 系統推薦。

 

說明:系統推薦,跟收藏夾,買家常用清單功能都很類似,不同點就在於業務的範圍與範疇。

           剛註冊的用戶的常用清單的數據就來源於系統推薦的數據。

  

相關業務核心代碼如下:

1.註冊代碼中添加

 

    /**
     * 買家註冊,第二步完善資料
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/register/second/step", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult secondStepRegister(HttpServletRequest request, HttpServletResponse response,@RequestBody Buyer buyer) 
    {
        logger.info("UsersController.secondStepRegister.seller:新增買家:" + buyer);
        if (buyer == null)
        {
            return new JsonResult(JsonResultCode.FAILURE, "參數異常", "");
        }
        try 
        {
            buyerService.updateBuyer(buyer);
            //添加買家預設的常用清單
            buyerService.insertBuyerCommon(buyer.getBuyerId(), buyer.getBuyerType(), buyer.getRegionId());
            return new JsonResult(JsonResultCode.SUCCESS, "完善買家信息成功",buyer);
        } catch (Exception e) {
            logger.error("[UsersController][secondStepRegister] exception :", e);
            return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", "");
        }
    }

 

2.常用清單方面

 

    /**
     * 我的常用清單
     */
    @RequestMapping(value = "/my/commonList", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult commonList(HttpServletRequest request, HttpServletResponse response, Long userId) {
        try {
            List<CommonListVo> list = buyerService.getCommonList(userId);
            return new JsonResult(JsonResultCode.SUCCESS, "查詢信息成功", list);
        } catch (Exception ex) {
            logger.error("[MyController][commonList] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", "");
        }
    }

 

 3。系統常用清單

       說明:系統常用清單來源於後臺管理人員人工添加

 

相應代碼如下;

 

/**
     * 到新增頁面;
     */
    @RequestMapping(value = "/toAdd", method = { RequestMethod.GET, RequestMethod.POST })
    public String toAdd(HttpServletRequest request, HttpServletResponse response, Model model, SysCommonVo sysCommonVo,@ModelAttribute SearchGoodsVo sgv) {
        
        // 獲取分頁當前的頁碼
        int currentPageNum = this.getPageNum(request);
        
        // 獲取分頁的大小
        int currentPageSize = this.getPageSize(request);
        
        //區域ID
        Long areaId = sysCommonVo.getAreaId();
        
        sgv.setAreaId(areaId);
        sgv.setSearchStatus((short) 1);
        sgv.setFormatStatus((short)1);
        sgv.setSellerStatus((short)3);
        List<SysCommonVo> sysCommon = sysCommonService.getSysCommon(sysCommonVo);
        StringBuffer sb = new StringBuffer();
        
        if(sysCommon.size()>0){
            for (int i = 0; i < sysCommon.size(); i++) {
                if(i != sysCommon.size()-1){
                    SysCommonVo sc = sysCommon.get(i);
                    sb.append(sc.getGoodsId());
                    sb.append(",");
                }else {
                    SysCommonVo sc = sysCommon.get(i);
                    sb.append(sc.getGoodsId());
                }
            }
        }
        sgv.setGoodIds(new String(sb));
        
        PageUtil paginator = goodsService.getPageResultByCommon(sgv, currentPageNum, currentPageSize);
        model.addAttribute("paginator", paginator);
        model.addAttribute("sgv", sgv);
        model.addAttribute("sysCommonVo", sysCommonVo);
        return "sys/common/addFrom";
    }

 

 說明:相對而言,這個代碼都是強依賴於資料庫,畢竟不可能很多時間都有人同時買菜與註冊。很多時候都是聯表查詢即可完成數據的分析與統計。

 

5.定時器代碼。(數據的系統推薦與個性化推薦都是系統採用定時器進行處理的。spring task)

 相關代碼如下;

 

總結:所有的推薦系統的模型都類似我上面來的幾個維度的思考,需要根據自己的業務實際情況,自己分析與總結,至於是同步還是非同步,還是定時器等等都是處理手段,

我這邊就採用了,同步與非同步,包括定時器同時計算的過程,最終達到用戶的推薦效果。

 

Java開源生鮮電商平臺-推薦系統模塊的設計與架構(源碼可下載),如果需要下載的話,可以在我的github下麵進行下載。 

 

相應的業務實際運行圖如下:

 

 

 

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • css元素溢出 當子元素的尺寸超過父元素的尺寸時,需要設置父元素顯示溢出的子元素的方式,設置的方法是通過overflow屬性來設置。 overflow的設置項: 1、visible 預設值。內容不會被修剪,會呈現在元素框之外。2、hidden 內容會被修剪,並且其餘內容是不可見的,此屬性還有清除浮動 ...
  • json數據作為和後臺交互的良好交互方式,這裡介紹下前端怎麼封裝成json數據給到後臺。 示例代碼: (1)封裝成json數據 最終結果為:{"id":0,"name":"張三","job":"學生"} (2)封裝成json數組 最終結果為:[{"id":0,"name":"張三","job":"學 ...
  • 前言 ​最近,被推送了不少秒殺架構的文章,忙裡偷閑自己也總結了一下互聯網平臺秒殺架構設計,當然也借鑒了不少同學的思路。俗話說,脫離案例講架構都是耍流氓,最終使用SpringBoot模擬實現了部分秒殺場景,同時跟大家分享交流一下。 秒殺場景 秒殺場景無非就是多個用戶在同時搶購一件或者多件商品,專用辭彙 ...
  • 上一篇: "ELK 架構之 Elasticsearch 和 Kibana 安裝配置" 閱讀目錄: 1. 環境準備 2. 安裝 Logstash 3. 配置 Logstash 4. Logstash 採集的日誌數據,在 Kibana 中顯示 5. 安裝配置 Filebeat 6. Filebeat 採 ...
  • 單例模式真是一個老掉牙的問題了,不過我今天是要說些裡面更深點的知識,閑話少說,直接來代碼 1、餓漢式 相信這種寫法大家都知道,一開始接觸單例的時候,大家應該都是用的這種方法: 這種方式優點就是線程安全, 缺點也很明顯,就是類載入的時候,就已實例化該對象了,後面有可能用不到這個實例對象,這樣就會造成空 ...
  • 剛畫出來的,MicroService Manager ...
  • 詳情請 咨詢 QQ 759104513 精品新增,持續中.... 192、PHP進階:面向對象及TP5框架初識-慕課網職業路徑 191、0961、手把手帶你入坑H5與小程式直播開發 190、SpringBoot2.0不容錯過的新特性 WebFlux響應式編程 189、Vue2.5開發去哪兒網App ...
  • 1.前言 可以這麼說的是,任何一種非強制性約束同時也沒有“標桿”工具支持的開發風格或協議(僅靠文檔是遠遠不夠的),最終的實現上都會被程式員冠上“務實”的名頭,而不管成型了多少個版本,與最初的設計有什麼區別。DDD 是如此,微服務是如此,REST 也是如此。 雖然這也不難理解,風格從一開始被創造出來後 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...