看下接口:

返回值:

门户商品搜索功能的实现:

根据分类id进行搜索,根据关键词进行搜索,并按照一定的顺序排序

业务逻辑:

1、查询分类是否存在。

2、如果分类存在,则递归分类,展示父类商品,子类商品,孙子类商品,递归获取商品的分类id,获取到该id下面的子类商品

3、根据关键字和分类id查询商品

 //前端显示商品列表,并按照一定的顺序排序
@Override
public ServerResponse<PageInfo> getPortalProductList(Integer categoryId, String keyword, String orderBy, Integer pageNum, Integer pageSize) {
if (StringUtils.isBlank(keyword) && categoryId == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(), ResponseCode.ILLEGAL_ARGUMENT.getDesc());
}
List<Integer> categoryIdList = Lists.newArrayList();
//这里需要根据商品id来判断这个类别是否存在,如果分类不存在,则返回给前台一个空即可
if (categoryId != null) {
mmall_category category = categoryMapper.selectByPrimaryKey(categoryId);
if (category == null && StringUtils.isBlank(keyword)) {
//如果分类为空,则返回该类别为空的结果集,不报错
PageHelper.startPage(pageNum, pageSize);
List<ProductListVo> list = Lists.newArrayList();
PageInfo info = new PageInfo(list);
return ServerResponse.createBySuccess(info);
}
//商品展示的时候,当我们在搜索某一类商品的时候,它会有很多子类,比如手机类别,有华为型号的,华为型号下面又有很多子类,所以递归函数来调用 categoryIdList = categoryService.getDeepCategory(category.getId()).getData();
}
//接下来判断关键字是否为空
if (keyword != null) {
keyword = new StringBuilder().append("%").append(keyword).append("%").toString();
}
//排序处理
PageHelper.startPage(pageNum, pageSize);
/* if (StringUtils.isNotBlank(orderBy)){
//分页的排序
if (Const.ProductListOrderBy.PRICE_ASC_DESC.contains(orderBy)){
//进行分割
String[] orderArray=orderBy.split("_");
//排序
PageHelper.orderBy(orderArray[0]+" "+orderArray[1]);
}
}*/
List<mmall_product> productList = productMapper.selectProtalProduct(StringUtils.isBlank(keyword) ? null : keyword, categoryIdList.size() == 0 ? null : categoryIdList);
List<ProductListVo> productListVoList = Lists.newArrayList();
if (!CollectionUtils.isEmpty(productList)) {
for (mmall_product product : productList) {
ProductListVo productListVo = this.productConvertVo(product);
productListVoList.add(productListVo);
}
}
PageInfo info = new PageInfo(productListVoList);
return ServerResponse.createBySuccess(info);
}

  

递归的代码:

//这里递归获取子节点,即当前节点下的所以子节点以及子节点的节点都要列出
@Override
public ServerResponse<List<Integer>> getDeepCategory(Integer categoryId) {
Set<mmall_category> categorySet= Sets.newHashSet();//这是guava缓存的技巧
//在这里进行初始化Set集合
findChildrenCategory(categorySet,categoryId);
List<Integer> list= Lists.newArrayList();
if (categoryId!=null){
for (mmall_category categoryItem:categorySet) {
list.add(categoryItem.getId());
}
}
return ServerResponse.createBySuccess(list);
}
//递归代码的实现
public Set<mmall_category> findChildrenCategory(Set<mmall_category> categorySet,Integer categoryId){
mmall_category category=mmall_categoryMapper.selectByPrimaryKey(categoryId);
if (category!=null){
categorySet.add(category);
}
//categorySet其实是用来存储这些列表数据的
//查找子节点递归函数必须有一个终止条件
List<mmall_category> categoryList=mmall_categoryMapper.selectCategoryByParentId(categoryId);
for (mmall_category categoryItem: categoryList) {
findChildrenCategory(categorySet,categoryItem.getId());
}
return categorySet;
}

  

portal商品展示功能逻辑的更多相关文章

  1. OJ2.0userInfo页面Modify逻辑bug修复,search功能逻辑实现

    这周的主要任务:userInfo页面Modify逻辑bug修复,search功能逻辑实现. (一)Modify逻辑bug修复: 这里存在的bug就是在我们不重置password的时候依照前面的逻辑是不 ...

  2. 使用类似GeoJson的数据生成物体(建筑等)的功能逻辑

    GeoJson作为一种模型传输格式, 用的最多的就是地图里面的各种简单模型了, 比如下图中很贴切的俄罗斯方块楼: 它的格式大概就是下面这样: { "type": "Fea ...

  3. day79:luffy:注册之对手机号的验证&实现基本的注册功能逻辑&点击获取验证码&redis

    目录 1.前端和后端对于手机号的验证 2.实现基本的注册功能-不包括验证码 3.点击获取验证码 4.解决登录不上Xadmin的bug 5.redis register.vue页面 <templa ...

  4. Hadoop学习笔记之六:HDFS功能逻辑(2)

    Lease(租约) HDFS(及大多数分布式文件系统)不支持文件并发写,Lease是HDFS用于保证唯一写的手段. Lease可以看做是一把带时间限制的写锁,仅持有写锁的客户端可以写文件. 租约的有效 ...

  5. Scrum立会报告+燃尽图(十二月六日总第三十七次):程序功能逻辑优化

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  6. Hadoop学习笔记之五:HDFS功能逻辑(1)

    Block Report DataNode会周期性(默认1小时)将自身节点全部block信息发送给NameNode,以让NameNode正确确维护block信息. 在Block Report的数据源D ...

  7. Python日志功能与处理逻辑

    前言 在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能.在Python语言中,有个內建模块logging能够很好的实现日志功能.整体来说,logging配置可 ...

  8. Portal相关技术及架构

    Portal以用户为中心,提供统一的用户登录,实现信息的集中访问,集成了办公商务一体的工作流环境.利用Portal技术,可以方便地将员工所需要的,来源于各种渠道的信息资料集成在一个统一的桌面视窗之内. ...

  9. AEAI Portal V3.5.2门户集成平台发版说明

    AEAI Portal门户集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将Portal_server.Portal_portlet两个项目开源,目的在于满足客户与伙伴的OEM需求,以及为广 ...

随机推荐

  1. ZOJ 3962

    就是统计1~n中出现的各个数字的次数,当然是在16进制下. 不过有个区间问题的小技巧,统计从 [x,y] 可以转换成 从 [1,y] 减去 [1,x-1]. 不过要分类讨论一下,因为有可能会出现溢出, ...

  2. 如何报FOB价格

    FOB价格是当货物越过船舷,卖方即完成交货.FOB价格术语仅适用于海运或内河运输.在国际贸易中,FOB价格是比较常用的一种,FOB价格作为众多贸易中的一种需要外贸人员熟悉掌握. FOB价格是当货物越过 ...

  3. SQL行列轉換方法(詳細例子)

    普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法. 问题:假设有张学生成绩表(tb)如下 ...

  4. 对Excle的行和列进行检查 单元格类型转换代码 ;

    对Excle的行和列进行检查  转换代码 : ** * 导入信息 */ @Override public List<Object> add(HttpServletRequest reque ...

  5. laravel连接多个不同数据库的单例类

    在連接多個不同數據庫時,需要寫多個連接,爲了簡化該操作,可以使用該基類,不同的數據庫只要建立好相對應的類繼承該類,就可以使用ORM模型進行操作了. class singletonInstance { ...

  6. (转)ActiveMQ的重连机制

    花了一天的时间,终于搞明白了我的疑问. failover://(tcp://localhost:6168)?randomize=false&initialReconnectDelay=100& ...

  7. PHP对象类型转换

    其他数据类型转换为对象类型 其他数据类型转换为对象类型,得到的结果是:内置标准类(stdclass)的一个对象! 语法形式为: $obj1  =  (object) 其他类型数据: 数组转换为对象:数 ...

  8. C#和Java访问修饰符的比较

    访问修饰符对于C#:类 的默认修饰符是 internal(外部类只能被public / internal 修饰)枚举 的默认修饰符是 public 且此类型不允许其它访问修饰符接口 的默认修饰符是 i ...

  9. QT学习记录

    QApplication app(argc,argv); 创建了一个QApplication对象,这个对象用于管理应用程序级别的资源.QApplication的构造函数要求两个参数,分别来自main的 ...

  10. 秒杀多线程第七篇 经典线程同步 互斥量Mutex(续)

    java使用Synchronized关键字实现互斥,而同时有Lock支持. 这两个的效果是等同的,Synchronized性能的起伏较大,而lock比较收敛. 为了代码的可读性,Synchronize ...