商品上线搜索服务

news2025/1/10 10:26:16

文章目录

    • 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
    @Override
    public PageUtils querySearchPageByCondition(Map<String, Object> params) {
        // 创建一个查询条件对象
        QueryWrapper<SkuInfoEntity> queryWrapper = new QueryWrapper<>();
        // 获取keyword
        String keyword = (String) params.get("keyword");
        // 如果keyword不为空,那么就设置sku_id和sku_name的查询条件
        if (StringUtils.isNotBlank(keyword)) {
            // 查询条件为sku_id等于keyword或者sku_name包含keyword
            queryWrapper.and((wrapper) -> {
                wrapper.eq("sku_id", keyword).or().like("sku_name", keyword);
            });
        }
        // 获取三级分类catalog3Id
        String catalog3Id = (String) params.get("catalog3Id");
        // 如果catalog3Id不为空,并且不等于0,那么就设置catalog_id的查询条件
        if (StringUtils.isNotBlank(catalog3Id) && !"0".equalsIgnoreCase(catalog3Id)) {
            queryWrapper.eq("catalog_id", catalog3Id);
        }
        // 获取brandId
        String 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 {
    @Resource
    private 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
    // 获取所有上架商品的id
    List<Long> getAllUpSpuId();
2.SpuInfoServiceImpl.java
    @Override
    public List<Long> getAllUpSpuId() {
        // 查询所有publish_status为1的spu的id
        List<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 {
//增加 pageNuw
            if (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.coloradmin.cn/o/1709243.html

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

相关文章

【Python】 删除列表元素的简单方法

基本原理 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种非常灵活的数据结构&#xff0c;它允许我们存储一系列的元素。有时&#xff0c;我们需要根据元素的值来删除列表中的特定元素。虽然Python没有内置的函数直接通过值来删除列表中的元素&#xff0c;但我…

JVM学习-彻底搞懂Java自增++

从字节码角度分析i和i的区别 public void method6() {int i 10;i; //在局部变量表上直接加1}public void method7() {int i 10;i; //字节码同i}public void method8() {int i 10;int a i; //通过下图可以看出先将局部变量表中的值push到操作数栈&#xff0c;然…

线性回归计算举例

使用正规方程计算&#xff08;一元线性回归&#xff09; import numpy as np import matplotlib.pyplot as plt # 转化成矩阵 X np.linspace(0, 10, num 30).reshape(-1, 1) # 斜率和截距&#xff0c;随机生成 w np.random.randint(1, 5, size 1) b np.random.randint(1,…

建立开源人工智能:一种呼吁

建立开源人工智能&#xff1a;一种呼吁 编译 李升伟 人工智能&#xff08;AI&#xff09;推动整个社会、经济和科学的创新。我们认为&#xff0c;必须根据开源原则建立人工智能技术&#xff0c;以促进人工智能技术的可访问性、协作性、责任性和互操作性。 计算机科学界有着接受…

C++算术运算和自增自减运算

一 引言 表示运算的符号称为运算符。 算术运算&#xff1b; 比较运算&#xff1b; 逻辑运算&#xff1b; 位运算&#xff1b; 1 算术运算 算术运算包括加、减、乘、除、乘方、指数、对数、三角函数、求余函数&#xff0c;这些都是算术运算。 C中用、-、*、/、%分别表示加、减…

【项目教程】FFmpeg+SDL2实现视频播放器

一、前言 学习ffmpeg和sdl&#xff0c;并编写一个视频播放器&#xff0c;是一个很好的音视频开发项目。 虽然关于视频播放器的原理已经有很多人在博客中进行了讲解&#xff0c;但是很多人不提供视频和代码&#xff0c;这也是我写这篇博客的主要原因。 二、在视频播放器中&am…

『哈哥赠书 - 53期』-『深入浅出 Spring Boot 3.x』

⭐️ 《深入浅出 Spring Boot 3.x》 ⭐️ 学习Spring Boot的必读之书 在 Java 后端开发领域&#xff0c;功能强大的 Spring 开源框架不仅是首选&#xff0c;也是事实上的标准。但由于 Spring 存在配置烦琐、部署不易、依赖管理困难等问题&#xff0c;因此基于 Spring 的快速开…

进程互斥经典问题(读写者问题、理发店问题)

目录 读写者问题 问题描述 问题分析 进程互斥问题三部曲 读者写者算法实现 一、找进程——确定进程关系 二、找主营业务 三、找同步约束 a.互斥 b.资源 c.配额 理发店问题 问题描述 问题分析 进程互斥问题三部曲 理发店问题算法实现 一、找进程——确定进程…

微信小程序毕业设计-校车购票系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

高中生是否需要上电子阅览室

高中生是否需要上电子阅览室&#xff0c;取决于学生的学习需求和个人喜好。以下是一些考虑因素&#xff1a; 1. 便利性&#xff1a;电子阅览室通常提供电脑设备和网络连接&#xff0c;方便学生在线获取学习资源。对于家中没有电脑或者网络不稳定的学生&#xff0c;上电子阅览室…

“一带一路”六国国际拳王冠军赛特克斯站新闻发布会顺利举行

实习记者&#xff1a;喀兰姆罕 5月24日&#xff0c;“一带一路”六国国际拳王冠军赛特克斯站新闻发布会在特克斯县阿克塔斯姑娘峰景区举行。这次拳王冠军赛事由新疆广播电视台、特克斯镇人民政府&#xff0c;特克斯县文化体育广播电视和旅游局主办&#xff0c;将于6月15日在特…

mysql 01 linux 上安装mysql服务端

01.linux安装 MySQL的大部分安装包都包含了服务器程序和客户端程序&#xff0c;不过在Linux下使用RPM包时会有单独的服 务器RPM包和客户端RPM包&#xff0c;需要分别安装。 1.查看是否已经安装了MySQL rpm -qa | grep mysql如果什么都没有&#xff0c;就是还没有装过MySQL …

分支机构多,如何确保文件跨域传输安全可控?

随着企业全球化发展&#xff0c;分支机构的分布越来越广泛&#xff0c;跨域文件传输需求也随之增加。然而&#xff0c;跨域文件传输面临的数据安全和传输效率问题&#xff0c;使得构建一个安全、可控的文件交换系统成为迫切需求。FileLink跨网文件交换系统通过综合的技术手段和…

Jenkins常用插件与应用详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jenkins是一个平台我们通过安装插件来解决我们想要完成的任务 1、Jenkins常用插件 Allure&#…

香橙派 AIpro初体验

香橙派&#xff08;Orange Pi&#xff09;AI Pro开发板是一款高性能的AI开发板&#xff0c;由香橙派联合华为精心打造。香橙派&#xff08;Orange Pi&#xff09;&#xff0c;作为深圳市迅龙软件有限公司倾力打造的开源产品品牌&#xff0c;致力于向全球个人及企业用户提供卓越…

QT学习(20):QStyle和自定义样式

QStyle 样式&#xff08;继承自QStyle类&#xff09;代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制&#xff0c;确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…

stream-流的效率

背景 使用流批量处理数据的时候&#xff0c;我们最关注的肯定是效率问题数据批量处理分为4类 原始的for循环处理基本类型基本类型包装流原始的for循环处理包装类型原始的依稀那个流Stream.of(1,2,3,4) 对比&#xff08;单线程&#xff09; 任何是时候&#xff0c;原始的for循环…

go select

select 是与 switch 相似的控制结构&#xff0c;与 switch 不同的是&#xff0c;select 中虽然也有多个 case&#xff0c;但是这些 case 中的表达式必须都是 channel 的收发操作。 select 能够让 goroutine 同时等待多个 channel 可读或者可写&#xff0c;在多个 channel 状态改…

Swift 属性

属性 一、存储属性1、常量结构体实例的存储属性2、延时加载存储属性3、存储属性和实例变量 二、计算属性1、简化 Setter 声明2、简化 Getter 声明3、只读计算属性 三、属性观察器四、属性包装器1、设置被包装属性的初始值2、从属性包装器中呈现一个值 五、全局变量和局部变量六…