商品上线搜索服务

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ学习(1) 快速入门

mq的一些前置知识和概念知识可以看这篇文章——SpringCloud入门(3) RabbitMQ&#xff0c;比如常见mq的对比等等&#xff0c;这篇文章不再赘述。 目录 RocketMQ概念、安装与配置docker配置 RocketMQ快速入门**同步消息消费模式 **异步消息*单向消息**延迟消息*顺序消息批量消息事…

通过提示工程将化学知识整合到大型语言模型中

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正成为科学研究的新兴工具。这些模型以其卓越的语言处理能力和零样本推理而闻名&#xff0c;为解决传统科学问题提供了全新的途径。然而&#xff0c;LLMs在特定科学领域的应用面临挑战&#…

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

【算法】位运算算法——两整数之和

题解&#xff1a;两整数之和(位运算算法) 目录 1.题目2.位运算算法3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.位运算算法 这个题目难点就在于不能用、- 那什么能够代替加号呢&#xff1f; 既然数的层面不能用号&#xff0c;那二进制的角度去用号即可。 恰好&a…

JavaScript(ES6)入门

ES6 1、介绍 ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript 语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。…

AAAI2024 基于扩散模型 多类别 工业异常检测 DiAD

前言 本文分享一个基于扩散模型的多类别异常检测框架&#xff0c;用于检测工业场景的缺陷检测或异常检测。 设计SG语义引导网络&#xff0c;在重建过程中有效保持输入图像的语义信息&#xff0c;解决了LDM在多类别异常检测中的语义信息丢失问题。高效重建&#xff0c;通过在潜…

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总&#xff1a;待办事项的总数已完成&#xff1a;待办事项里面有多少条完成的待办完成比例&#xff1a;已完成和汇总之间的比例备忘录&#xff1a;显示备忘录的总数待办事项&#xff1a;显示待办事项未完成的集合备忘录&…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景&#xff1a; 同学找到我期望做一个天水麻辣烫的网页&#xff0c;想复用以前做过的课设&#xff0c;结合他的实际需求&#xff0c;让我们来看看这个系统吧~ 项目功能与使用技术概述&#xff1a; 里面嵌入了6个子系统&#xff0c;其中餐饮系统可以进行餐馆信息添加、修改…

【ARFoundation自学03】平面追踪可视化效果美化

对已检测到的平面默认的渲染效果显得有些生硬和突兀&#xff0c;有时我们需要更加友好、美观的的平面虚拟界面&#xff0c;这时就需要对已检测到的平面定制个性化的可视方案。为达到更好的视觉效果&#xff0c;处理的思路如下。 视觉效果前后对比&#xff01; &#xff08;本节…

Android Compose 七:常用组件 Image

1 基本使用 Image(painter painterResource(id R.drawable.ic_wang_lufei), contentDescription "" ) // 图片Spacer(modifier Modifier.height(20.dp))Image(imageVector ImageVector.vectorResource(id R.drawable.ic_android_black_24dp), contentDescript…

Nature 正刊!瑞典于默奥大学研究团队在研究全球河流和溪流的甲烷排放中取得新进展

甲烷(CH4)是一种强有力的温室气体&#xff0c;自工业革命以来&#xff0c;其在大气中的浓度增加了两倍。有证据表明&#xff0c;全球变暖增加了淡水生态系统的 CH4 排放&#xff0c;为全球气候提供了积极的反馈。然而&#xff0c;对于河流和溪流来说&#xff0c;甲烷排放的控制…

618有什么宠物空气净化器推荐?希喂FreAir Lite宠物空气净化器真实体验

一、宠物空气净化器的必要性 掉毛季又来了&#xff0c;猫咪的毛发满天飞&#xff0c;怎么办&#xff1f;我家里的猫咪一到换毛季就掉满地的毛发&#xff0c;尤其喜欢在家里奔跑打闹&#xff0c;结果整个房间都是毛。为了减少家里空气中的浮毛&#xff0c;你都做过哪些努力呢&a…

电脑出现:excel词典(xllex.dll)文件丢失或损坏的错误提示怎么办?有效的将丢失的xllex.dll修复

当遇到 Excel 提示“词典 (xllex.dll) 文件丢失或损坏”的问题时&#xff0c;通常意味着该动态链接库文件&#xff08;Dynamic Link Library&#xff0c;DLL&#xff09;&#xff0c;它与拼写检查功能相关联的&#xff0c;无法被正确找到或者合适地使用。那么有什么办法可以解决…

空间转录组数据的意义

10X空间转录组Visium学习笔记&#xff08;三&#xff09;跑通Visium全流程记录 | 码农家园 (codenong.com) 这两个的区别是&#xff1a;一个是像素的位置信息&#xff0c;一个是阵列的位置信息

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

设计模型-系统架构师(三)

1、按照《中华人民共和国著作权法》的权利保护期&#xff0c;署名权和修改权 是永久保护的。 发表权、使用权和获取报酬权 保护期限 作者终生和死后的50年。 2、&#xff08;重要&#xff09;面向对象的分析模型主要由 顶层架构图、用例与用例图和&#xff08;&#xff09;构成…

CTF网络安全大赛简单的web抓包题目:HEADache

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 题目 描  述: > Wanna learn about some types of headache? > Lets dig right into it! 下面是题目源代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"&…

基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善

前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客 本篇将完善主界面的管理员入库和出库功能&#xff0c;同样的&#xff0c;管理员入库和出库的设计套路适用于动态表的录入和编辑 首先还是介绍一下本项目将要实现的功能 &#xf…

对象解构与迭代器的猫腻?

前言 变量的解构赋值是前端开发中经常用到的一个技巧&#xff0c;比如&#xff1a; // 对象解构 const obj { a: 1, b: 2 }; const { a, b } obj; console.log(a, b)数组解构 const arr [1, 2, 3]; const [a, b] arr; console.log(a, b)工作中我们最经常用的就是类似上面…