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下面进行下载。

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

 

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

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

    ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Java开源生鲜电商平台-商品表的设计(源码可下载) 任何一个电商,无论是B2C还是B2B的电商,商品表的设计关系到整个系统架构的核心. 1. 商品基本信息表:用单词:goods做为商品表 2. 商品 ...

随机推荐

  1. tomcat整合apache

    历时4个多小时,终于把tomcat与apache整合起来了. 中间出了各种各样的问题,现记录一下,也希望能对后来者有点帮助. 背景 apache与tomcat的区别联系大家都知道: tomcat能处理 ...

  2. java 项目得到jar和classes路径

    java 项目得到jar和classes路径 public static String getJarPath(Class clazz) { String path = clazz.getProtect ...

  3. eclipse开发安卓时logcat的绿色加号不见了

    那个绿色加好的作用是添加过滤器的,如果不见了说明你不小心点到了一个按键.恢复方法: 点一下清空logcat日志信息,(右边那个按键)就好了!

  4. SharePoint2010搜索的简单设置

    1.  开启搜索服务,管理中心 – 应用程序管理 – 服务应用程序 – 管理服务器上的服务 2.  点击进去,启动"SharePoint Foundation搜索"."S ...

  5. objective-c中@autoreleasepool的用法

    objc中关于自动释放池,有两种语法,一种old-fashioned是: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //d ...

  6. ubuntu安装qq教程

    安装策略是wine+wine QQ TM2013,wine QQ TM2013是一款专门为wine进行优化的版本 我的ubuntu系统是14.04版本,64位 1. sudo apt-get inst ...

  7. Linux下DB2数据库安装教程

    最近因为工作需要在学习DB2数据库,本教程讲解DB2数据库在inux下的安装步骤. 安装前请查看 DB2版本和许可证 说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版本, ...

  8. AS3编程规范

    整理了一些AS3的编程规范,有些规则对于大部分语言都是适用的,有什么问题请提出来,我会持续改进这份规范,谢谢!   [参考资料] 1.http://opensource.adobe.com/wiki/ ...

  9. Java面试与回答技巧(1.如何正确的面试)

    在IT行业中,大部分公司很难用有效的方式招到合适的人.直接暴露出来的问题是:・花重金招了一个人,但实际的战斗力还比不上应届毕业生.・招聘了一个知名企业的高管,引入了一些高大上的技术,结果本来稳定的生产 ...

  10. WebSocket 和 Golang 实现聊天功能

    http://www.open-open.com/lib/view/open1416379948711.html 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery  ...