商品上线搜索服务

文章目录

    • 1.引入检索页面
        • 1.确保search目录和list.html都成功引入
        • 2.修改list.html,增加命名空间
        • 3.后端编写接口 SearchController.java
        • 4.测试访问
    • 2.带条件分页检索
        • 1.前端要求返回数据的格式
        • 2.构建vo,SearchResult.java
        • 3.SkuInfoService.java 购买用户根据检索条件查询商品信息
        • 4.SkuInfoServiceImpl.java
        • 5.SearchController.java 测试返回结果
          • 1.根据keyword查询
          • 2.根据catalog3Id也就是一级商品id查询
          • 3.根据brandId查询
        • 6.二次封装vo,SearchController.java
        • 7.模板渲染
          • 1.list.html取出数据的代码
          • 2.结果展示,这里价钱为0是因为确实没写
          • 3.测试检索
        • 8.分页导航
          • 1.list.html
          • 2.结果展示
        • 9.通过搜索框进行检索 list.html
          • 1.在搜索位置添加点击事件
          • 2.将这段代码放到js脚本最后
          • 4.结果展示
        • 10.完成点击三级分类也可以进入检索页面
          • 1.修改 catalogLoader.js,注意需要baseUrl
          • 2.结果展示
            • 1.点击性价比手机
            • 2.则根据分类查询
        • 11.检索代码重构
          • 1.当前检索代码问题分析
            • 1.无论spu是否上架,都会被检索出来
            • 2.比如查看这里的id为16的spu,是下架的
          • 2.后端 sunliving-commodity模块
            • 1.SpuInfoService.java 获取所有上架商品的id
            • 2.SpuInfoServiceImpl.java
            • 3.修改SkuInfoServiceImpl.java的querySearchPageByCondition方法,增加判断是否上架的条件
            • 4.测试,此时检索只会出现spu_id为17的两条sku记录
        • 12.分页超链接
          • 1.首先确保list.html的分页部分绑定了class为page_a
          • 2.将script代码放到最后
          • 3.测试
          • 1.点击第第二页
        • 13.保留检索关键字
          • 1.SearchResult.java 添加keyword字段
          • 2.在SearchController.java返回时携带
          • 3.list.html回显
          • 4.测试

1.引入检索页面

1.确保search目录和list.html都成功引入

image-20240426145653899

2.修改list.html,增加命名空间

image-20240426145802922

3.后端编写接口 SearchController.java
package com.sun.sunliving.commodity.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** Description:** @Author sun* @Create 2024/4/26 14:54* @Version 1.0*/
@Controller
public class SearchController {/*** 转发到检索界面* @return*/@RequestMapping("/list.html")public String list() {return "list";}
}
4.测试访问

image-20240426150047827

2.带条件分页检索

1.前端要求返回数据的格式

image-20240426151406703

2.构建vo,SearchResult.java
package com.sun.sunliving.commodity.vo;import com.sun.sunliving.commodity.entity.SkuInfoEntity;
import lombok.Data;import java.util.List;/*** Description:** @Author sun* @Create 2024/4/26 15:21* @Version 1.0*/
@Data
public class SearchResult {// 检索到的商品信息private List<SkuInfoEntity> commodity;// 当前页码private Integer pageNum;// 总的记录数private Long total;// 总页数private Integer totalPages;// 总记录数private List<Integer> pageNavs;
}
3.SkuInfoService.java 购买用户根据检索条件查询商品信息
    /*** 购买用户根据检索条件查询商品信息* @param params* @return*/PageUtils querySearchPageByCondition(Map<String, Object> params);
4.SkuInfoServiceImpl.java
    @Overridepublic PageUtils querySearchPageByCondition(Map<String, Object> params) {// 创建一个查询条件对象QueryWrapper<SkuInfoEntity> queryWrapper = new QueryWrapper<>();// 获取keywordString keyword = (String) params.get("keyword");// 如果keyword不为空,那么就设置sku_id和sku_name的查询条件if (StringUtils.isNotBlank(keyword)) {// 查询条件为sku_id等于keyword或者sku_name包含keywordqueryWrapper.and((wrapper) -> {wrapper.eq("sku_id", keyword).or().like("sku_name", keyword);});}// 获取三级分类catalog3IdString catalog3Id = (String) params.get("catalog3Id");// 如果catalog3Id不为空,并且不等于0,那么就设置catalog_id的查询条件if (StringUtils.isNotBlank(catalog3Id) && !"0".equalsIgnoreCase(catalog3Id)) {queryWrapper.eq("catalog_id", catalog3Id);}// 获取brandIdString brandId = (String) params.get("brandId");// 如果brandId不为空,并且不等于0,那么就设置brand_id的查询条件if (StringUtils.isNotBlank(brandId) && !"0".equalsIgnoreCase(brandId)) {queryWrapper.eq("brand_id", brandId);}// 分页查询IPage<SkuInfoEntity> page = this.page(new Query<SkuInfoEntity>().getPage(params),queryWrapper);// 返回分页结果return new PageUtils(page);}
5.SearchController.java 测试返回结果

image-20240426155846821

1.根据keyword查询

image-20240426154621759

image-20240426154613909

2.根据catalog3Id也就是一级商品id查询

image-20240426154926932

image-20240426154918655

3.根据brandId查询

image-20240426155041439

image-20240426155032440

6.二次封装vo,SearchController.java
package com.sun.sunliving.commodity.web;import com.sun.common.utils.PageUtils;
import com.sun.sunliving.commodity.entity.SkuInfoEntity;
import com.sun.sunliving.commodity.service.SkuInfoService;
import com.sun.sunliving.commodity.vo.SearchResult;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Description:** @Author sun* @Create 2024/4/26 14:54* @Version 1.0*/
@Controller
public class SearchController {@Resourceprivate SkuInfoService skuInfoService;/*** 转发到检索界面* @return*/@RequestMapping("/list.html")public String list(@RequestParam Map<String, Object> params, Model model) {// 调用service层的方法PageUtils pageUtils = skuInfoService.querySearchPageByCondition(params);// 将数据封装到vo中SearchResult searchResult = new SearchResult();searchResult.setCommodity((List<SkuInfoEntity>) pageUtils.getList());searchResult.setPageNum(pageUtils.getCurrPage());searchResult.setTotal((long) pageUtils.getTotalCount());searchResult.setTotalPages(pageUtils.getTotalPage());// 设置页码,只需遍历总页数即可List<Integer> pageNavs = new ArrayList<>();for (int i = 1; i <= pageUtils.getTotalPage(); i++) {pageNavs.add(i);}searchResult.setPageNavs(pageNavs);// 将数据传递到前端模板model.addAttribute("result", searchResult);return "list";}
}
7.模板渲染
1.list.html取出数据的代码
                    <!--排序内容--><div class="rig_tab"><!-- 取出每一个commodity--><div th:each="commodity : ${result.getCommodity()}"><div class="ico"><i class="iconfont icon-weiguanzhu"></i><a href="#">关注</a></div><p class="da"><a href="#"title="购买leCare+,获得原厂2年整机保修(含电池),和多达2次意外损坏的保修服务。购买勾选:保障服务、原厂保2年。"><img th:src="${commodity.skuDefaultImg}" class="dim"></a></p><ul class="tab_im"><li><a href="#" title="黑色"><img th:src="${commodity.skuDefaultImg}" /></a></li></ul><p class="tab_R"><span th:text="'¥' + ${commodity.price}">¥5199.00</span></p><p class="tab_JE"><a href="#" th:utext="${commodity.skuTitle}">北欧风格沙发10000#号</a></p><p class="tab_PI">已有<span>11万+</span>热门评价<a href="#">二手有售</a></p><p class="tab_CP"><a href="#" title="家居网产品专营店">家居网产品...</a><a href='#' title="联系供应商进行咨询"><img src="search/img/xcxc.png"></a></p><div class="tab_FO"><div class="FO_one"><p>自营<span>家居网自营,品质保证</span></p><p>满赠<span>该商品参加满赠活动</span></p></div></div></div></div>
2.结果展示,这里价钱为0是因为确实没写

image-20240426163142944

3.测试检索

image-20240426163321823

8.分页导航
1.list.html
                    <!--分页--><div class="filter_page"><div class="page_wrap"><span class="page_span1"><a class="page_a" href="#" th:attr="pn=${result.pageNum - 1}"th:if="${result.pageNum>1}">< 上一页</a><a class="page_a"th:attr="pn=${navs},style=${navs == result.pageNum?'border:0;color:#ee2222;background: #fff':''}"th:each="navs : ${result.pageNavs}">[[${navs}]]</a><a class="page_a" href="#" th:attr="pn=${result.pageNum + 1}"th:if="${result.pageNum<result.totalPages}">下一页 ></a></span><span class="page_span2"><em><b>[[${result.totalPages}]]</b>&nbsp;&nbsp;到第</em><input type="number" value="1"><em></em><a href="#">确定</a></span></div></div>
2.结果展示

image-20240426173510457

9.通过搜索框进行检索 list.html
1.在搜索位置添加点击事件

image-20240426173812372

2.将这段代码放到js脚本最后
  • 这个脚本的意思就是根据传入的参数,在location.href的url上添加参数
    //处理带条件搜索, 技术难点在于要把原来的条件带上.//得到最新的请求 url, 带有多个条件function searchProducts(name, value) {location.href = replaceParamVal(location.href, name, value, false)}function searchByKeyword() {searchProducts("keyword", $("#keyword_input").val());}//替换条件, 或者是添加条件,比较麻烦的代码function replaceParamVal(url, paramName, replaceVal, forceAdd) {var oUrl = url.toString();var nUrl;if (oUrl.indexOf(paramName) != -1) {if (forceAdd) {if (oUrl.indexOf("?") != -1) {nUrl = oUrl + "&" + paramName + "=" + replaceVal;} else {nUrl = oUrl + "?" + paramName + "=" + replaceVal;}} else {var re = eval('/(' + paramName + '=)([^&]*)/gi');nUrl = oUrl.replace(re, paramName + '=' + replaceVal);}} else {if (oUrl.indexOf("?") != -1) {nUrl = oUrl + "&" + paramName + "=" + replaceVal;} else {nUrl = oUrl + "?" + paramName + "=" + replaceVal;}}return nUrl;};
4.结果展示

image-20240426175739943

10.完成点击三级分类也可以进入检索页面
1.修改 catalogLoader.js,注意需要baseUrl

image-20240426180754802

2.结果展示
1.点击性价比手机

image-20240426181917912

2.则根据分类查询

image-20240426182013540

11.检索代码重构
1.当前检索代码问题分析
1.无论spu是否上架,都会被检索出来

image-20240426182558149

2.比如查看这里的id为16的spu,是下架的

image-20240426182758824

2.后端 sunliving-commodity模块
1.SpuInfoService.java 获取所有上架商品的id
    // 获取所有上架商品的idList<Long> getAllUpSpuId();
2.SpuInfoServiceImpl.java
    @Overridepublic List<Long> getAllUpSpuId() {// 查询所有publish_status为1的spu的idList<SpuInfoEntity> list = this.list(new QueryWrapper<SpuInfoEntity>().eq("publish_status", 1));return list.stream().map(SpuInfoEntity::getId).collect(Collectors.toList());}
3.修改SkuInfoServiceImpl.java的querySearchPageByCondition方法,增加判断是否上架的条件

image-20240426185243284

4.测试,此时检索只会出现spu_id为17的两条sku记录

image-20240426185323507

12.分页超链接
1.首先确保list.html的分页部分绑定了class为page_a

image-20240426191818325

2.将script代码放到最后
    // 分页超链接$(".page_a").click(function () {var pn = $(this).attr("pn");var href = location.href;if (href.indexOf("page") != -1) {
//替换, 这里的"page" 是因为我们后台分页插件是按照 page 这个参数来当做当前页的参数location.href = replaceParamVal(href, "page", pn);} else {
//增加 pageNuwif (href.indexOf("?") != -1) {location.href = location.href + "&page=" + pn;} else {location.href = location.href + "?page=" + pn;}}return false;})
3.测试
1.点击第第二页

image-20240426194029651

13.保留检索关键字
1.SearchResult.java 添加keyword字段

image-20240427100535326

2.在SearchController.java返回时携带

image-20240427100603883

3.list.html回显

image-20240427101046603

4.测试

image-20240427101519431

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

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

相关文章

电脑无法远程桌面连接,关于电脑无法建立远程桌面连接的问题分析与解决方案

在信息化快速发展的今天&#xff0c;远程桌面连接已成为许多企业和个人用户进行远程办公、技术支持以及数据管理的必备工具。然而&#xff0c;当电脑无法建立远程桌面连接时&#xff0c;可能会对用户的工作和日常生活造成极大的不便。本文将深入分析电脑无法远程桌面连接的原因…

详解Java ThreadLocal

个人博客 详解Java ThreadLocal | iwts’s blog Java ThreadLocal ThreadLocal提供了线程内存储变量的能力&#xff0c;这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。 TreadLocal存储模型 ThreadLocal的静态…

Oracle EBS API创建AP发票报错:ZX_TAX_STATUS_NOT_EFFECTIVE和ZX_REGIME_NOT_EFF_IN_SUBSCR-

背景 由创建国外业务实体财务未能提供具体国家地区会计税制&#xff0c;而是实施人员随便选择其它国外国家地区会计税制。导致客户化创建AP发票程序报错&#xff1a;UNEXPECTED TAX ERROR-导入时出现意外的税务错误ZX_TAX_STATUS_NOT_EFFECTIVE-ZX_REGIME_NOT_EFF_IN_SUBSCR-ZX…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支&#xff0c;那如何克隆其他分支呢&#xff1a; 比如这个&#xff0c;我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入&#xff1a; git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…

计算机操作系统体系结构

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天给大家讲讲操作系统。 当今的操作系统趋向于越来越复杂&#xff0c;因为它们提供许多服务&#xff0c;并支持各种硬件和软件资源&#xff08;请参见“操作系统思想&#xff1a;尽量保持简单”&#xff0…

267 基于matlab的信号处理GUI人机交互

基于matlab的信号处理GUI人机交互&#xff0c;利用GUI功能完成包括振幅调制AM&#xff08;Amplitude Modulation&#xff09;&#xff0c;双边带调幅信号DSB&#xff08;double sideband&#xff09;&#xff0c;单边带信号SSB&#xff08;single sideband &#xff09;&#x…

《TCP/IP网络编程》(第十一章)进程间通信

进程间通信意味着两个不同的进程间可以交换数据&#xff0c;它使得不同的进程能够协同工作&#xff0c;实现复杂的系统功能。 1.通过管道实现进程间通信 下图是基于 管道&#xff08;PIPE&#xff09; 的进程间通信结构模型 管道不属于进程的资源&#xff0c;属于操作系统的资…

数字化工厂怎么收集,处理数据?

数字化工厂的数据收集与处理 数字化工厂是现代化工厂&#xff0c;利用数字技术和数据分析提高效率和优化流程。数据分析作为数字化工厂的核心技术&#xff0c;对数据的获取与处理至关重要。在数字化工厂中&#xff0c;数据的来源包括企业内部信息系统、物联网信息以及外部信息&…

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

问题说明 最近在使用美光EMMC的时候&#xff0c;发现通过芯片丝印查询不到 芯片的规格说明书&#xff1b; 经过查阅资料&#xff0c;发现美光的EMMC芯片 “由于空间限制&#xff0c;FBGA 封装组件具有与部件号不同的缩写部件标记”&#xff0c;需要通过官网查询丝印的FBGA cod…

Autosar Dcm配置-特定NRC实现方式-基于ETAS软件

文章目录 前言工具配置代码编写总结 前言 项目开发过程中&#xff0c;诊断服务一般客户需求或系统需求都会有特定NRC(一般为NRC22-条件不满足)&#xff0c;也就会有特定的条件&#xff0c;需要手动加代码实现。本文介绍ETAS工具中配置的接口及简单实现。 工具配置 对于每一个…

特朗普竞选带火PoliFi,以Bitget为例

以特朗普系列Meme币为代表的政治金融(PoliFi)概念币市场正在掀起热潮&#xff0c;前美国总统特朗普(Donald Trump)在本月稍早公开力挺加密货币&#xff0c;接着又在周二宣布接受比特币、以太币、SOL、USDC、DOGE…等政治献金&#xff0c;让相关通证高涨。 据CoinGecko数据&…

鸿蒙开发接口图形图像:【@ohos.display (屏幕属性)】

屏幕属性 屏幕属性提供管理显示设备的一些基础能力&#xff0c;包括获取默认显示设备的信息&#xff0c;获取所有显示设备的信息以及监听显示设备的插拔行为。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/…

【C++】继承(二)深入理解继承:派生类默认成员函数与友元、静态成员的奥秘

目录 派生类的默认成员函数①派生类的构造函数②派生类的拷贝构造函数③派生类的赋值构造④派生类的析构函数 继承与友元继承与静态成员 前言 我们在上一章讲解了: 继承三部曲&#xff0c;本篇基于上次的基础继续深入了解继承的相关知识&#xff0c;欢迎大家和我一起学习继承 派…

探索Python中的随机数生成与统计分析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、随机数的魅力与实用性 1. 随机数生成基础 2. 批量生成随机数 二、随机数的高级应用&a…

windows中每日定时执行python脚本,解决问题

由于需要一个每天定时执行的任务&#xff0c;所以需要定时启动&#xff0c;网上看了很多方法&#xff0c;感觉不能在python脚本种写个while true 定时执行&#xff0c;占资源不说还不可靠。 最后考虑通过系统工具定时启动&#xff0c;发现linux中有crontab&#xff0c;windows…

前端 CSS 经典:水波进度样式

前言&#xff1a;简单实现水波进度样式&#xff0c;简单好看。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" cont…

git:Unable to negotiate问题解决

场景说明&#xff1a; 安装了Gitblit(自架的代码仓库服务)发现部分电脑无法推代码&#xff0c;报错误如下&#xff1a; Unable to negotiate with **** port 22: no matching host key type found. Their offer: ssh-rsa 并排队了账户权限问题。 解决方案&#xff1a; 1.打开问…

5.28 学习总结

一.CSS学习(一) 一、CSS简介 1、什么是CSS CSS&#xff1a;Cascading Style Sheet 层叠样式表是一组样式设置的规则&#xff0c;用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离&#xff0c;便于团队开发样式复用&#xff0c;便于网站的后期维护页面的精确…

iptables练习题

目录 练习题1. 显示当前的iptables规则2. 允许所有来自192.168.1.0/24的TCP流量到本机的22端口&#xff08;SSH&#xff09;3. 禁止所有来自10.0.0.0/8的ICMP流量4. 允许所有出站流量5. 拒绝所有来自外部的HTTP流量&#xff08;80端口&#xff0c;tcp协议&#xff09;6. 删除IN…