当前位置: 首页 > news >正文

第12天-商品维护(发布商品、商品管理、SPU管理)

1.发布商品流程

在这里插入图片描述

发布商品分为5个步骤:

  1. 基本信息
  2. 规格参数
  3. 销售属性
  4. SKU信息
  5. 保存完成



2.发布商品-基本信息

在这里插入图片描述



2.1.会员等级-会员服务


2.1.1.会员服务-网关配置

在网关增加会员服务的路由配置

      - id: member_routeuri: lb://gmall-memberpredicates:- Path=/api/member/**filters:- RewritePath=/api/(?<segment>.*), /$\{segment}

2.1.2.新增会员等级

菜单路径:用户系统 -> 会员等级

在这里插入图片描述



2.2.获取分类关联的品牌


2.2.1.API

GET /product/categorybrandrelation/brands/list// 请求参数
{"catId": 255}// 响应数据
{"msg": "success","code": 0,"data": [{"brandId": 0,"brandName": "string",}]
}

2.2.2.后台接口实现

CategoryBrandRelationController

 	/*** 获取分类关联的品牌* @param catId 分类ID* @return*/@GetMapping("/brands/list")public R brandRelationList(@RequestParam(value = "catId", required = true) Long catId) {List<BrandEntity> brandEntities = categoryBrandRelationService.getBrandsByCatId(catId);List<BrandVO> vos = brandEntities.stream().map(brandEntity -> {BrandVO brandVO = new BrandVO();brandVO.setBrandId(brandEntity.getBrandId());brandVO.setBrandName(brandEntity.getName());return brandVO;}).collect(Collectors.toList());return R.ok().put("data", vos);}

CategoryBrandRelationServiceImpl

	/*** 获取分类关联的品牌* @param catId 分类ID* @return 当前分类下的品牌*/@Overridepublic List<BrandEntity> getBrandsByCatId(Long catId) {List<CategoryBrandRelationEntity> categoryBrandRelationEntities = categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id", catId));List<BrandEntity> brandEntities = categoryBrandRelationEntities.stream().map(categoryBrandRelationEntity -> {return brandDao.selectById(categoryBrandRelationEntity.getBrandId());}).collect(Collectors.toList());return brandEntities;}


3.发布商品-规格参数

在这里插入图片描述



3.1.获取分类下所有分组&关联属性


3.1.1.API

GET /product/attrgroup/{catelogId}/withattr


3.1.2.后台接口实现

AttrGroupController

/*** 获取分类下所有分组及关联的所有属性* @return*/@GetMapping("/{catelogId}/withattr")public R getAttrGroupWithAttrs(@PathVariable("catelogId") Long catelogId) {List<AttrGroupWithAttrsVO> vos = attrGroupService.getAttrGroupWithAttrsByCatelogId(catelogId);return R.ok().put("data", vos);}

AttrGroupServiceImpl

 /*** 获取分类下所有分组及关联的所有属性* @param catelogId 三级分类ID* @return 分组及关联的所有属性集合*/@Overridepublic List<AttrGroupWithAttrsVO> getAttrGroupWithAttrsByCatelogId(Long catelogId) {// 获取分类的所有属性分组List<AttrGroupEntity> attrGroupEntities = this.list(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));List<AttrGroupWithAttrsVO> attrGroupWithAttrsVOs = attrGroupEntities.stream().map(attrGroupEntity -> {AttrGroupWithAttrsVO attrGroupWithAttrsVO = new AttrGroupWithAttrsVO();BeanUtils.copyProperties(attrGroupEntity,attrGroupWithAttrsVO);// 获取分组的所有属性List<AttrEntity> attrEntities = attrGroupService.getAttrRelation(attrGroupWithAttrsVO.getAttrGroupId());attrGroupWithAttrsVO.setAttrs(attrEntities);return attrGroupWithAttrsVO;}).collect(Collectors.toList());return attrGroupWithAttrsVOs;}


4.发布商品-销售属性

在这里插入图片描述

根据选择的颜色和版本,生成SKU销售信息 = 颜色数量 * 版本数量



5.发布商品-SKU信息

在这里插入图片描述



6.发布商品-保存完成



6.1.API

POST /product/spuinfo/save



6.2.抽取VO对象

保存发布商品时,根据前端生成的json,需要生成对应的 VO 对象

  • SpuVO
  • Bounds
  • BaseAttrs
  • Skus
  • Attr
  • Images
  • MemberPrice



6.3.远程接口


6.3.1.TO 对象

SpuBoundTO

package com.atguigu.common.to;import lombok.Data;import java.math.BigDecimal;/*** SPU会员积分信息远程服务传输对象 {@link SpuBoundTO}** @author zhangwen* @email: 1466787185@qq.com*/
@Data
public class SpuBoundTO {/*** spu id*/private Long spuId;/*** 购物积分*/private BigDecimal buyBounds;/*** 成长积分*/private BigDecimal growBounds;
}

SkuReductionTO

package com.atguigu.common.to;import lombok.Data;import java.math.BigDecimal;
import java.util.List;/*** 满减,会员折扣等信息 TO 对象 {@link SkuReductionTO}** @author zhangwen* @email: 1466787185@qq.com*/
@Data
public class SkuReductionTO {private Long skuId;/*** 满几件*/private int fullCount;/*** 打几折*/private BigDecimal discount;/*** 是否优惠叠加*/private int countStatus;/*** 满多少*/private BigDecimal fullPrice;/*** 减多少*/private BigDecimal reducePrice;/*** 是否叠加优惠*/private int priceStatus;/*** 会员价*/private List<MemberPrice> memberPrice;
}

6.3.2.CouponFeignService 远程接口

CouponFeignService

package com.atguigu.gmall.product.feign;import com.atguigu.common.to.SkuReductionTO;
import com.atguigu.common.to.SpuBoundTO;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;/*** Coupon 优惠服务远程接口 {@link CouponFeignService}** @author zhangwen* @email: 1466787185@qq.com*/
@FeignClient("gmall-coupon")
public interface CouponFeignService {/*** CouponService.saveSpuBounds(SpuBoundTO spuBoundTO)*  1.@RequestBody将这个对象转为json*  2.在注册中心找到gmall-coupon服务,然后发送 /coupon/spubounds/save 请求*      将转换的json放在请求体发送*  3.gmall-coupon服务接收到请求,请求体里有json数据*      将请求体里json数据转为 SpuBoundTO* 总结:*  只要json数据模型是兼容的,双方服务不一定需要使用同一个 TO 对象** 保存积分* @param spuBoundTO* @return*/@PostMapping("/coupon/spubounds/save")R saveSpuBounds(@RequestBody SpuBoundTO spuBoundTO);/*** 保存满减优惠及会员折扣* @param skuReductionTO* @return*/@PostMapping("coupon/skufullreduction/savareduction")R savaReduction(@RequestBody SkuReductionTO skuReductionTO);
}

6.3.3.CouponFeignService 远程接口实现

gmall-coupon 服务

  • /coupon/spubounds/save
  • coupon/skufullreduction/savareduction

SpuBoundsController

/*** 保存积分信息*/@PostMapping("/save")public R save(@RequestBody SpuBoundsEntity entity){spuBoundsService.save(entity);return R.ok();}

SkuFullReductionController

 /*** 保存满减优惠及会员折扣* @param skuReductionTO* @return*/@PostMapping("/savareduction")public R saveSkuReduction(@RequestBody SkuReductionTO skuReductionTO) {skuFullReductionService.saveSkuReduction(skuReductionTO);return R.ok();}

SkuFullReductionServiceImpl

/*** 保存满减优惠及会员折扣* @param skuReductionTO*/
@Transactional(rollbackFor = Exception.class)
@Override
public void saveSkuReduction(SkuReductionTO skuReductionTO) {// 满几件减 sms_sku_ladderSkuLadderEntity skuLadderEntity = new SkuLadderEntity();BeanUtils.copyProperties(skuReductionTO, skuLadderEntity);skuLadderEntity.setAddOther(skuReductionTO.getCountStatus());if (skuLadderEntity.getFullCount() > 0) {skuLadderService.save(skuLadderEntity);}// 满多少价减 sms_sku_full_reductionSkuFullReductionEntity skuFullReductionEntity = new SkuFullReductionEntity();BeanUtils.copyProperties(skuReductionTO, skuFullReductionEntity);skuFullReductionEntity.setAddOther(skuReductionTO.getCountStatus());if (skuFullReductionEntity.getFullPrice().compareTo(new BigDecimal("0")) == 1) {this.save(skuFullReductionEntity);}//会员价 sms_member_priceList<MemberPriceEntity> memberPriceEntities =skuReductionTO.getMemberPrice().stream().map(memberPrice -> {MemberPriceEntity memberPriceEntity = new MemberPriceEntity();memberPriceEntity.setSkuId(skuReductionTO.getSkuId());memberPriceEntity.setMemberLevelId(memberPrice.getId());memberPriceEntity.setMemberLevelName(memberPrice.getName());memberPriceEntity.setMemberPrice(memberPrice.getPrice());memberPriceEntity.setAddOther(skuReductionTO.getPriceStatus());return memberPriceEntity;}).filter(memberPriceEntity -> {return memberPriceEntity.getMemberPrice().compareTo(new BigDecimal("0")) == 1;}).collect(Collectors.toList());memberPriceService.saveBatch(memberPriceEntities);
}


6.4.后台接口实现

SpuInfoController

/*** 保存发布商品*/@RequestMapping("/save")public R save(@RequestBody SpuVO spuVO){spuInfoService.saveSpuInfo(spuVO);return R.ok();}

SpuInfoServiceImpl

/*** 保存发布商品* @param spuVO*/
@Transactional(rollbackFor = Exception.class)
@Override
public void saveSpuInfo(SpuVO spuVO) {// 1.保存spu基本信息 pms_spu_infoSpuInfoEntity spuInfoEntity = new SpuInfoEntity();BeanUtils.copyProperties(spuVO, spuInfoEntity);spuInfoEntity.setCreateTime(new Date());spuInfoEntity.setUpdateTime(new Date());this.save(spuInfoEntity);// 2.保存spu的描述图片 pms_spu_info_descList<String> decript = spuVO.getDecript();SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();spuInfoDescEntity.setSpuId(spuInfoEntity.getId());spuInfoDescEntity.setDecript(String.join(",", decript));spuInfoDescService.save(spuInfoDescEntity);// 3.保存spu的图片集 pms_spu_imagesList<String> images = spuVO.getImages();spuImagesService.saveImages(spuInfoEntity.getId(), images);// 4.保存spu的规格参数 pms_product_attr_valueList<BaseAttrs> baseAttrs = spuVO.getBaseAttrs();productAttrValueService.saveProductAttrValue(spuInfoEntity.getId(), baseAttrs);// 5.保存spu的积分信息,跨库操作,feign远程调用// gmall-sms -> sms_spu_boundsBounds bounds = spuVO.getBounds();SpuBoundTO spuBoundTo = new SpuBoundTO();BeanUtils.copyProperties(bounds, spuBoundTo);spuBoundTo.setSpuId(spuInfoEntity.getId());R r = couponFeignService.saveSpuBounds(spuBoundTo);if (r.getCode() != 0) {log.error("调用远程服务 yomallб coupon 保存积分信息失败");}// 6.保存spu对应的sku信息// sku基本信息 pms_sku_info// sku的图片集 pms_sku_images// sku的销售属性信息 pms_sku_sale_attr_value// sku的满件优惠,满价优惠,会员价等信息,跨库操作// gmall-sms -> sms_sku_ladder, sms_sku_full_reduction, sms_member_priceList<Skus> skus = spuVO.getSkus();if (skus != null && skus.size() > 0) {skuInfoService.saveSkuInfo(spuInfoEntity, skus);}
}

SkuInfoServiceImpl

/*** 保存spu对应的sku* @param spuInfoEntity* @param skus*/
@Transactional(rollbackFor = Exception.class)
@Override
public void saveSkuInfo(SpuInfoEntity spuInfoEntity, List<Skus> skus) {skus.forEach(sku -> {// 保存sku基本信息SkuInfoEntity skuInfoEntity = new SkuInfoEntity();BeanUtils.copyProperties(sku, skuInfoEntity);skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());skuInfoEntity.setSpuId(spuInfoEntity.getId());skuInfoEntity.setSaleCount(0L);String defaultImage = "";for (Images image : sku.getImages()) {if (image.getDefaultImg() == 1) {defaultImage = image.getImgUrl();}}skuInfoEntity.setSkuDefaultImg(defaultImage);this.save(skuInfoEntity);// 批量保存sku图片Long skuId = skuInfoEntity.getSkuId();List<SkuImagesEntity> skuImagesEntities =sku.getImages().stream().map(image -> {SkuImagesEntity skuImagesEntity = new SkuImagesEntity();skuImagesEntity.setSkuId(skuId);skuImagesEntity.setDefaultImg(image.getDefaultImg());skuImagesEntity.setImgUrl(image.getImgUrl());return skuImagesEntity;}).filter(skuImagesEntity -> {return !StringUtils.isEmpty(skuImagesEntity.getImgUrl());}).collect(Collectors.toList());skuImagesService.saveBatch(skuImagesEntities);// 批量保存sku属性值List<SkuSaleAttrValueEntity> collect = sku.getAttr().stream().map(attr ->{SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();BeanUtils.copyProperties(attr, skuSaleAttrValueEntity);skuSaleAttrValueEntity.setSkuId(spuInfoEntity.getId());return skuSaleAttrValueEntity;}).collect(Collectors.toList());skuSaleAttrValueService.saveBatch(collect);// 保存优惠,满减等信息SkuReductionTO skuReductionTO = new SkuReductionTO();BeanUtils.copyProperties(sku, skuReductionTO);skuReductionTO.setSkuId(skuId);if (skuReductionTO.getFullCount() > 0 ||skuReductionTO.getFullPrice().compareTo(new BigDecimal("0")) == 1){R r = couponFeignService.savaReduction(skuReductionTO);if (r.getCode() != 0) {log.error("调用远程服务 yomallб coupon 保存SKU优惠信息失败");}}});
}


7.SPU管理-列表

在这里插入图片描述



7.1.API



7.2.后台接口实现

SpuInfoController

/*** SPU检索*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){PageUtils page = spuInfoService.queryPageByCondition(params);return R.ok().put("page", page);
}

SpuInfoServiceImpl

/*** SPU 检索* @param params* @return*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {QueryWrapper<SpuInfoEntity> queryWrapper = new QueryWrapper<>();String key = (String)params.get("key");if (!StringUtils.isEmpty(key)) {queryWrapper.and(wrapper ->{wrapper.eq("id", key).or().like("spu_name", key);});}String status = (String)params.get("status");if (!StringUtils.isEmpty(status)) {queryWrapper.eq("publish_status", status);}String brandId = (String)params.get("brandId");if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) {queryWrapper.eq("brand_id", brandId);}String catelogId = (String)params.get("catelogId");if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) {queryWrapper.eq("catalog_id", catelogId);}IPage<SpuInfoEntity> page = this.page(new Query<SpuInfoEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}


8.商品管理

在这里插入图片描述



8.1.SKU检索


8.1.1.API

GET /product/skuinfo/list


8.1.2.后台接口实现

SkuInfoController

/*** SKU检索*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){PageUtils page = skuInfoService.queryPageByCondition(params);return R.ok().put("page", page);
}

SkuInfoServiceImpl

/*** SKU检索* @param params* @return*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {QueryWrapper<SkuInfoEntity> queryWrapper = new QueryWrapper<>();String key = (String)params.get("key");if (!StringUtils.isEmpty(key)) {queryWrapper.and(wrapper -> {wrapper.eq("sku_id", key).or().like("sku_name", key);});}String brandId = (String)params.get("brandId");if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) {queryWrapper.eq("brand_id", brandId);}String catelogId = (String)params.get("catelogId");if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) {queryWrapper.eq("catalog_id", catelogId);}String min = (String)params.get("min");if (!StringUtils.isEmpty(min)) {queryWrapper.ge("price", min);}String max = (String)params.get("max");if (!StringUtils.isEmpty(max) && !"0".equalsIgnoreCase(max)) {queryWrapper.le("price", max);}IPage<SkuInfoEntity> page = this.page(new Query<SkuInfoEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}

相关文章:

第12天-商品维护(发布商品、商品管理、SPU管理)

1.发布商品流程 发布商品分为5个步骤&#xff1a; 基本信息规格参数销售属性SKU信息保存完成 2.发布商品-基本信息 2.1.会员等级-会员服务 2.1.1.会员服务-网关配置 在网关增加会员服务的路由配置 - id: member_routeuri: lb://gmall-memberpredicates:- Path/api/member/…...

动态分区分配计算

动态分区分配 内存连续分配管理分为&#xff1a; 单一连续分配固定分区分配动态分区分配&#xff08;本篇所讲&#xff09; 首次适应算法&#xff08;First Fit&#xff0c;FF&#xff09; 该算法又称最先适应算法&#xff0c;要求空闲分区按照首地址递增的顺序排列。 优点…...

【云原生】k8s的pod基本概念

一、资源限制 Pod 是 kubernetes 中最小的资源管理组件&#xff0c;Pod 也是最小化运行容器化应用的资源对象。一个 Pod 代表着集群中运行的一个进程。kubernetes 中其他大多数组件都是围绕着 Pod 来进行支撑和扩展 Pod 功能的&#xff0c;例如用于管理 Pod 运行的 StatefulSe…...

【史上最全面esp32教程】激光与食人鱼模块篇

文章目录食人鱼模块模块介绍连线说明操作激光模块模块介绍连线说明操作总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 食人鱼模块 模块介绍 采用食人鱼LED设计制作一个发光的电子模块&#xff0c;其实他的本质和LED无区别。 连线说明 名称接线…...

《代码整洁之道》二之有意义的命名

1.有意义的命名 1.1 名副其实 取个好名字需要花时间&#xff0c;但是价值远超取名的时间&#xff0c;一旦发现更好的名称就换掉旧的。这么做&#xff0c;读你代码的人都会很开心。 变量名、方法名、类名称需要清晰的告诉别人含义&#xff0c;如果名称需要注释来补充&#xf…...

天气预测demo

天气预测1 数据集介绍1.1 训练集1.2 测试集2 导入数据进行数据分析2.1 浏览数据2.2 探索数据2.2.1 查看数据类型1 数据集介绍 1.1 训练集 训练集中共有116369个样本&#xff0c;每个样本有23个特征&#xff0c;特征具体介绍如下&#xff1a; 列名解释Date&#xff1a;日期&a…...

HDMI协议介绍(四)--Video

目录 视频格式 RGB444 YUV444 YUV422 YUV420 Color Depth Video控制信号 Pixel Repetition HDMI支持多种视频格式和分辨率。以hdmi1.4和2.0协议来说&#xff0c;视频格式支持RGB444、YUV444、YUV422和YUV420&#xff0c;其中RGB444和YUV444一般都是要求支持的。 视频格式…...

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名&#xff0c;且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 &#xff0c;设置开发者密码 2.设置IP白名单&#xff0c;白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…...

【软件测试面试题】大厂头条:如何定位bug?实际案例拿offer还不简单......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 问题&#xff1a; 用…...

kubeconfig生成最高权限的token

参考文档 1.https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authentication/ 2. https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/ 操作流程 生成kubernetes集群最高权限admin用户的token admin-role.yaml kind: ClusterRoleBindin…...

Android 9.0 蓝牙去掉传输文件的功能

1.概述 在9.0的系统rom定制化产品开发中,在原生系统中蓝牙这块的功能也是非常重要的,所以在对蓝牙功能开发过程中,对功能的定制要求也多,在蓝牙的开发需求中,功能要求 也是越来越多的,产品需要要求在蓝牙文件传输过程中,进行限制就是不让蓝牙传输文件,所以要求在开始传…...

C语言指针易错点—字符数组与字符指针

C语言指针易错点—字符数组与字符指针字符数组与字符指针的区别字符数组与字符指针的区别举例字符指针必须先赋值&#xff0c;后引用字符数组与字符指针的区别 因为字符数组与字符指针都可以表示字符串&#xff0c;但他们不是等价的。下面就来讲讲他们的区别。 char sa[ ] &…...

Yolov3,v4,v5区别

网络区别就不说了&#xff0c;ipad笔记记录了&#xff0c;这里只说其他的区别1 输入区别1.1 yolov3没什么特别的数据增强方式1.2 yolov4Mosaic数据增强Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式&#xff0c;但CutMix只使用了两张图片进行拼接&#xff0c;…...

基于Appium+WinAppDriver+Python的winUI3应用的自动化框架搭建分享(一)环境配置

安装WinAppDriver下载并安装WinAppDriver:来源 https://github.com/Microsoft/WinAppDriver/releases开启电脑的开发者模式设置-隐私和安全性-开发者选项-开发人员模式安装Appium安装Appium Server Gui https://github.com/appium/appium-desktop/releases安装Appium Inspector…...

使用docker安装RocketMQ

文章目录1.创建namesrv服务拉取镜像创建namesrv数据存储路径构建namesrv容器2.创建broker节点创建broker数据存储路径创建配置文件构建broker容器3.创建rockermq-console服务拉取镜像构建rockermq-console容器需要关闭防火墙或者开放namesrv和broker端口关闭防火墙开放指定端口…...

【FPGA仿真】Matlab生成二进制、十六进制的txt数据以及Vivado读取二进制、十六进制数据并将结果以txt格式保存

Matlab 生成二进制、十六进制数据 在使用Vivado软件进行Verilog程序仿真时可能需要对模块输入仿真的数据&#xff0c;因此我们需要一个产生数据的方法&#xff08;二进制或者十六进制的数据&#xff09;&#xff0c;Matlab软件是一个很好的工具&#xff0c;当然你也可以使用VS…...

【第四章 IOC操作bean管理(基于注解方式创建对象,注入属性),完全注解开发】

第四章 IOC操作bean管理&#xff08;基于注解方式创建对象&#xff0c;注入属性&#xff09;&#xff0c;完全注解开发 1.IOC操作bean管理&#xff08;基于注解方式&#xff09; &#xff08;1&#xff09;什么是注解&#xff1a; ①注解是代码特殊标记&#xff0c;格式&#…...

【手把手一起学习】(六) Altium Designer 20 STM32核心板Demo----PCB设计

1 PCB设计 PCB设计是制作STM32核心板的关键步骤&#xff0c;其关系到最终生产厂家制作的电路板能否正常使用&#xff0c;PCB设计包括布局&#xff0c;裁板&#xff0c;布线&#xff0c;覆铜&#xff0c;DRC检查等&#xff0c;其中要求、细节、技巧比较多&#xff0c;以后会更详…...

【蓝桥杯集训·周赛】AcWing 第92场周赛

文章目录第一题 AcWing 4864. 多边形一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4865. 有效类型一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4866. 最大数量一、题目1、原…...

编程参考 - GCC中的Basic ASM

asm关键字允许你在C代码中嵌入汇编程序指令。GCC提供两种形式的内联asm语句。一种是基本asm语句&#xff0c;是没有操作数的语句&#xff08;见基本asm&#xff09;&#xff0c;而另一种扩展asm语句&#xff08;见扩展asm&#xff09;包括一个或多个操作数。在函数内部混合使用…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...