11.27-12.5谷粒商城

目录

新增商品

1.上线会员服务

2. 获取分类关联的品牌

 3.获取选定分类下的属性分组和属性

4.新增商品vo 

 5.保存商品信息

6.Spu检索

7.Sku商品检索


新增商品

1.上线会员服务

 

将会员服务注册到nacos注册中心,启用服务注册发现@EnableDiscoveryClient。

同时新增会员等级。

新增商品时,要设置会员价,需要调用会员服务的api。

2. 获取分类关联的品牌

 发布商品时,要选择商品的分类和品牌。品牌应在分类选定后,从指定分类下的品牌列表中选择。

前端将分类id传给服务器,请求需要的品牌id和品牌name

    /*** /product/categorybrandrelation/brands/list* 获取分类关联的品牌*/@GetMapping("/brands/list")public R brandsList(@RequestParam("catId") Long catId){List<BrandEntity> brandEntities=categoryBrandRelationService.getBrandsByCatId(catId);List<BrandVo> collect = brandEntities.stream().map(item -> {BrandVo brandVo = new BrandVo();brandVo.setBrandId(item.getBrandId());brandVo.setBrandName(item.getName());return brandVo;}).collect(Collectors.toList());return R.ok().put("data",collect);}@Overridepublic List<BrandEntity> getBrandsByCatId(Long catId) {List<CategoryBrandRelationEntity> relationEntities=categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id",catId));List<Long> brandIds=relationEntities.stream().map(item->{return item.getBrandId();}).collect(Collectors.toList());return brandDao.selectBatchIds(brandIds);}

 3.获取选定分类下的属性分组和属性

获取属性分组,并将基本属性封装进属性分组中,即AttrGroupWithAttrsVo

    /*** 获取分类下所有分组&关联属性* /product/attrgroup/{catelogId}/withattr*/@GetMapping("/{catelogId}/withattr")public R getAttrGroupWithAttrs(@PathVariable("catelogId") Long catelogId){List<AttrGroupWithAttrsVo> vos=attrGroupService.getAttrGroupWithAttrsByCatId(catelogId);return R.ok().put("data",vos);}@Overridepublic List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatId(Long catelogId) {List<AttrGroupEntity> attrGroupEntities=list(new QueryWrapper<AttrGroupEntity>().eq("catelog_id",catelogId));List<AttrGroupWithAttrsVo> collect = attrGroupEntities.stream().map(group -> {AttrGroupWithAttrsVo attrGroupWithAttrsVo = new AttrGroupWithAttrsVo();BeanUtils.copyProperties(group, attrGroupWithAttrsVo);attrGroupWithAttrsVo.setAttrs(attrService.getAttrRelation(group.getAttrGroupId()));return attrGroupWithAttrsVo;}).collect(Collectors.toList());return collect;}

4.新增商品vo 

 利用Json工具 Json生成java实体类,再进行修改微调

 5.保存商品信息

主要是将vo拷贝给po实体对象,各实体的spuId或skuId设置好后保存。

其中会员价,满减,积分的保存需要调用远程服务。

Feign中的接口,方法签名一般与远程服务的方一致,但不一致也能够接收到传输过来的Json对象。

某些值为空或 不合法,不应插入表中。

由于该业务数据库操作较多,加上事务注解

 Feign 是一个声明式的 Web 服务客户端,能够通过注解和接口定义的方式,简化 HTTP 请求的过程。开发者不需要手动编写复杂的 HTTP 请求和响应处理代码,Feign 会“假装”成客户端接口的一部分,自动处理底层的请求和响应。

@FeignClient("gulimall-coupon")
public interface CouponFeignService {@PostMapping("coupon/spubounds/save")R saveSpuBounds(@RequestBody SpuBoundsTo boundsTo);@PostMapping("coupon/skufullreduction/saveInfo")R saveSkuReduction(SkuReductionTo skuReductionTo);
}
    /*** 保存*/@RequestMapping("/save")//@RequiresPermissions("product:spuinfo:save")public R save(@RequestBody SpuSaveVo spuSaveVo){spuInfoService.saveSpuInfo(spuSaveVo);return R.ok();}/*** 保存Spu信息* @param spuSaveVo*/@Transactional@Overridepublic void saveSpuInfo(SpuSaveVo spuSaveVo) {//1.保存spu基本信息 pms_spu_infoSpuInfoEntity spuInfoEntity=new SpuInfoEntity();BeanUtils.copyProperties(spuSaveVo,spuInfoEntity);spuInfoEntity.setCreateTime(new Date());spuInfoEntity.setUpdateTime(new Date());this.saveSpuBaseInfo(spuInfoEntity);//2.保存spu描述图片 pms_spu_info_descList<String> descrImgs=spuSaveVo.getDecript();SpuInfoDescEntity spuInfoDescEntity=new SpuInfoDescEntity();spuInfoDescEntity.setSpuId(spuInfoEntity.getId());spuInfoDescEntity.setDecript(String.join(",",descrImgs));spuInfoDescService.saveSpuInfoDesc(spuInfoDescEntity);//3.保存spu图片集 pms_spu_imagesList<String> spuImgs=spuSaveVo.getImages();spuImagesService.saveSpuImages(spuInfoEntity.getId(),spuImgs);//4.保存spu规格参数 pms_product_attr_valueList<BaseAttrs> baseAttrs=spuSaveVo.getBaseAttrs();productAttrValueService.saveSpuBaseAttrs(spuInfoEntity.getId(),baseAttrs);//5.保存spu积分信息 gulimall-sms  -> sms_spu_boundsBounds bounds=spuSaveVo.getBounds();SpuBoundsTo boundsTo=new SpuBoundsTo();BeanUtils.copyProperties(bounds,boundsTo);boundsTo.setSpuId(spuInfoEntity.getId());if(boundsTo.getBuyBounds().compareTo(new BigDecimal(0))>0 || boundsTo.getGrowBounds().compareTo(new BigDecimal(0))>0){if(couponFeignService.saveSpuBounds(boundsTo).getCode()!=0){log.error("远程保存spu积分信息失败");}}//6.保存spu对应的所有sku信息List<Skus> skus=spuSaveVo.getSkus();if(skus!=null && !skus.isEmpty()){skus.forEach(sku->{String defaultImg="";for (Images image : sku.getImages()) {if (image.getDefaultImg()==1){defaultImg=image.getImgUrl();break;}}//6.1 sku基本信息 pms_sku_infoSkuInfoEntity skuInfoEntity=new SkuInfoEntity();
//                private String skuName;
//                private BigDecimal price;
//                private String skuTitle;
//                private String skuSubtitle;BeanUtils.copyProperties(sku,skuInfoEntity);skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());skuInfoEntity.setSaleCount(0L);skuInfoEntity.setSpuId(spuInfoEntity.getId());skuInfoEntity.setSkuDefaultImg(defaultImg);skuInfoService.saveSkuInfo(skuInfoEntity);Long skuId=skuInfoEntity.getSkuId();//6.2 sku 图片信息 pms_sku_imagesList<SkuImagesEntity> skuImagesEntities = sku.getImages().stream().map(img -> {SkuImagesEntity skuImagesEntity = new SkuImagesEntity();skuImagesEntity.setSkuId(skuId);skuImagesEntity.setImgUrl(img.getImgUrl());skuImagesEntity.setDefaultImg(img.getDefaultImg());return skuImagesEntity;}).filter(item->{return !StringUtils.isEmpty(item.getImgUrl());}).collect(Collectors.toList());skuImagesService.saveBatch(skuImagesEntities);//6.3 sku销售属性信息 pms_sku_sale_attr_valueList<Attr> saleAttrs=sku.getAttr();List<SkuSaleAttrValueEntity> saleAttrValueEntities = saleAttrs.stream().map(attr -> {SkuSaleAttrValueEntity saleAttrValueEntity = new SkuSaleAttrValueEntity();BeanUtils.copyProperties(attr, saleAttrValueEntity);saleAttrValueEntity.setSkuId(skuId);return saleAttrValueEntity;}).collect(Collectors.toList());skuSaleAttrValueService.saveBatch(saleAttrValueEntities);//6.4 sku的优惠、满减等信息: gulimall-sms  -> sms_sku_ladder sms_sku_full_reduction sms_member_priceSkuReductionTo skuReductionTo=new SkuReductionTo();BeanUtils.copyProperties(sku,skuReductionTo);skuReductionTo.setSkuId(skuId);if(skuReductionTo.getFullCount()>=0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal(0))>0){if(couponFeignService.saveSkuReduction(skuReductionTo).getCode()!=0){log.error("远程保存sku优惠信息失败");}}});}}
    @Overridepublic void saveSkuReduction(SkuReductionTo skuReductionTo) {//sku的优惠、满减等信息: gulimall-sms  -> sms_sku_ladder sms_sku_full_reduction sms_member_price//1.满几件,打几折SkuLadderEntity skuLadderEntity=new SkuLadderEntity();BeanUtils.copyProperties(skuReductionTo,skuLadderEntity);skuLadderEntity.setAddOther(skuReductionTo.getCountStatus());if((skuReductionTo.getFullCount()>0)){skuLadderService.save(skuLadderEntity);}//2.满多少钱,减多少钱SkuFullReductionEntity skuFullReductionEntity=new SkuFullReductionEntity();BeanUtils.copyProperties(skuReductionTo,skuFullReductionEntity);skuFullReductionEntity.setAddOther(skuReductionTo.getPriceStatus());if(skuReductionTo.getFullPrice().compareTo(new BigDecimal(0))>0){this.save(skuFullReductionEntity);}//3.会员价List<MemberPrice> memberPrices=skuReductionTo.getMemberPrice();List<MemberPriceEntity> collect = memberPrices.stream().map(item -> {MemberPriceEntity memberPriceEntity = new MemberPriceEntity();memberPriceEntity.setSkuId(skuReductionTo.getSkuId());memberPriceEntity.setMemberLevelId(item.getId());memberPriceEntity.setMemberLevelName(item.getName());memberPriceEntity.setMemberPrice(item.getPrice());memberPriceEntity.setAddOther(1);return memberPriceEntity;}).filter(item->{return item.getMemberPrice().compareTo(new BigDecimal(0))>0;}).collect(Collectors.toList());memberPriceService.saveBatch(collect);}

6.Spu检索

 各个检索条件串联,同时忽略大小写,字段值为0时不把该字段加入sql语句,前端初值为0

把key加入到wrapper中时,要用and

这是因为要将该条件作为一个整体,在sql语句中加上括号

防止or关键字影响查询

    /*** 列表*/@RequestMapping("/list")//@RequiresPermissions("product:spuinfo:list")public R list(@RequestParam Map<String, Object> params){PageUtils page = spuInfoService.queryPageByCondition(params);return R.ok().put("page", page);}@Overridepublic PageUtils queryPageByCondition(Map<String, Object> params) {QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();/*** status: 2* key:* brandId: 9* catelogId: 225*/String key = (String) params.get("key");if(!StringUtils.isEmpty(key)){wrapper.and((w)->{w.eq("id",key).or().like("spu_name",key);});}// status=1 and (id=1 or spu_name like xxx)String status = (String) params.get("status");if(!StringUtils.isEmpty(status)){wrapper.eq("publish_status",status);}String brandId = (String) params.get("brandId");if(!StringUtils.isEmpty(brandId)&&!"0".equalsIgnoreCase(brandId)){wrapper.eq("brand_id",brandId);}String catelogId = (String) params.get("catelogId");if(!StringUtils.isEmpty(catelogId)&&!"0".equalsIgnoreCase(catelogId)){wrapper.eq("catalog_id",catelogId);}IPage<SpuInfoEntity> page = this.page(new Query<SpuInfoEntity>().getPage(params),wrapper);return new PageUtils(page);}

 设置Json中的date格式

spring:jackson:date-format: yyyy-MM-dd HH:mm:ss

7.Sku商品检索

 最大值应大于0

    /*** 列表*/@RequestMapping("/list")//@RequiresPermissions("product:skuinfo:list")public R list(@RequestParam Map<String, Object> params){PageUtils page = skuInfoService.queryPageByCondition(params);return R.ok().put("page", page);}@Overridepublic void saveSkuInfo(SkuInfoEntity skuInfoEntity) {this.baseMapper.insert(skuInfoEntity);}@Overridepublic PageUtils queryPageByCondition(Map<String, Object> params) {/*** key:* catelogId: 0* brandId: 0* min: 0* max: 0*/QueryWrapper<SkuInfoEntity> wrapper= new QueryWrapper<>();String key=(String) params.get("key");if(!StringUtils.isEmpty(key)){wrapper.and((obj)->{obj.eq("sku_id",key).or().like("sku_name",key);});}String catelogId=(String) params.get("catelogId");if(!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)){wrapper.eq("catalog_id",catelogId);}String brandId=(String) params.get("brandId");if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){wrapper.eq("brand_id",brandId);}String min=(String) params.get("min");if(!StringUtils.isEmpty(min)){wrapper.ge("price",min);}String max=(String) params.get("max");if(!StringUtils.isEmpty(max)&&!"0".equalsIgnoreCase(max)){try{BigDecimal bigDecimal = new BigDecimal(max);if(bigDecimal.compareTo(new BigDecimal("0"))>0){wrapper.le("price",max);}}catch (Exception e){}}IPage<SkuInfoEntity> page = this.page(new Query<SkuInfoEntity>().getPage(params),wrapper);return new PageUtils(page);}

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

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

相关文章

深入解析非桥PCI设备的访问和配置方法

往期内容 本文章相关专栏往期内容&#xff0c;PCI/PCIe子系统专栏&#xff1a; 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 Uart子系统专栏&#xff1a; 专栏地址&#xff1a;Uart子系统 Linux内核早期打印机制与RS485通信技术 – 末片&#xff0c;有专栏内容观看…

ArrayList常见操作源码逐句剖析

目录 前言 正文 1.需要了解的一些字段属性 1.存储 ArrayList 元素的数组缓冲区。 2.集合的大小 3.默认集合容量大小 2.ArrayList对象创建 1.无参构造 2.有参构造1 3.有参构造2 3.添加元素add(E e)以及扩容机制 ​编辑 后言 前言 源码的剖析有助于理解设计模式&…

现代密码学|Rabin密码体制及其数学基础 | 椭圆曲线密码体制及其运算 | DH密钥交换及中间人攻击

文章目录 参考Rabin密码体制及其数学基础中国剩余定理二次剩余Rabin密码体制实例 椭圆曲线密码体制及其运算原理运算规则加密解密实例 DH密钥交换及中间人攻击中间人攻击 参考 现代密码学&#xff5c;Rabin密码体制及其数学基础 现代密码学&#xff5c;椭圆曲线密码体制及其运…

硬件选型规则

光源选型: 先用型号中带H的&#xff0c;没有的选标准的. 光源和光源控制器的搭配需要确保接口一致。 根据型号表中的最佳工作距离和相机的尺寸。 光源控制器选型&#xff1a; 首先选择海康风格系列光源控制器考虑与光源的接口匹配。功率应该满足接近光源功率。检查是否退市…

sharedPreference包的使用总结

文章目录 1 概念介绍2 实现方法3 示例代码我们在上一章回中介绍了"如何自定义评分条"相关的内容,本章回中将介绍如何实现本地存储.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 Flutter是一套跨平台的UI框架,它不像原生SDK一样提供本地存储功能,因此,我们在…

TCP连接的时候遇到的异常(目标端口没开放)

import asyncioasync def check_port(ip, port, timeout1):"""检查目标 IP 和端口是否开放:param ip: 目标 IP 地址:param port: 目标端口:param timeout: 超时时间&#xff08;秒&#xff09;"""try:reader, writer await asyncio.open_connec…

C总结(C语言知识点,深化重难点)

C语言 1.使用C语言的7个步骤2.ASCII码3.提高程序可读性的机巧4.如何使用多种整形5.打印多种整形6.课移植类型&#xff1a;stdint.h和inttypes.h7.浮点数常量8.浮点值的上溢和下溢9.使用数据类型11.常量和C预处理器12.转换说明的意义12.1转换不匹配13.副作用和序列点14.数组简介…

burpsuite(6)暴力破解与验证码识别绕过

声明!!! 学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 视频链接&#xff1a;泷羽sec-bilibili 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 项目地址&#xff1a;https://github.com/f0ng/cap…

抗DDOS设备

0x00 定义: 抗DDOS设备顾名思义&#xff0c;就是防御DDoS攻击的设备&#xff0c;通常包含三个部分&#xff1a;检测中心、清洗中心和管理中心 检测中心主要负责对流量进行检测&#xff0c;发现流量异常后上报管理中心&#xff0c;由管理中心下发引流策略至清洗中心&#xff0…

systemV信号量与消息队列

目录 引言 ipc简介 ipc在kernel的管理机制&#xff08;简介&#xff09; 信号量 理解信号量 原子 结论 mmap 消息队列 接口 引言 在复杂的软件系统中&#xff0c;进程间的协调和通信是确保系统高效、稳定运行的关键。System V是一套历史悠久且功能强大的进程间通信&a…

【CKS最新模拟真题】Falco 的运行时安全性

系列文章目录 【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中 文章目录 系列文章目录参考地址一、TASK二、解题过程1、问题一解题2、问题二解题 参考地址 CKS考试允许打开falco的地址 https://falco.org/docs/reference/rules/supported-fields/ 一、TASK …

Altium Designer学习笔记 32 DRC检查_丝印调整

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…

流量地球(Java Python JS C++ C )

题目描述 流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。 初始状态下所有的发动机都是未启动状态;发动机启动的方式分为”手动启动"和”关联启动"两种方式;如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被”关联启动”…

Milvus向量数据库04-Pipelines搭建RAG应用

Milvus向量数据库04-Pipelines搭建RAG应用 Zilliz Cloud Pipelines 可以将文档、文本片段和图像等非结构化数据转换成可搜索的向量并存储在 Collection 中。本文将介绍 Zilliz Cloud Pipelines 的三种主要类型并提供示例代码&#xff0c;展示如何使用 Pipelines 搭建 RAG 应用。…

离线写博客(失败) - 用Markdown来离线写博客

因为想控制一下用网&#xff0c;但是又有写博客的需求&#xff0c;所以想研究一下离线写博客。 我看CSDN上面好像有很多介绍&#xff0c;Windows Live Writer 啦&#xff0c;Markdown啦&#xff0c;还有一些其他的&#xff0c;我看了一下&#xff0c;好像 Markdown还有点儿靠谱…

【洛谷】B3844 [GESP样题 二级] 画正方形(详细注释)

#include <iostream> using namespace std; int main() {//声明一个整型变量n&#xff0c;用于接收输入的数值&#xff0c;该数值将决定后续输出图案的行数和列数int n; cin >> n;//声明两个整型变量i和j&#xff0c;分别用作外层循环和内层循环的计数器int i, j;/…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

番茄社区双端视频APP源码_内附安装教程

新版视频源码|类似番茄APP视频付费软件APP源码教程 番茄社区双端视频APP源码&#xff0c;带安装教程&#xff0c;源码非组件&#xff0c;短视频、图片、交流、讨论、电影、电视剧。 没有什么问题宝塔就可以搭建&#xff0c;采集方面是火车头可以自己写规则&#xff01;