043 商品详情

文章目录

    • 详情页数据
    • 表结构
    • vo
      • SkuItemVo.java
      • SkuItemSaleAttrVo.java
      • AttrValueAndSkuIdVo.java
      • SpuAttrGroupVo.java
      • GroupAttrParamVo.java
    • pom.xml
    • SkuSaleAttrValueDao.xml
    • SkuSaleAttrValueDao.java
    • AttrGroupDao.xml
    • AttrGroupServiceImpl.java
    • SkuInfoServiceImpl.java
    • SkuSaleAttrValueServiceImpl.java
    • AttrGroupDao.java
    • SkuSaleAttrValueDao.java
    • SkuItemController.java
    • 默认
    • 点击选中

详情页数据

1.sku基本信息

2.sku图片信息(多个图片)

3.spu的销售属性

4.spu的描述信息

5.sku分组规格参数属性值

表结构

详情页

vo

SkuItemVo.java

package com.xd.cubemall.product.vo;

import com.xd.cubemall.product.entity.SkuImagesEntity;
import com.xd.cubemall.product.entity.SkuInfoEntity;
import com.xd.cubemall.product.entity.SpuInfoDescEntity;
import lombok.Data;
import lombok.ToString;

import java.util.List;

@ToString
@Data
public class SkuItemVo {

    //1.sku基本信息
    private SkuInfoEntity info;

    //2.sku图片信息
    private List<SkuImagesEntity> images;


    //3.spu的销售属性组合
    private List<SkuItemSaleAttrVo> attrSales;

    //4.spu描述信息
    private SpuInfoDescEntity desc;

    //5.spu分组(主体,基本信息...)规格属性
    private List<SpuAttrGroupVo> attrGroups;


}

SkuItemSaleAttrVo.java

package com.xd.cubemall.product.vo;


import lombok.Data;
import lombok.ToString;

import java.util.List;

@ToString
@Data
public class SkuItemSaleAttrVo {
    private Long attrId;
    private String attrName;
    //属性值
    private List<AttrValueAndSkuIdVo> attrValues;

}

AttrValueAndSkuIdVo.java

package com.xd.cubemall.product.vo;


import lombok.Data;
import lombok.ToString;

@ToString
@Data
public class AttrValueAndSkuIdVo {

    // skuids组合id
    private String skuIds;

    // 属性值: 白色,128G
    private String attrValue;
}

SpuAttrGroupVo.java

package com.xd.cubemall.product.vo;

import lombok.Data;
import lombok.ToString;

import java.util.List;

@ToString
@Data
public class SpuAttrGroupVo {

    private String groupName;

    // 属性参数
    private List<Attr> attrs;
}

GroupAttrParamVo.java

package com.xd.cubemall.product.vo;


import lombok.Data;
import lombok.ToString;

@ToString
@Data
public class GroupAttrParamVo {
    private Long spuId;
    private Long categoryId;
}

pom.xml


        <!--添加模板技术渲染页面-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

在MySQL中,当启用了ONLY_FULL_GROUP_BY SQL模式时,如果一个SELECT查询包含聚合函数(如GROUP_CONCAT),那么所有非聚合的列都必须在GROUP BY子句中明确指定。这是因为ONLY_FULL_GROUP_BY模式要求所有的结果列要么是通过聚合函数处理的,要么是在GROUP BY子句中明确指定的。

从错误信息来看,查询试图在不使用GROUP BY子句的情况下选择非聚合列v.attr_id、v.attr_name和v.attr_value,同时还使用了聚合函数GROUP_CONCAT(v.sku_id)。这违反了ONLY_FULL_GROUP_BY的规则。

为了解决这个问题,需要修改查询,添加一个GROUP BY子句,包含所有非聚合的列。这样,每个组都会有唯一的attr_id、attr_name和attr_value,而GROUP_CONCAT则会将同一组内的sku_id连接起来。
sql

SkuSaleAttrValueDao.xml

    <resultMap id="spuSaleAttrMap" type="com.xd.cubemall.product.vo.SkuItemSaleAttrVo">
        <result property="attrId" column="attr_id"></result>
        <result property="attrName" column="attr_name"></result>
        <collection property="attrValues" ofType="com.xd.cubemall.product.vo.AttrValueAndSkuIdVo">
            <result property="skuIds" column="skuIds"></result>
            <result property="attrValue" column="attr_value"></result>
        </collection>
    </resultMap>


    <!--sql: tb_sku_info,tb_sku_sale_attr_value-->
    <select id="getSaleAttrs" resultMap="spuSaleAttrMap" parameterType="java.lang.Long">
        SELECT
            v.attr_id,
            v.attr_name,
            v.attr_value,
            GROUP_CONCAT( v.sku_id ) AS skuIds
        FROM
            tb_sku_info i
                LEFT JOIN tb_sku_sale_attr_value v ON i.id = v.sku_id
        WHERE
            spu_id = #{spuId}
        GROUP BY
            v.attr_id,
            v.attr_name,
            v.attr_value;
    </select>

SkuSaleAttrValueDao.java

package com.xd.cubemall.product.dao;

import com.xd.cubemall.product.entity.SkuSaleAttrValueEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xd.cubemall.product.vo.SkuItemSaleAttrVo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * sku销售属性值
 * 
 * @author xuedong
 * @email email@gmail.com
 * @date 2024-08-13 01:36:04
 */
@Mapper
public interface SkuSaleAttrValueDao extends BaseMapper<SkuSaleAttrValueEntity> {
    public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId);
}

AttrGroupDao.xml

    <resultMap id="spuAttrGroupMap" type="com.xd.cubemall.product.vo.SpuAttrGroupVo">
        <result property="groupName" column="groupName"></result>
        <collection property="attrs" ofType="com.xd.cubemall.product.vo.Attr">
            <result property="attrName" column="attrName"></result>
            <result property="attrValue" column="attrValue"></result>
        </collection>
    </resultMap>


    <!--SQL: 根据spuID,categoryId 查询 sku分组规格参数属性值-->

    <select id="getGroupAttr" resultMap="spuAttrGroupMap" parameterType="com.xd.cubemall.product.vo.GroupAttrParamVo">
        SELECT
            g.NAME AS groupName,
            v.attr_name AS attrName,
            v.attr_value AS attrValue
        FROM
            tb_product_attr_value v
                JOIN tb_attr_attrgroup_relation r ON v.attr_id = r.attr_id
                JOIN tb_attr_group g ON r.attr_group_id = g.id
        WHERE
            spu_id = #{spuId}
          AND g.category_id = #{categoryId}
    </select>

AttrGroupServiceImpl.java

    //根据spuID,categoryId 查询 sku分组规格参数属性值
    @Override
    public List<SpuAttrGroupVo> getGroupAttr(Long spuId, Long categoryId) {

        GroupAttrParamVo paramVo = new GroupAttrParamVo();
        paramVo.setSpuId(spuId);
        paramVo.setCategoryId(categoryId);

        List<SpuAttrGroupVo> attrGroupVos = this.baseMapper.getGroupAttr(paramVo);
        return attrGroupVos;
    }

SkuInfoServiceImpl.java

    @Autowired
    private SkuImagesService skuImagesService;

    //注入销售属性组合服务
    @Autowired
    private SkuSaleAttrValueService skuSaleAttrValueService;

    //注入spu描述服务
    @Autowired
    private SpuInfoDescService spuInfoDescService;

    @Autowired
    private AttrGroupService attrGroupService;

    @Override
    public SkuItemVo skuItem(Long skuId) {

        // 新建一个包装类对象
        SkuItemVo itemVo = new SkuItemVo();


        /*
        1.sku基本信息
        2.sku图片信息(多个图片)
        3.spu的销售属性
        4.spu的描述信息
        5.sku分组规格参数属性值
         */


        // 1.根据skuId 查询 sku基本信息
        SkuInfoEntity skuInfoEntity = this.getById(skuId);
        itemVo.setInfo(skuInfoEntity);

        // 获取sku与之对应的spuId
        Long spuId = skuInfoEntity.getSpuId();
        // 获取分类id
        Long categoryId = skuInfoEntity.getCategoryId();

        // 2.根据skuId查询sku图片信息(多个图片),skuId是外键
        List<SkuImagesEntity> imageList = skuImagesService.list(new QueryWrapper<SkuImagesEntity>().eq("sku_id", skuId));
        itemVo.setImages(imageList);

        //3.根据spuID获取spu的销售属性
        List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrs(spuId);
        itemVo.setAttrSales(saleAttrVos);

        //4.根据spuId查询spu的描述信息
        SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getOne(new QueryWrapper<SpuInfoDescEntity>().eq("spu_id",spuId));
        itemVo.setDesc(spuInfoDescEntity);

        //5.根据spuID,categoryId查询 sku分组规格参数属性值
        List<SpuAttrGroupVo> attrGroupVos = attrGroupService.getGroupAttr(spuId,categoryId);
        itemVo.setAttrGroups(attrGroupVos);
        return itemVo;
    }

SkuSaleAttrValueServiceImpl.java

    /**
     * 根据id查询销售属性组合
     * @param spuId
     * @return
     */
    @Override
    public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId) {
        //List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrs(spuId);
        List<SkuItemSaleAttrVo> saleAttrVos = this.baseMapper.getSaleAttrs(spuId);
        return saleAttrVos;
    }

AttrGroupDao.java

package com.xd.cubemall.product.dao;

import com.xd.cubemall.product.entity.AttrGroupEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xd.cubemall.product.vo.GroupAttrParamVo;
import com.xd.cubemall.product.vo.SpuAttrGroupVo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 属性分组表
 * 
 * @author xuedong
 * @email email@gmail.com
 * @date 2024-08-13 01:36:04
 */
@Mapper
public interface AttrGroupDao extends BaseMapper<AttrGroupEntity> {
    //根据spuID,categoryId 查询 sku分组规格参数属性值
    public List<SpuAttrGroupVo> getGroupAttr(GroupAttrParamVo paramVo);
}

SkuSaleAttrValueDao.java

package com.xd.cubemall.product.dao;

import com.xd.cubemall.product.entity.SkuSaleAttrValueEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xd.cubemall.product.vo.SkuItemSaleAttrVo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * sku销售属性值
 * 
 * @author xuedong
 * @email email@gmail.com
 * @date 2024-08-13 01:36:04
 */
@Mapper
public interface SkuSaleAttrValueDao extends BaseMapper<SkuSaleAttrValueEntity> {
    public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId);
}

SkuItemController.java

package com.xd.cubemall.product.web;


import com.xd.cubemall.product.service.SkuInfoService;
import com.xd.cubemall.product.vo.SkuItemVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Controller
public class SkuItemController {


    @Autowired
    private SkuInfoService skuInfoService;

    /**
     * 根据skuId查询商品详情信息
     */

    @GetMapping("/{skuId}.html")
    public String skuItem(@PathVariable Long skuId, Model model){
        // 调用服务层商品详情接口
        SkuItemVo itemVo = skuInfoService.skuItem(skuId);

        // 输出日志
        log.info("商品详情接口,查询的数据:{}",itemVo);

        // 把数据放入模型驱动
        model.addAttribute("item",itemVo);

        // 返回视图页面,做视图数据渲染

        return "item";
    }
}

默认

                                    <a href="javascript:;" th:attr="class=${#lists.contains(#strings.listSplit(attrvalues.skuIds,','),item.info.id.toString())?'sku_attr_value selected':'sku_attr_value'},skus=${attrvalues.skuIds}">

        <!--th:v-bind:class="|{selected:sel('${spec.key}','${arrValue}')}|"-->
<!--                                       th:@click="|selectSpecification('${spec.key}','${arrValue}')|" >-->
<!--                                        <i th:text="${arrValue}"></i>-->[[${attrvalues.attrValue}]]
                                        <span title="点击取消选择">&nbsp;</span>
                                    </a>

点击选中

    $(".sku_attr_value").click(function () {
        // 移除选中状态
        $(this).parent().parent().find(".sku_attr_value").removeClass("selected");
        // 给点击元素添加选中状态属性
        $(this).addClass("selected");

        let skus = new Array();
        //选择不同的规格属性后,根据不同的属性id重新加载相应的数据
        $("a[class='sku_attr_value selected']").each(function () {
            skus.push($(this).attr("skus").split(","));
        })
        // 获取第0个元素
        let sku_1 = skus[0];
        // 白色: skuIds  = {1,3}
        // 128GB : skuIds = {3,9}
        // 白色+128GB 规则属性组合的id : 求交集 ,skuId = 3
        for(let i=1;i<skus.length;i++){
            // 遍历每一个属性的skuids,获取交集
            // 比如:白色: skuIds  = {1,3},128GB : skuIds = {3,9} ,此时: {1,3}.filter({3,9}) = 3
            sku_1 = $(sku_1).filter(skus[i])[0];
        }

        // 拼接请求
        location.href = "http://localhost:8081/"+sku_1+".html";

    })

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

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

相关文章

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候&#xff0c;打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图&#xff0c;网络名往上漂移。 3. 解决办法 …

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于 …

从零开始:如何使用第三方视频美颜SDK开发实时直播美颜平台

开发一个具有实时美颜功能的直播平台&#xff0c;能够显著提高用户体验和内容质量。而利用第三方视频美颜SDK可以大大简化开发过程&#xff0c;加快产品上市速度。本篇文章&#xff0c;小编将从零开始&#xff0c;详细讲解如何使用第三方视频美颜SDK开发一个实时直播美颜平台。…

ROS入门学习ONE

ros入门玩法1&#xff1a;控制小龟龟 终端1输入 sudo apt install ros-noetic-rqt-steering 新建终端2&#xff08;快捷键CtrlAltT)&#xff0c;打开控制台 roscore //启动ros系统 回到原终端 rosrun rosrun rqt_robot_steering rqt_robot_steering 新建终端3&#xff0c;…

shell脚本(二)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

简单理解下基于 Redisson 库的分布式锁机制

目录 简单理解下基于 Redisson 库的分布式锁机制代码流程&#xff1a;方法的调用&#xff1a;具体锁的实现&#xff1a;riderBalance 方法&#xff1a;tryLock 方法&#xff08;重载&#xff09;&#xff1a;tryLock 方法&#xff08;核心实现&#xff09;&#xff1a; 简单理解…

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构&#xff1a; 这几个表总数为100多万&#xff0c;经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图&#xff1a; 界面&#xff1a; SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…

LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))

【LetMeFly】3244.新增道路查询后的最短距离 II&#xff1a;贪心&#xff08;跃迁合并&#xff09;-9行py&#xff08;O(n)&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/shortest-distance-after-road-addition-queries-ii/ 给你一个整数 n 和一个二维…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的&#xff0c;最近优化下无线网络&#xff0c;说新的设备用华为的&#xff0c;然后我是直到要部署的当天才知道用华为设备的&#xff0c;就很无语了&#xff0c;一点准备没有&#xff0c;以下为这次的实际操作记录吧&…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

Bokeh实现大规模数据可视化的最佳实践

目录 引言 一、Bokeh简介 二、安装Bokeh 三、数据准备 四、性能优化 五、创建图表 六、添加交互功能 七、应用案例 八、高级技巧 九、总结 引言 在数据科学领域,数据可视化是一个至关重要的环节。通过可视化,我们可以直观地理解数据的特征和趋势,为数据分析和决策…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点&#xff01;快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …

学习编程,学习中间件,学习源码的思路

01 看的多&#xff0c;内化不足 最近想复习一下编程相关的知识&#xff0c;在复习前我翻开了之前的一些笔记&#xff0c;这些笔记基本都是从书本、视频、博客等摘取记录的&#xff0c;看着这些笔记心里总结&#xff1a;看的多&#xff0c;内化不足。 02 整理大纲 为了解决这个…

hhdb数据库介绍(10-2)

集群管理 计算节点集群 集群管理主要为用户提供对计算节点集群的部署、添加、启停监控、删除等管理操作。 集群管理记录 集群管理页面显示已部署或已添加的计算节点集群信息。可以通过左上角搜索框模糊搜索计算节点集群名称进行快速查找。同时也可以通过右侧展开展开/隐藏更…

AG32既可以做MCU,也可以仅当CPLD使用

Question: AHB总线上的所有外设都需要像ADC一样&#xff0c;通过cpld处理之后才能使用? Reply: 不用。 除了ADC外&#xff0c;其他都是 mcu可以直接配置使用的。 Question: DMA和CMP也不用? Reply: DMA不用。 ADC/DAC/CMP 用。 CMP 其实配置好后&#xff0c;可以直…

贪心算法(1)

目录 柠檬水找零 题解&#xff1a; 代码&#xff1a; 将数组和减半的最少操作次数&#xff08;大根堆&#xff09; 题解&#xff1a; 代码&#xff1a; 最大数&#xff08;注意 sort 中 cmp 的写法&#xff09; 题解&#xff1a; 代码&#xff1a; 摆动序列&#xff0…