尚品汇-(十二)

(1)数据库表结构

根据以上的需求,以此将SKU关联的数据库表结构设计为如下:

base_attr_value:前面学的平台属性值表

我们进行关联,可以从分类导向平台,通过平台过滤商品

(2)平台属性添加

按照提供的属性进行添加更改 

修改AB:改为价格:

修改尺寸:

 修改长度:为机身存储:

机身内存就是机身存储:重复了,可以删除这个机身存储 

添加cpu型号:

商品spu管理

添加销售属性信息

(3)保存skuInfo前期准备

点击添加sku需要两个数据

或获取图片的接口、和获取销售属性的接口

先删除没用的测试数据:rrr

图片加载功能 

spu图片查询接口

功能分析:图片列表是根据spuId得来,涉及到的数据库表spu_image

添加接口实现类

/*** 根据spuId 查询spuImageList* @param spuId* @return*/
List<SpuImage> getSpuImageList(Long spuId);

实现类

@Override
public List<SpuImage> getSpuImageList(Long spuId) {QueryWrapper<SpuImage> queryWrapper = new QueryWrapper<>();queryWrapper.eq("spu_id", spuId);return spuImageMapper.selectList(queryWrapper);
}

创建新的控制器

@Api(tags = "商品SKU接口")
@RestController
@RequestMapping("admin/product")
public class SkuManageController {@Autowiredprivate ManageService manageService;/*** 根据spuId 查询spuImageList* @param spuId* @return*/@GetMapping("spuImageList/{spuId}")public Result<List<SpuImage>> getSpuImageList(@PathVariable("spuId") Long spuId) {List<SpuImage> spuImageList = manageService.getSpuImageList(spuId);return Result.ok(spuImageList);}
}

销售属性查询接口:

 

 

 

SpuSaleAttr :销售属性实体类

package com.atguigu.gmall.model.product;import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.List;/*** <p>* SpuSaleAttr* </p>**/
@Data
@ApiModel(description = "销售属性")
@TableName("spu_sale_attr")
public class SpuSaleAttr extends BaseEntity {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "商品id")@TableField("spu_id")private Long spuId;@ApiModelProperty(value = "销售属性id")@TableField("base_sale_attr_id")private Long baseSaleAttrId;@ApiModelProperty(value = "销售属性名称(冗余)")@TableField("sale_attr_name")private String saleAttrName;// 销售属性值对象集合@TableField(exist = false)List<SpuSaleAttrValue> spuSaleAttrValueList;}

销售属性

/*** 根据spuId 查询销售属性集合* @param spuId* @return*/
List<SpuSaleAttr> getSpuSaleAttrList(Long spuId);

实现类:

@Override
public List<SpuSaleAttr> getSpuSaleAttrList(Long spuId) {return spuSaleAttrMapper.selectSpuSaleAttrList(spuId);
}

SpuSaleAttrMapper :

@Mapper
public interface SpuSaleAttrMapper extends BaseMapper<SpuSaleAttr> {// 根据spuId 查询销售属性集合List<SpuSaleAttr> selectSpuSaleAttrList(Long spuId);}

 创建SpuSaleAttrMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.gmall.product.mapper.SpuSaleAttrMapper"><resultMap id="spuSaleAttrMap" type="com.atguigu.gmall.model.product.SpuSaleAttr" autoMapping="true"><id property="id" column="id"></id><!--一对多--><collection property="spuSaleAttrValueList" ofType="com.atguigu.gmall.model.product.SpuSaleAttrValue" autoMapping="true"><id property="id" column="sale_attr_value_id"></id></collection></resultMap><sql id="spuSaleAttr"> 
sa.id ,sa.spu_id, sa.sale_attr_name,sa.base_sale_attr_id,sv.id sale_attr_value_id,sv.sale_attr_value_name
</sql>
<select id="selectSpuSaleAttrList" resultMap="spuSaleAttrMap">select<include refid="spuSaleAttr"></include>from spu_sale_attr sa inner join spu_sale_attr_value  svon  sa.spu_id=sv.spu_id and sa.base_sale_attr_id=sv.base_sale_attr_idwhere  sa.spu_id=#{spu_id}
</select>
</mapper>

创建新的控制器SkuManagerController:


@Autowired
private ManagerService/*** 根据spuId 查询销售属性和销售属性值集合* @param spuId* @return*/
@GetMapping("spuSaleAttrList/{spuId}")
public Result<List<SpuSaleAttr>> getSpuSaleAttrList(@PathVariable("spuId") Long spuId) {List<SpuSaleAttr> spuSaleAttrList = manageService.getSpuSaleAttrList(spuId);return Result.ok(spuSaleAttrList);
}

 

(3)sku点击保存按钮

实体类:

package com.atguigu.gmall.model.product;import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.math.BigDecimal;
import java.util.List;/*** <p>* SkuInfo* </p>**/
@Data
@ApiModel(description = "SkuInfo")
@TableName("sku_info")
public class SkuInfo extends BaseEntity {public SkuInfo(){}public SkuInfo(Long skuId){setId(skuId);}//	判断去重的话,自动调用equals 方法。public boolean equals(SkuInfo skuInfo){return getId().equals(skuInfo.getId());}private static final long serialVersionUID = 1L;@ApiModelProperty(value = "商品id")@TableField("spu_id")private Long spuId;@ApiModelProperty(value = "价格")@TableField("price")private BigDecimal price;@ApiModelProperty(value = "sku名称")@TableField("sku_name")private String skuName;@ApiModelProperty(value = "商品规格描述")@TableField("sku_desc")private String skuDesc;@ApiModelProperty(value = "重量")@TableField("weight")private String weight;@ApiModelProperty(value = "品牌(冗余)")@TableField("tm_id")private Long tmId;@ApiModelProperty(value = "三级分类id(冗余)")@TableField("category3_id")private Long category3Id;@ApiModelProperty(value = "默认显示图片(冗余)")@TableField("sku_default_img")private String skuDefaultImg;@ApiModelProperty(value = "是否销售(1:是 0:否)")@TableField("is_sale")private Integer isSale;@TableField(exist = false)List<SkuImage> skuImageList;@TableField(exist = false)List<SkuAttrValue> skuAttrValueList;@TableField(exist = false)List<SkuSaleAttrValue> skuSaleAttrValueList;
}

 

需要用到四张表 

创建对应数据库表实体类,以及接口mapper

SkuInfoMapper:

@Mapper
public interface SkuInfoMapper extends BaseMapper<SkuInfo> {
}

SkuImageMapper: 

@Mapper
public interface SkuImageMapper extends BaseMapper<SkuImage> {
}

SkuAttrValueMapper :

@Mapper
public interface SkuAttrValueMapper extends BaseMapper<SkuAttrValue> {
}

SkuSaleAttrValueMapper :

@Mapper
public interface SkuSaleAttrValueMapper extends BaseMapper<SkuSaleAttrValue> {}

编写接口与实现

/*** 保存数据* @param skuInfo*/
void saveSkuInfo(SkuInfo skuInfo);

 

判断集合是否为空可以这样:

if (skuImageList != null && skuImageList.size() > 0) 

需要先添加sku_info表生成skuid,下面的表插入会用到

图片值: 

平台属性值: 

 

销售属性值: 

 

实现类:

@Override
@Transactional(rollbackFor = Exception.class)
public void saveSkuInfo(SkuInfo skuInfo) {/*skuInfo 库存单元表 --- spuInfo!skuImage 库存单元图片表 --- spuImage!skuSaleAttrValue sku销售属性值表{sku与销售属性值的中间表} --- skuInfo ,spuSaleAttrValueskuAttrValue sku与平台属性值的中间表 --- skuInfo ,baseAttrValue*/skuInfoMapper.insert(skuInfo);//保存图片List<SkuImage> skuImageList = skuInfo.getSkuImageList();if (skuImageList != null && skuImageList.size() > 0) {// 循环遍历for (SkuImage skuImage : skuImageList) {skuImage.setSkuId(skuInfo.getId());skuImageMapper.insert(skuImage);}}//保存销售属性List<SkuSaleAttrValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();// 调用判断集合方法if (!CollectionUtils.isEmpty(skuSaleAttrValueList)) {for (SkuSaleAttrValue skuSaleAttrValue : skuSaleAttrValueList) {skuSaleAttrValue.setSkuId(skuInfo.getId());skuSaleAttrValue.setSpuId(skuInfo.getSpuId());skuSaleAttrValueMapper.insert(skuSaleAttrValue);}}//保存平台属性List<SkuAttrValue> skuAttrValueList = skuInfo.getSkuAttrValueList();if (!CollectionUtils.isEmpty(skuAttrValueList)) {for (SkuAttrValue skuAttrValue : skuAttrValueList) {skuAttrValue.setSkuId(skuInfo.getId());skuAttrValueMapper.insert(skuAttrValue);}}
}

继续在控制器添加代码:SkuManageController

/*** 保存sku* @param skuInfo* @return*/
@PostMapping("saveSkuInfo")
public Result saveSkuInfo(@RequestBody SkuInfo skuInfo) {// 调用服务层manageService.saveSkuInfo(skuInfo);return Result.ok();
}

sku信息表: 

图片表: 

sku平台属性关联表:

sku销售属性值表:

 

它来自:spu销售属性值表:

 

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

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

相关文章

MySQL—统计函数和数学函数以及GROUP BY配合HAVING

合计/统计函数 count -- 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生&#xff1f; SELECT COUNT(*) FROM student -- 统计数学成绩大于 90 的学生有多少个&#xff1f; SELECT COUNT(*) FROM student WHERE math > 90 -- 统计总分大于 250 的人数有多少&…

【SpringCloud应用框架】Nacos命名空间、分组和DataID三者关系

第五章 Spring Cloud Alibaba Nacos之命名空间、分组和DataID三者关系 文章目录 一、名词解释三者关系 二、切换不同环境DataID方案Group方案Namespace空间方案 一、名词解释 命名空间&#xff08;Namespace&#xff09; ​用于进行租户粒度的配置隔离。不同的命名空间下&…

GraphRAG

什么是RAG&#xff1f; RAG 是一种自然语言查询方法&#xff0c;用于通过外部知识增强现有的LLM&#xff0c;因此如果问题需要特定知识&#xff0c;问题的答案会更相关。它包括一个检索信息组件&#xff0c;用于从外部源获取附加信息&#xff0c;也称为“基础上下文”&#xf…

pnpm介绍

PNPM 是一个 JavaScript 包管理器&#xff0c;类似于 npm 和 Yarn。它的全称是 "Performant npm"&#xff0c;主要设计目标是优化包的安装和管理过程&#xff0c;以提升速度和效率。PNPM 的主要特点包括&#xff1a; 符号链接&#xff08;Symlink&#xff09;&#x…

AI产品经理发展与规划

今天引用高飞老师的讲课内容&#xff0c;分享一下&#xff0c;何为AI产品经理&#xff1f;这个话题不仅仅希望介绍AI产品经理的工作方式等方面的内容&#xff0c;更多的在于讨论未来产品经理这个行业应该如何发展&#xff1f;行业壁垒在何处&#xff1f;如何应对中年危机&#…

名企面试必问30题(二十六)——毕业这么久了,为什么还没有找到工作?

回答一&#xff1a; “毕业后的这段时间&#xff0c;我一直在努力寻找最适合自己发展的岗位。我没有急于随便接受一份工作&#xff0c;而是希望能够进入一个与我的专业技能和职业规划高度匹配的公司。在这个过程中&#xff0c;我不断提升自己的技术能力&#xff0c;学习新的测…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中&#xff0c;比如电子围栏/客流统计等&#xff0c;我们需要手动绘制一些感兴趣&#xff08;Region of Interest&#xff0c;简称ROI&#xff09;区域。 在这里&#xff0c;我们基于Python和PyQt5框架开发了一款桌面应用程序&#xff0c;允许用…

c#类型转换和常见集合类型

目录 1. 整数转换&#xff0c;整数和字符串&#xff0c;字符串和整数之间的转换怎么实现&#xff1f; 2. 日期转换&#xff0c;获取当前日期&#xff0c;字符串转日期&#xff0c;日期转字符串怎么实现&#xff1f; 3. 举例一维、二维、三维数组 4. 需求&#xff1a;有个88…

事务(数据库)

是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;事物会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 create table account(id int auto_increment primary key comment 主键ID,name va…

VPN 的入门介绍

VPN&#xff08;虚拟专用网络&#xff09; 简介 虚拟专用网络&#xff0c;简称虚拟专网&#xff08;VPN&#xff09;&#xff0c;其主要功能是在公用网络上建立专用网络&#xff0c;进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…

14-48 剑和诗人22 - RAG 的主要痛点和解决方案

​​​​​ 检索增强生成 (RAG) 模型已成为一种有前途的方法&#xff0c;它利用存储在文档中的外部知识来提高生成文本的准确性和相关性。通过检索和调节相关的上下文文档&#xff0c;与传统语言模型相比&#xff0c;RAG 模型可以产生更真实、更深入和更具体的响应。 然而&…

诸葛亮的空城计 - 代理模式

定场诗 “无形之中蕴含至理&#xff0c;虚实相生方见大道。” 在三国演义中&#xff0c;诸葛亮的空城计可谓神来之笔。这看似冒险的策略&#xff0c;实则蕴含深意。今天&#xff0c;我们将透过空城计&#xff0c;一窥软件设计中代理模式的奥秘。 西城无人旦夕危&#xff0c;…

君方智能设计平台-事务管理技术方案

1.背景介绍 事务处理是指对数据进行一组操作&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;以确保数据的一致性和完整性。软件的事务管理主要实现方案主要涉及以下几个方面&#xff1a; &#xff08;1&#xff09;数据一致性&#xff1a;在CAD软件中…

STM32实现看门狗(HAL库)

文章目录 一. 看门狗1. 独立看门狗&#xff08;IWDG&#xff09;1.1 原理1.2 相关配置1.3 相关函数 2. 窗口看门狗&#xff08;WWDG&#xff09;2.1 原理2.2 相关配置2.3 相关函数 一. 看门狗 单片机在日常工作中常常会因为用户配置代码出现BUG&#xff0c;而导致芯片无法正常工…

Flask项目搭建及部署(完整版!全网最全)

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目&#xff1a; 创建完成后整个项目结构树&#xff1a; app.py: 项⽬管理⽂件&#xff0c;通过它管理项⽬。 static: 存放静态文…

map和set的原理、优劣势、应用场景和示例代码,统统告诉你。

map和set的原理都是基于哈希表实现的&#xff0c;通过哈希值来快速查找和插入元素&#xff0c;从而实现高效的数据存储和管理&#xff0c;那么他们之间有什么不同呢&#xff0c;该如何选择&#xff0c;本文带你了解。 一、map和set的原理 map和set都是数据结构&#xff0c;用…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据&#xff0c;对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署&#xff08;命令截图版&#xff09;-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …

java ReadWriteLock接口

在 Java 中&#xff0c;ReadWriteLock 接口的实现类ReentrantReadWriteLock 类提供了一种允许多个线程同时读取某一资源但只允许一个线程写的锁定机制。这种机制可以提高并发性能&#xff0c;特别是在读操作远多于写操作的场景下。 特性&#xff1a; 可重入&#xff1b;不存…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

基于SpringBoot的休闲娱乐代理售票系统

本系统主要包括管理员和用户两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、用户管理、折扣票管理、分类管理、订单信息管理、退票信息管理、出票信息管理、系统管理等功能的管理系统。 &#x1f495;&#x1f495;作者&#xff1a;Weirdo &#x1f495;&#x…