尚品汇_第5章_ 商品sku保存

article/2025/10/3 8:03:18

尚品汇_第5章_ 商品sku保存

文章目录

  • 尚品汇_第5章_ 商品sku保存
  • 一、业务介绍
    • 1.1 数据库表结构
    • 1.2 数据准备
      • 1.1 平台属性添加
      • 1.2 商品spu管理
  • 二、保存skuInfo功能
    • 2.1 图片加载功能
      • 2.1.1 添加接口实现类
      • 2.1.2 添加控制器
    • 2.2 销售属性
      • 2.2.1 编写接口以及实现类
      • 2.2.2 编写控制器
    • 2.3 点击保存按钮
      • 2.3.1 创建mapper
      • 2.3.2 编写接口与实现
      • 2.3.3 编写控制器
    • 2.4 查询sku列表以及上下架处理
      • 2.4.2 编写控制器

一、业务介绍

1.1 数据库表结构

根据以上的需求,以此将SKU关联的数据库表结构设计为如下:
在这里插入图片描述

1.2 数据准备

1.1 平台属性添加

在这里插入图片描述

1.2 商品spu管理

在这里插入图片描述

添加销售属性信息

在这里插入图片描述

二、保存skuInfo功能

2.1 图片加载功能

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

2.1.1 添加接口实现类

接口


/*** 根据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);
}

2.1.2 添加控制器

controller

@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);}
}

2.2 销售属性

2.2.1 编写接口以及实现类

接口:

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

实现类:

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

mapper

@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>

2.2.2 编写控制器

/*** 根据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);
}

2.3 点击保存按钮

2.3.1 创建mapper

创建对应数据库表实体类,以及接口mapper
@Mapper
public interface SkuInfoMapper extends BaseMapper<SkuInfo> {
}
@Mapper
public interface SkuImageMapper extends BaseMapper<SkuImage> {
}
@Mapper
public interface SkuAttrValueMapper extends BaseMapper<SkuAttrValue> {
}
@Mapper
public interface SkuSaleAttrValueMapper extends BaseMapper<SkuSaleAttrValue> {}

2.3.2 编写接口与实现

接口

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

实现类

实现类
@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);}}
}

2.3.3 编写控制器

SkuManageController

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

2.4 查询sku列表以及上下架处理

在ManageService 中添加

/*** SKU分页列表* @param pageParam* @return*/
IPage<SkuInfo> getPage(Page<SkuInfo> pageParam);
/*** 商品上架* @param skuId*/
void onSale(Long skuId);/*** 商品下架* @param skuId*/
void cancelSale(Long skuId);接口实现类
@Override
public IPage<SkuInfo> getPage(Page<SkuInfo> pageParam) {QueryWrapper<SkuInfo> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("id");IPage<SkuInfo> page = skuInfoMapper.getPage(pageParam, queryWrapper);return page;
}@Override
@Transactional
public void onSale(Long skuId) {// 更改销售状态SkuInfo skuInfoUp = new SkuInfo();skuInfoUp.setId(skuId);skuInfoUp.setIsSale(1);skuInfoMapper.updateById(skuInfoUp);
}@Override
@Transactional
public void cancelSale(Long skuId) {// 更改销售状态SkuInfo skuInfoUp = new SkuInfo();skuInfoUp.setId(skuId);skuInfoUp.setIsSale(0);skuInfoMapper.updateById(skuInfoUp);
}

2.4.2 编写控制器

BaseManageController 控制器

/*** SKU分页列表* @param page* @param limit* @return*/
@GetMapping("/list/{page}/{limit}")
public Result index(@PathVariable Long page,@PathVariable Long limit) {Page<SkuInfo> pageParam = new Page<>(page, limit);IPage<SkuInfo> pageModel = manageService.getPage(pageParam);return Result.ok(pageModel);
}/*** 商品上架* @param skuId* @return*/
@GetMapping("onSale/{skuId}")
public Result onSale(@PathVariable("skuId") Long skuId) {manageService.onSale(skuId);return Result.ok();
}/*** 商品下架* @param skuId* @return*/
@GetMapping("cancelSale/{skuId}")
public Result cancelSale(@PathVariable("skuId") Long skuId) {manageService.cancelSale(skuId);return Result.ok();
}

http://chatgpt.dhexx.cn/article/PYO2Rir0.shtml

相关文章

js实现商品sku组合

const data [[红色,绿色,金色,青色,白色],[M,L,XL,XXL,XXXL],[男装,女装] ] var sku getSku(data)function getSku(data) {let newArr [];let delimiter "|(_##sku##_)|"; // 分隔符&#xff0c;避免sku中出现相同字符出现数据丢失情况function get(index, arr, …

java实现商品sku_jquery实现商品sku多属性选择功能(商品详情页)

SKUStock Keeping Unit(库存量单位)。即库存进出计量的基本单元&#xff0c;可以是以件&#xff0c;盒&#xff0c;托盘等为单位。 SKU是用来定价和管理库存的&#xff0c;比如一个产品有很多颜色&#xff0c;很多配置&#xff0c;每个颜色和配置的组合都会形成新的产品&#x…

商品sku 和批量编辑 js算法

这一段时间在搞商品后台的系统&#xff0c;其中关于通过商品的销售属性&#xff0c;生成SKU的处理&#xff0c;这里说明一下。 /*** 生成笛卡尔积* returns {*}*/ function descartes(array){if( array.length < 2 ) return array[0] || [];return [].reduce.call(array, fu…

laravel-admin 结合搭配商品sku

本文章基于jade 的基础上&#xff0c;完善部分功能。多谢jade提供sku方案 多个规格名&#xff0c;只显示2个添加规则值&#xff0c;保留已有的信息保存数据库后&#xff0c;json数据会自动排序 (2020-09-21 新增) Form 扩展 – 商品Sku 1.安装&#xff1a; composer requi…

商品SKU系统

如何设计库存&#xff0c;哪些库存呢&#xff1f;分类属性的库存&#xff1a;不同颜色 不同尺码的属性的库存 &#xff0c;这些就体现了商品的SKU&#xff0c;至于什么是SKU&#xff0c;自己去百度一下哈&#xff0c;所以首先我们就要设计商品Sku表以及关系表了 总体思路 1.…

java实现商品sku_商品SKU功能设计与优化

SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/… 摘要 原来的商品SKU设计存在着两个问题,一个是SKU表设计上面比较固化,无法扩展。另一个是当修改了商品信息之后,商品SKU的ID会发生变化,由于购物车表和订单商品表都关联了商品SKU的ID,这样就会导致匹…

sku mysql_商品sku处理

简单来说&#xff0c;一个电商类网站&#xff0c;根据平台的不同&#xff0c;商品的属性自然也就不同。 一般情况来说&#xff0c;一个商品 goods_id 对应多个 sku_id ; 设计表时我们会采取这样的方式&#xff1a; 产品表  ---   产品sku表  ---  产品基本属性表(产品属…

一个商品SKU是怎么生成的

首先说一说什么是SKU。。。。。。。自己百度去。。。 类似京东上面&#xff0c;未来人类S5这个台笔记本&#xff08;没错&#xff0c;我刚入手了&#xff09; 都是S5这个型号&#xff0c;但是因为CPU,显卡&#xff0c;内存&#xff0c;硬盘等不同&#xff0c;价格也不一样。CPU…

商品SKU

前言 最近项目开发涉及商品SKU&#xff0c;商品SKU计算原理就是笛卡尔积&#xff0c;下面对相关内容做一下总结。 一、什么是SKU SKUStock Keeping Unit(库存量单位)&#xff0c;即库存进出计量的单位&#xff0c;可以是以件&#xff0c;盒&#xff0c;托盘等为单位。针对电商而…

深度学习(二)---算法岗面试题

● 神经网络为什么用交叉熵 参考回答&#xff1a; 通过神经网络解决多分类问题时&#xff0c;最常用的一种方式就是在最后一层设置n个输出节点&#xff0c;无论在浅层神经网络还是在CNN中都是如此&#xff0c;比如&#xff0c;在AlexNet中最后的输出层有1000个节点&#xff0c…

深度学习面试题常见问答

目录 有哪些方法可以避免过拟合? 造成过拟合的原因&#xff1a; 解决办法&#xff1a; dropout在训练时和推理时的区别是什么&#xff1f; L1和L2正则化的区别&#xff1f;为什么L1比L2更稀疏&#xff1f; Batch Size大小如何影响收敛速度&#xff1f; BN的原理&#x…

机器学习、深度学习笔试题面试题整理

机器学习、深度学习笔试题 面试题总结 整理看到的内容&#xff0c;以免忘记 里面添加参考的链接&#xff0c;感谢各位大佬 感受野如何计算&#xff1f; 参考链接&#xff1a;https://blog.csdn.net/a841454735/article/details/88558906 感受野指的是一个特定的 CNN 特征&am…

深度学习(三)----算法岗面试题

● 神经网络为啥用交叉熵。 参考回答&#xff1a; 通过神经网络解决多分类问题时&#xff0c;最常用的一种方式就是在最后一层设置n个输出节点&#xff0c;无论在浅层神经网络还是在CNN中都是如此&#xff0c;比如&#xff0c;在AlexNet中最后的输出层有1000个节点&#xff0c;…

深度学习(二)-----算法岗面试题

● 深度学习了解多少&#xff0c;有看过底层代码吗&#xff1f;caffe,tf? ● 除了GMM-HMM&#xff0c;你了解深度学习在语音识别中的应用吗&#xff1f; 参考回答&#xff1a; 讲了我用的过DNN-HMM&#xff0c;以及与GMM-HMM的联系与区别&#xff1b;然后RNNCTC&#xff0c;这…

深度学习面试题-2

1. 下列哪一项属于特征学习算法&#xff08;representation learning algorithm&#xff09;&#xff1f; A K近邻算法 B 随机森林 C 神经网络 D 都不属于 正确答案是&#xff1a;C&#xff0c; 您的选择是&#xff1a;C 解析&#xff1a;神经网络会将数据转化为更适合解决目…

深度学习面试题总结1-20

1.CNN的卷积核是单层还是多层的&#xff1f; 描述网络模型中某层的厚度&#xff0c;通常用名词通道channel数或者特征图feature map数。不过人们更习惯把作为数据输入的前层的厚度称之为通道数&#xff08;比如RGB三色图层称为输入通道数为3&#xff09;&#xff0c;把作为卷积…

深度学习计算机视觉常见的29道面试题及解析

点击上方&#xff0c;选择星标或置顶&#xff0c;不定期资源大放送&#xff01; 阅读大概需要15分钟 Follow小博主&#xff0c;每天更新前沿干货 作者丨我要鼓励娜扎知乎 来源丨https://zhuanlan.zhihu.com/p/89587997 编辑丨极市平台 导读 正值秋招进行时&#xff0c;本文收集…

深度学习面试题-3

1. 梯度爆炸问题是指在训练深度神经网络的时候&#xff0c;梯度变得过大而损失函数变为无穷。在RNN中&#xff0c;下面哪种方法可以较好地处理梯度爆炸问题&#xff1f; A 用改良的网络结构比如LSTM和GRUs B 梯度裁剪 C Dropout D 所有方法都不行 正确答案是&#xff1a;B&am…

深度学习算法面试题总结(38题)

原文链接:https://blog.csdn.net/attitude_yu/article/details/80963323 1. 什么是凸集、凸函数、凸学习问题&#xff1f; 凸集&#xff1a;若对集合C中任意两点u和v&#xff0c;连接他们的线段仍在集合C中&#xff0c;那么集合C是凸集。 公式表示为&#xff1a;αu(1-α)v∈C…

深度学习笔试、面试题 一

1、神经网络模型&#xff08;Neural Network&#xff09;因受人类大脑的启发而得名&#xff0c;神经网络由许多神经元&#xff08;Neuron&#xff09;组成&#xff0c;每个神经元接受一个输入&#xff0c;对输入进行处理后给出一个输出&#xff0c;如下图所示。请问下列关于神经…