9、生鲜电商平台-推荐系统模块的设计与架构

业务需求:

对于一个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下面进行下载。

相应的业务实际运行图如下:

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

原文地址:https://www.cnblogs.com/lu-manman/p/10052287.html

时间: 2024-11-08 01:02:39

9、生鲜电商平台-推荐系统模块的设计与架构的相关文章

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

说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题,然后再进行下单与付款. 1. 购物车数据库设计: 说明:业务需求: 1>购物车里面应该存放,那个买家,买了那个菜品的什么规格,有多少数量,然后这个菜品的加工方式如何.(如果存在加工方式的话,就会在这里显示处理.) 2>买家存在购物起送价.也就是用户放入购物车的商品的总价格如果低于配置的起送价,那么这个提交按钮就是灰色的.(不可能你点一个洋葱我们就送过去,成本

37、生鲜电商平台-供应链模块的设计与架构

说明:Java开源生鲜电商平台中供应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台所提供的服务范畴,但是这块也是非常重要的一块,只是属于另外的一个领域,对此我只发布我自己的看法与见解,包括设计等. 近段时间有几个项目,客户提到需要实现供应商管理供应链上的库存(Vendor Managed Inventory)的业务.所以对这方面做了比较多的研究,现在写下来和各位同行分享一下. 本文将分为两部份,第一部分介绍供应链.牛鞭效应和

17、生鲜电商平台-异常模块的设计与架构

说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那么作为一个 B2B的Java开源生鲜电商平台,我们的异常需要思考以下几个维度. 1. 运行的代码异常     说明:代码在运行的过程中,难免出现各种异常与错误,我们采用Log4j进行日志的记录.               在分层代码解耦过程中,我们统一在Controller进行异常的捕获与日志记录. 相关的运行的代码异常架构如下: /** * (商家店铺)商

14、生鲜电商平台-搜索模块的设计与架构

说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面.目前也是快速的检索商品. 对于移动端的APP买家用户而言,要求的速度在3秒内完成.支持模糊查询,由于业务实战表面,整个搜索频率不到18%-25%之间 同时业务也不算很大,所以并没采用java全文检索技术.(lucene等).这里采用的就是基本的模糊查询. 1. 搜索维度的是思考. 1.1  买家搜索的内容很有可能是针对菜品的本身属性而言,所以涉及到的内容有商品名称,商品别名,商品标签,商品描述,规格的名称,加工方式等. 1.2 

Java开源生鲜电商平台-通知模块设计与架构(源码可下载)

Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)           2. 主页弹窗通知.(比如:现在有什么新的活动,有什么新的优惠等等)           3. 短信通知.(对于短信通知,这个大家很熟悉,我们就说下我们如何从代码层面对短信进行分层的分析与架构) 1. 消息推送 说明:目前市场上的推送很多,什么极光推送,环信,网易云等等,都可以实现秒

Java开源生鲜电商平台-用户表的设计(源码可下载)

Java开源生鲜电商平台-用户表的设计(源码可下载) 说明:由于该系统属于B2B平台,不设计到B2C的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如:buyer,seller. 这样进行数据库的解耦,任何一方的变动都互不影响,但是我想集中式管理,以及一些业务个性化要求,我就增加了一个users表.表结构如下: 账号唯一键,所以做了唯一键索引, 账号的准确性采用手机短信验证. 根据类型区分买家与卖家,登陆的时候,采用的就是users这种表进行维护

21、生鲜电商平台-通知模块设计与架构

说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)           2. 主页弹窗通知.(比如:现在有什么新的活动,有什么新的优惠等等)           3. 短信通知.(对于短信通知,这个大家很熟悉,我们就说下我们如何从代码层面对短信进行分层的分析与架构) 1. 消息推送 说明:目前市场上的推送很多,什么极光推送,环信,网易云等等,都可以实现秒级别的推送,我们经过了市场调研与稳定性考察,最终选择了极光推

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载)

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载) 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数据,这种情况我们是要防止发生的. 2.解决方法: ①前端处理:在提交之后通过js立即将按钮

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载) 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A.B在不同的售票窗口均同时查询到了某车厢卧铺中.下铺位有空位.用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺.当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位.在这个系统场景中,我们来探讨一下,火车票