2.04 商品搜索功能实现

news2024/9/22 15:34:16

根据关键字获取分类查询对应的分页商品信息,并可以价格和销量进行排序切换
在这里插入图片描述

步骤1:mapper.xml编写sql语句

<!-- k: 默认,代表默认排序,根据name-->
<!-- c: 根据销量排序-->
<!-- p: 根据价格排序-->
<select id="searchItems" parameterType="Map" resultType="com.imooc.pojo.vo.SearchItemsVO">
	SELECT
		i.id as itemId,
		i.item_name as itemName,
		i.sell_counts as sellCounts,
		ii.url as imgUrl,
		tempSpec.price_discount as price
	FROM
		items i
	LEFT JOIN
		items_img ii
	on
		i.id = ii.item_id
	LEFT JOIN
		(SELECT item_id,MIN(price_discount) as price_discount from items_spec GROUP BY item_id) tempSpec
	on
		i.id = tempSpec.item_id
	WHERE
		ii.is_main = 1
		<if test=" paramsMap.keywords != null and paramsMap.keywords != '' ">
			AND i.item_name like '%${paramsMap.keywords}%'
		</if>
		order by
		<choose>
			<when test=" paramsMap.sort == &quot;c&quot; ">
				i.sell_counts desc
			</when>
			<when test=" paramsMap.sort == &quot;p&quot; ">
				tempSpec.price_discount asc
			</when>
			<otherwise>
				i.item_name asc
			</otherwise>
		</choose>
</select>



<select id="searchItemsByThirdCat" parameterType="Map" resultType="com.imooc.pojo.vo.SearchItemsVO">
	SELECT
		i.id as itemId,
		i.item_name as itemName,
		i.sell_counts as sellCounts,
		ii.url as imgUrl,
		tempSpec.price_discount as price
	FROM
	  items i
	LEFT JOIN
	  items_img ii
	on
	  i.id = ii.item_id
	LEFT JOIN
	  (SELECT item_id,MIN(price_discount) as price_discount from items_spec GROUP BY item_id) tempSpec
	on
	  i.id = tempSpec.item_id
	WHERE
	  ii.is_main = 1
	  and
	  i.cat_id = #{paramsMap.catId}
	order by
	<choose>
		<when test=" paramsMap.sort == &quot;c&quot; ">
			i.sell_counts desc
		</when>
		<when test=" paramsMap.sort == &quot;p&quot; ">
			tempSpec.price_discount asc
		</when>
		<otherwise>
			i.item_name asc
		</otherwise>
	</choose>
</select>

步骤2:创建封装搜索的VO类

/**
 * 用于展示商品搜索列表结果的VO
 */
public class SearchItemsVO {
    private String itemId;
    private String itemName;
    private int sellCounts;
    private String imgUrl;
    private int price;
}

步骤3:mapper接口添加对应接口方法

public List<SearchItemsVO> searchItems(@Param("paramsMap") Map<String, Object> map);
public List<SearchItemsVO> searchItemsByThirdCat(@Param("paramsMap") Map<String, Object> map);

步骤4:service接口和实现类

/**
 * 搜索商品列表
 * @param keywords
 * @param sort
 * @param page
 * @param pageSize
 * @return
 */
public PagedGridResult searhItems(String keywords, String sort,  Integer page, Integer pageSize);

/**
 * 根据分类id搜索商品列表
 * @param catId
 * @param sort
 * @param page
 * @param pageSize
 * @return
 */
public PagedGridResult searhItems(Integer catId, String sort, Integer page, Integer pageSize);
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult searhItems(String keywords, String sort, Integer page, Integer pageSize) {

	Map<String, Object> map = new HashMap<>();
	map.put("keywords", keywords);
	map.put("sort", sort);

	PageHelper.startPage(page, pageSize);
	List<SearchItemsVO> list = itemsMapperCustom.searchItems(map);

	return setterPagedGrid(list, page);
}

@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult searhItems(Integer catId, String sort, Integer page, Integer pageSize) {
	Map<String, Object> map = new HashMap<>();
	map.put("catId", catId);
	map.put("sort", sort);

	PageHelper.startPage(page, pageSize);
	List<SearchItemsVO> list = itemsMapperCustom.searchItemsByThirdCat(map);

	return setterPagedGrid(list, page);
}

步骤5:controller对外提供接口

 @ApiOperation(value = "搜索商品列表", notes = "搜索商品列表", httpMethod = "GET")
    @GetMapping("/search")
    public JSONResult search(
            @ApiParam(name = "keywords", value = "关键字", required = true)
            @RequestParam String keywords,
            @ApiParam(name = "sort", value = "排序", required = false)
            @RequestParam String sort,
            @ApiParam(name = "page", value = "查询下一页的第几页", required = false)
            @RequestParam Integer page,
            @ApiParam(name = "pageSize", value = "分页的每一页显示的条数", required = false)
            @RequestParam Integer pageSize) {

        if (StringUtils.isBlank(keywords)) {
            return JSONResult.errorMsg(null);
        }

        if (page == null) {
            page = 1;
        }

        if (pageSize == null) {
            pageSize = PAGE_SIZE;
        }

        PagedGridResult grid = itemService.searhItems(keywords,
                sort,
                page,
                pageSize);

        return JSONResult.ok(grid);
    }

    @ApiOperation(value = "通过分类id搜索商品列表", notes = "通过分类id搜索商品列表", httpMethod = "GET")
    @GetMapping("/catItems")
    public JSONResult catItems(
            @ApiParam(name = "catId", value = "三级分类id", required = true)
            @RequestParam Integer catId,
            @ApiParam(name = "sort", value = "排序", required = false)
            @RequestParam String sort,
            @ApiParam(name = "page", value = "查询下一页的第几页", required = false)
            @RequestParam Integer page,
            @ApiParam(name = "pageSize", value = "分页的每一页显示的条数", required = false)
            @RequestParam Integer pageSize) {

        if (catId == null) {
            return JSONResult.errorMsg(null);
        }

        if (page == null) {
            page = 1;
        }

        if (pageSize == null) {
            pageSize = PAGE_SIZE;
        }

        PagedGridResult grid = itemService.searhItems(catId,
                sort,
                page,
                pageSize);

        return JSONResult.ok(grid);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/824048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象 1. 前言2. 拷贝构造函数2.1 对拷贝构造函数…

Approximating Wasserstein distances with PyTorch学习

https://github.com/dfdazac/wassdistance/tree/master 前置知识 Computational optimal transport学习 具体看到熵对偶的坐标上升那就行 L C ε ( a , b ) def. min ⁡ P ∈ U ( a , b ) ⟨ P , C ⟩ − ε H ( P ) \mathrm{L}_{\mathbf{C}}^{\varepsilon}(\mathbf{a}, \m…

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法 一、背景二、解决方法三、实现自动发现新的分区一、背景 生产环境Kafka集群压力大,Topic读写压力大,消费的lag比较大,因此通过扩容Topic的分区,增大Topic的读写性能理论上下…

【RabbitMQ(day4)】SpringBoot整合RabbitMQ与MQ应用场景说明

一、SpringBoot 中使用 RabbitMQ 导入对应的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置配置文件 spring:application:name: rabbitmq-springbo…

云原生落地实践的25个步骤

一、什么是云原生&#xff1f; 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的&#xff0c;传统的应用必须跑在本地服务器上&#xff0c;现在流行的应用都跑在云端&#xff0c;云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思&#xff0c;我们在开始…

【Docker】Docker+Zipkin+Elasticsearch+Kibana部署分布式链路追踪

文章目录 1. 组件介绍2. 服务整合2.1. 前提&#xff1a;安装好Elaticsearch和Kibana2.2. 再整合Zipkin 点击跳转&#xff1a;Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套&#xff08;质量有保证&#xff0c;内容详情&#xff09; 本文主要讨论在Ela…

Spring Security OAuth2.0(7):自定义认证连接数据库

自定义认证连接数据库 首先创建数据库和用户表 CREATE TABLE t_user (id bigint(20) NOT NULL AUTO_INCREMENT,username varchar(64) DEFAULT NULL,password varchar(64) DEFAULT NULL,fullname varchar(255) DEFAULT NULL,mobile varchar(20) DEFAULT NULL,PRIMARY KEY (id)…

【vue】组件使用教训

组件使用 报错组件找不到 These dependencies were not found: 遇见的问题 在使用vue的时候&#xff0c;做了一个统计图的功能&#xff0c;引入了chart。 但是在运行项目的时候&#xff0c;直接报错启动不起来&#xff0c;报错内容是 告诉我依赖找不到&#xff0c;然后还试…

2023年华数杯建模思路 - 案例:退火算法

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&#xff0c;退火&#xff08;annealing&#xff09;现象指物体逐渐降温的物理现象&#xff0c;温度愈低&#…

医疗知识图谱问答 ——Neo4j 基本操作

前言 说到问答机器人&#xff0c;就不得不说一下 ChatGPT 啦。一个预训练的大预言模型&#xff0c;只要是人类范畴内的知识&#xff0c;似乎他回答得都井井有条&#xff0c;从写文章到写代码&#xff0c;再到解决零散琐碎的问题&#xff0c;不光震撼到我们普通人&#xff0c;就…

重生之我要学C++第一天

我重生了&#xff0c;今天开始带着上世纪的回忆重新学习C 目录 命名空间&#xff08;namespace&#xff09; 输入输出流 缺省参数&#xff08;默认参数&#xff09; 函数重载 命名空间&#xff08;namespace&#xff09; 新定义命名空间是C为防止对变量&#xff0c;函数&am…

2023年华数杯建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&#xff0…

版本控制和团队协作:前端工程化的关键要素

文章目录 版本控制系统介绍&#xff08;如 Git&#xff09;1. 分布式系统2. 分支管理3. 版本控制4. 快速和高效5. 社区和生态系统 分支管理和团队协作流程1. 主分支2. 功能分支3. 开发工作4. 合并到develop5. 发布准备6. 发布 持续集成与持续部署实践持续集成&#xff08;CI&am…

LeetCode·每日一题·2681. 英雄的力量·脑筋急转弯

题目 示例 思路 代码 static const int MOD 1e9 7; int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b; } int sumOfPower(int* nums, int numsSize){qsort(nums, numsSize, sizeof(nums[0]), cmp);//排序long long ans 0, s 0;for (int x 0; x <…

C++ 虚函数详解(动态绑定)

动态绑定 虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。我们在使用基类的引用&#xff08;指针&#xff09;调用虚函数时&#xff0c;就会发生动态绑定。所…

快速开发人脸识别系统Java版本

简介&#xff1a; 先说下什么是人脸识别系统&#xff1a;举个例子&#xff0c;公司门口有个人脸识别系统&#xff0c;员工站到门口&#xff0c;看着摄像头&#xff0c;大屏幕上会抓拍到你的人脸&#xff0c;然后和公司的员工照片库里的照片比对&#xff0c;比对成功就提示&…

哪些行业适合使用PDM系统

在现代数字化时代&#xff0c;PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;以其强大的功能和灵活的特性&#xff0c;成为各个行业提高生产效率和管理水平的得力工具。那么&#xff0c;哪些行业适合使用PDM系统呢&#xff1f;让我们一同深入…

Django使用用户列表的展示和添加

接着上一篇&#xff1a;https://blog.csdn.net/javascript_good/article/details/132027702 来实现用户表的查询和添加 1、创建数据库表 在models.py 中&#xff0c;增加UserInfo类&#xff0c;包括字段姓名、密码、年龄、账号余额、入职时间、所属部门、性别 verbose_name 就…

选读SQL经典实例笔记15_窗口函数

1. 分组 1.1. 把相似的行数据聚集在一起 2. SQL分组的定义 2.1. 数学上的“群”&#xff08;group&#xff09;定义为 (G, •,e)&#xff0c;其中G是一个集合&#xff0c;• 表示G的二进制运算&#xff0c;而e则是G中的成员 2.2. 一个SQL 分组须满足的两个定理 2.2.1. 对于…

计算机毕设 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…