看下接口:

返回值:

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

根据分类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. Halcon如何保存仿射变换矩阵

    这里我们通过序列化来实现的,如下图,写到硬盘的HomMat2D_1内容和从硬盘里HomMat2D_2读出的内容一致,源代码在图片下方. Halcon源代码: hom_mat2d_identity (H ...

  2. 算法笔记(c++)--使用一个辅助栈排列另一个栈

    算法笔记(c++)--使用一个辅助栈排列另一个栈 仅仅使用一个辅助栈,不使用其他数据结构来排列一个栈,要求,上大下小. 分析下.肯定是先吧主栈中的数据都放到辅助栈中,在辅助栈中上小下大. 1.首先循环 ...

  3. tikv 安装

    export HostIP="127.0.0.1" docker run -d -p 2379:2379 -p 2380:2380 --name pd pingcap/pd \ - ...

  4. Linux java项目冲突不能正常运行

    部署项目,在windows环境部署到Tomcat能够正常运行,部署到Linux环境下只能访问一些html资源,不能正常运行. 解决步骤: 1.清除webapps目录下所有文件夹,将war包上传至web ...

  5. Thunder团队第七周 - Scrum会议5

    Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:邹双黛 工作照片: 宋雨沉迷于照相无法自拔,所以不在相片中. 参会成员: 王航:http://www.cnb ...

  6. 1.12Linux下软件安装(学习过程)

    实验介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 ...

  7. C#高级编程(第六版)学习:第三十一章:Windows窗体

    第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...

  8. iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?

    1.前言      本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题需要注意,今天我不谈block的循环引用的问题,主要说说一些对象.数组不内存得不到释放的情况. ...

  9. .NET Core 控制台中文乱码问题!

    class Program { static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvide ...

  10. 【APS.NET Core】- launchSettings.json

    launchSettings.json文件为一个ASP.NET Core应用保存特有的配置标准,用于应用的启动准备工作,包括环境变量,开发端口等.在launchSettings.json文件中进行配置 ...