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

news2024/11/25 18:32:10

1.发布商品流程

在这里插入图片描述

发布商品分为5个步骤:

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



2.发布商品-基本信息

在这里插入图片描述



2.1.会员等级-会员服务


2.1.1.会员服务-网关配置

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

      - id: member_route
        uri: lb://gmall-member
        predicates:
        - 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 当前分类下的品牌
     */
    @Override
    public 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 分组及关联的所有属性集合
  */
  @Override
  public 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_ladder
    SkuLadderEntity skuLadderEntity = new SkuLadderEntity();
    BeanUtils.copyProperties(skuReductionTO, skuLadderEntity);
    skuLadderEntity.setAddOther(skuReductionTO.getCountStatus());
    if (skuLadderEntity.getFullCount() > 0) {
        skuLadderService.save(skuLadderEntity);
    }

    // 满多少价减 sms_sku_full_reduction
    SkuFullReductionEntity skuFullReductionEntity = new SkuFullReductionEntity();
    BeanUtils.copyProperties(skuReductionTO, skuFullReductionEntity);
    skuFullReductionEntity.setAddOther(skuReductionTO.getCountStatus());
    if (skuFullReductionEntity.getFullPrice().compareTo(new BigDecimal("0")) == 1) {
        this.save(skuFullReductionEntity);
    }

    //会员价 sms_member_price
    List<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_info
    SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
    BeanUtils.copyProperties(spuVO, spuInfoEntity);
    spuInfoEntity.setCreateTime(new Date());
    spuInfoEntity.setUpdateTime(new Date());
    this.save(spuInfoEntity);

    // 2.保存spu的描述图片 pms_spu_info_desc
    List<String> decript = spuVO.getDecript();
    SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
    spuInfoDescEntity.setSpuId(spuInfoEntity.getId());
    spuInfoDescEntity.setDecript(String.join(",", decript));
    spuInfoDescService.save(spuInfoDescEntity);

    // 3.保存spu的图片集 pms_spu_images
    List<String> images = spuVO.getImages();
    spuImagesService.saveImages(spuInfoEntity.getId(), images);

    // 4.保存spu的规格参数 pms_product_attr_value
    List<BaseAttrs> baseAttrs = spuVO.getBaseAttrs();
    productAttrValueService.saveProductAttrValue(spuInfoEntity.getId(), baseAttrs);

    // 5.保存spu的积分信息,跨库操作,feign远程调用
    // gmall-sms -> sms_spu_bounds
    Bounds 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_price
    List<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);
}

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

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

相关文章

学习python第一天---前缀和

一、3956.截断数组&#xff08;前缀和&#xff09;二、前缀和&#xff08;前缀和&#xff09;[0]list(map(int,input().split()))三、子矩阵的和&#xff08;前缀和&#xff09;range(1,n1)四、K倍区间&#xff08;前缀和&#xff09;五、激光炸弹&#xff08;前缀和&#xff0…

模型部署笔记

目录模型部署工作ONNX存在的意义ONNX&#xff08;Open Neural Network Exchange&#xff09;ONNX示例模型推理示例Batch调整量化量化方式常见问题模型部署工作 训练好的模型在特定软硬件平台下推理针对硬件优化和加速的推理代码 训练设备平台&#xff1a; CPU、GPU、DSP ONN…

2023.02.26 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.模型4.1 SESSION-PARALLEL MINI-BATCHES4.2 SAMPLING ON THE OUTPUT4.3 RANKING LOSS5.实验5.1 数据集5.2 验证方式5.3 baselines5.4 实验结果6.结论深度学习元胞自动机1.定义2.构成3.特性4.思想5.统计特征流形学习1.降维2.空间3.距离…

一些硬件学习的注意事项与快捷方法

xilinx系列软件 系统适用版本 要安装在Ubuntu系统的话&#xff0c;要注意提前看好软件适用的版本&#xff0c;不要随便安好了Ubuntu系统又发现对应版本的xilinx软件不支持。 如下图&#xff0c;发行说明中会说明这个版本的软件所适配的系统版本。 下载 vivado vitis这些都可以…

IT男的一次中年破局尝试--出书

一、转战外企 接上回《人到中年——IT男择业感悟》后&#xff0c;自己从大央企去了某知名外企。外企虽然最近几年的日子已经没有10年前的辉煌与滋润&#xff0c;但相对来说&#xff0c;还能勉强找到工作与生活的平衡点。 划重点&#xff0c;35岁上下的人换工作理由&#xf…

SpringBoot+React博客论坛系统 附带详细运行指导视频

文章目录一、项目演示二、项目介绍三、项目运行截图四、主要代码一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootReact框架开发的博客论坛系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;文章编辑器…

大学物理期末大题专题训练总结-磁学大题

&#xff08;事先声明指的是简单的那个磁学大题&#xff0c;另外一类涉及储存的磁能、磁感应强度分布下次说&#xff09;求个磁通量&#xff0c;求个感应电动势&#xff0c;求个安培力大小......这个感觉是不是像你梦回高中&#xff1f;当然&#xff0c;这一块大题跟高中磁学部…

hadoop-Combiner合并、OutputFormat

一、Combiner合并 Combiner是MR程序中Mapper和Reducer之外的一种组件。 2&#xff09;Combiner组件的父类就是Reducer 3&#xff09;Combiner和Reducer的区别在与运行的位置&#xff1b;Combiner是在每一个MapTask所在的节点运行&#xff1b;Reducer是接收全局所有Mapper的输出…

c++11 标准模板(STL)(std::unordered_set)(九)

定义于头文件 <unordered_set>template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templat…

Linux学习(8.5)文件内容查阅

目录 文件内容查阅&#xff1a; 直接检视文件内容 cat (concatenate) tac (反向列示) nl (添加行号列印) 可翻页检视 more (一页一页翻动) less (一页一页翻动) 数据撷取 tail (取出后面几行) 非纯文字档&#xff1a; od 修改文件时间或建置新档&#xff1a; touc…

数据结构(六)二叉树

一、树形结构概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;1、有一个…

昇腾AI新技能,还能预防猪生病?

国药集团动物保健股份有限公司&#xff08;简称“国药动保”&#xff09;是专业从事动物保健产品研发、生产和销售的国家高新技术企业&#xff0c;是国内少数几家具备新产品原创能力的动物保健企业。其中&#xff0c;猪圆环病毒灭活疫苗等市场份额位居行业前列。 “猪圆环病毒…

【Linux学习笔记】8.Linux yum 命令和apt 命令

前言 本章介绍Linux的yum命令和apt命令。 Linux yum 命令 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xf…

一种全新的图像滤波理论的实验(三)

一、前言 2023年02月22日&#xff0c;我发布了滤波后&#xff0c;为针对异常的白色和黑色像素进行处理的实验&#xff0c;本次发布基于上下文处理的方案的实验&#xff0c;目的是通过基于加权概率模型滤波后&#xff0c;在逆滤波时直接修复大量的白色和黑色的异常像素&#xf…

html css输入框获得焦点、失去焦点效果

input输入框获得焦点、失去焦点效果 废话shao shuo ! 直接看效果图&#xff0c;好吧&#xff01; 效果图&#xff1a; code: <!DOCTYPE html> <html> <head><title></title><meta charset"utf-8" /><style type"text…

电子统计台账:海量数据中导入特定行,极力减少键盘编辑工作量

1 前言从事企业统计工作的小伙伴&#xff0c;本来已经够忙的了&#xff0c;现在又要加上什么电子台账这种鬼任务&#xff0c;而且居然还要每月来一次&#xff0c;简直不能忍。如果非要捏着鼻子忍了&#xff0c;那么有什么办法&#xff0c;减轻工作量&#xff1f;2 问题的提出有…

应用场景五: 西门子PLC通过Modbus协议连接DCS系统

应用描述&#xff1a; 西门子PLC&#xff08;S7200/300/400/200SMART&#xff09;通过桥接器可以支持ModbusRTU串口和ModbusTCP以太网&#xff08;有线和无线WIFI同时支持&#xff09;两种通讯方式连接DCS系统&#xff0c;不需要编程PLC通讯程序&#xff0c;直接在模块中进行地…

【数据库】第九章 关系查询处理与优化

第九章 关系查询处理与优化 索引 索引文件是一种辅助存储结构&#xff0c;其存在与否不改变存储表的物理存储结 构&#xff1b;然而其存在&#xff0c;可以明显提高存储表的访问速度。 索引文件组织方式有两种&#xff1a;(相对照的&#xff0c;主文件组织有堆文件、排序文件、…

Python3-字符串

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。 Python 访问字符串中的值 Python 不支持单字符类型&#xff0c;单字符在 Python 中也是作为一个字符串使用…

行测-判断推理-图形推理-位置规律-旋转、翻转

短指针每次逆时针旋转60&#xff08;排除法选C走人&#xff09;长指针每次顺时针旋转120选C左上菱形每次顺时针旋转90&#xff08;排除C D&#xff09;右上每次旋转180&#xff08;选B走人&#xff09;左下每次保持不变右下每次逆时针旋转90选B左上和右上为左右翻转&#xff0c…