javaee之黑马乐优商城6

商品品牌的查询

 

 

 

 

 

 

 

 

 

 

 

 

 

上面就是我们需要根据分类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表里面//所以这里做映射的时候,必须忽略这个字段@Transientprivate 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对象@Autowiredprivate SpuMapper spuMapper;//我们在想找分类字段的时候,我们必须用到CategoryService里面相应的通过id找到分类的方法@Autowiredprivate CategoryService categoryService;//我们在考虑通过spu里面的商品id去找,直接引入mapper一键搞定@Autowiredprivate BrandMapper brandMapper;//插入SpuDetail的mapper@Autowiredprivate SpuDetailMapper spuDetailMapper;//插入sku的mapper@Autowiredprivate SkuMapper skuMapper;//插入stock的mapper@Autowiredprivate 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中的主键查询就能找出来,并且没有业务转换,直接引入mapperBrand 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对象@Autowiredprivate SpuMapper spuMapper;//我们在想找分类字段的时候,我们必须用到CategoryService里面相应的通过id找到分类的方法@Autowiredprivate CategoryService categoryService;//我们在考虑通过spu里面的商品id去找,直接引入mapper一键搞定@Autowiredprivate BrandMapper brandMapper;//插入SpuDetail的mapper@Autowiredprivate SpuDetailMapper spuDetailMapper;//插入sku的mapper@Autowiredprivate SkuMapper skuMapper;//插入stock的mapper@Autowiredprivate 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中的主键查询就能找出来,并且没有业务转换,直接引入mapperBrand 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;}@Transactionalpublic void updateGoods(SpuBo spuBo) {//先查询以前的skuList<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);//上面删除了库存,再删除以前的skuSku record = new Sku();record.setSpuId(spuBo.getId());skuMapper.delete(record);//根据sku里面关联的spuid进行删除,与当前spu关联的sku都会被删除//这里上面的思想是这样的,点击一个spu,后面会设置出多个sku商品//我们先全部删除,然后在插入}//下面我们新增修改后的sku和库存saveSkuAndStock(spuBo);//这里是一个新的spuBo过来//下面去更新一下spu信息这张表// 更新spuspuBo.setLastUpdateTime(new Date());spuBo.setCreateTime(null);spuBo.setValid(null);spuBo.setSaleable(null);spuMapper.updateByPrimaryKeySelective(spuBo);//上面使用了默认值的地方,不会更新//还要更新一下spu详情//这些数据都是要插入到数据库里面的,只是我们从后对象当中拿而已spuDetailMapper.updateByPrimaryKeySelective(spuBo.getSpuDetail());}}

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

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

 这个放到资料里面

 

 

 

 

 

 

 

 

 

 

 

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

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

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

相关文章

Vue3 动态组件 component:is= 失效

错误代码 用Vue3&#xff0c;组件无需注册&#xff0c;所以就会提示“注册了不不使用”的报错&#xff0c; 于是用了异步注册&#xff0c;甚至直接为了不报错就在下面使用3个组件&#xff0c;有异步加载&#xff0c;但还是实现不了预期效果 <script setup> import { re…

Linux内核启动流程-第二阶段rest_init函数

一. Linux内核启动 上一篇文章简单了解了 Linux内核启动第二阶段&#xff0c;涉及的 start_kernel函数。start_kernel 函数最后调用了 rest_init 函数&#xff0c;接下来简单看一下 rest_init 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a; Linux内核启…

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议&#xff08;Routing Information Protocol, RIP&#xff09;是一种内部网关协议&#xff0c;它位于应用层&#xff0c;使用520 UDP端口。RIP基于距离矢量算法&#xff08;Bellham-Ford&#xff09;根据…

MSF的安装与使用教程,超详细,附安装包和密钥

MSF简介 Metasploit&#xff08;MSF&#xff09;是一个免费的、可下载的框架 它本身附带数百个已知软件漏洞&#xff0c;是一款专业级漏洞攻击工具。 当H.D. Moore在2003年发布Metasploit时&#xff0c;计算机安全状况也被永久性地改变了&#xff0c;仿佛一夜之间&#xff0…

MySQL进阶篇4——锁+InnoDB引擎+MySQL管理

锁 概述 保证并发访问数据库数据的一致性和有效性等。 全局锁-库锁 ​ 加锁后&#xff0c;整个数据库实例就处于只读状态&#xff0c;后续的DML语句&#xff0c;DDL语句&#xff0c;以及更新操作的事务提交语句都将会被阻塞。 典型使用场景&#xff1a; ​ 对全库做逻辑备…

PY32F003F18之DMA串口

PY32F003F18使用DMA串口&#xff0c;官方程序省FLASH&#xff0c;但不省内存。单片机内存够大&#xff0c;节省没意义&#xff0c;故做了修改&#xff0c;少用HAL库中的发送和接收&#xff0c;从里面抠出有用的部分&#xff0c;修修改改就可以了。 一、DMA串口初始化流程&…

人生第一个java项目 学生管理系统

开始编程 建类 开始主要部分 main()部分 方法部分

RocketMQ —消费进度管理

Apache RocketMQ 通过消费位点管理消费进度&#xff0c;本文为您介绍 Apache RocketMQ 的消费进度管理机制。 背景信息​ Apache RocketMQ 的生产者和消费者在进行消息收发时&#xff0c;必然会涉及以下场景&#xff0c;消息先生产后订阅或先订阅后生产。这两种场景下&#x…

R语言柱状图直方图 histogram

柱状图简介 柱状图也叫直方图&#xff0c;是展示连续性数值的分布状况。在x轴上将连续型数值分为一定数量的组&#xff0c;y轴显示对应值的频数。 R基本的柱状图 hist 我们用R自带的Orange数据来画图。 > head(Orange)Tree age circumference(圆周长) 1 1 118 …

132.【MySQL_进阶篇】

MySQL_进阶 (一)、存储引擎1.MySQL体系结构(1).连接层(2).服务层(3).引擎层(4).存储层 2.存储引擎简介(1).查看某张表的数据引擎(2).展示此版本支持的所有存储引擎(3).创建表my_myisam,并指定MyIASM存储引擎(4).存储引擎示列 3.存储引擎 _ Innodb(1).Innodb 介绍(2).Innodb 特点…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深&#xff0c;太极八卦&#xff0c;阴阳交合&#xff0c;变化无穷。在程序的开发中也是这样&#xff0c;数字0和1也是同样的道理。就本节来说&am…

【Pm4py第七讲】关于visualization

本节用于介绍pm4py中的可视化函数&#xff0c;包括可视化bpmn、petri、性能图谱、变迁系统等。 1.函数概述 本次主要介绍Pm4py中一些常见的可视化函数&#xff0c;总览如下表&#xff1a; 函数名说明view_alignments(log, aligned_traces[, format])可视化对齐方法 view_bpmn(…

华为云云耀云服务器L实例评测 | 云服务器搭建自己的gitlab代码仓库手把手教学

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念&#x1f917; 欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/09/26&#x1f4c5; 最近更新时…

【LeetCode热题100】--234.回文链表

234.回文链表 快慢指针&#xff1a; 将链表的后半部分反转&#xff08;改变链表结构&#xff09;&#xff0c;然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例 使用快慢指针在一次遍历中找到链表的中间位置&#xff1a…

Spring整合RabbitMQ——消费者

1.配置consumer xml配置文件 2. 实现MessageListener接口 并重写onMessage方法

GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。2、数据可视化…

Mysql高级——数据库设计规范(2)

8. ER模型 ER 模型中有三个要素&#xff0c;分别是实体、属性和关系。 实体&#xff0c;可以看做是数据对象&#xff0c;往往对应于现实生活中的真实存在的个体。在 ER 模型中&#xff0c;用矩形来表示。实体分为两类&#xff0c;分别是强实体和弱实体。强实体是指不依赖于其…

ACP值不值得考?考了有用吗?

ACP是什么&#xff1f; PMI-ACP是由美国项目管理协会PMI颁发的针对敏捷项目管理的专业认证。目前已覆盖全球206个国家和地区&#xff0c;为计算机IT、制造、医疗保健等各行各业的项目成果交付提供了一系列方法和实践&#xff0c;是国际上敏捷领域中知识方法最全面、含金量最高…

OpenAI 更新 ChatGPT:支持图片和语音输入【附点评】

一、消息正文 9月25日消息,近日OpenAI宣布其对话AI系统ChatGPT进行升级,添加了语音输入和图像处理两个新功能。据OpenAI透露,这些新功能将在未来两周内面向ChatGPT Plus付费用户推出,免费用户也将很快可以使用这些新功能。这标志着ChatGPT继续朝着多模态交互的方向发展,为用户提…

液氮超低温保存法的原理

细菌保存是有效保存活体微生物群体&#xff0c;使细菌不死、不衰、不变&#xff0c;便于研究和应用。保存细菌的方法有很多。保存原理是利用干燥、低温、隔离空气的方法&#xff0c;降低微生物菌株的代谢速度&#xff0c;使菌株的生命活动处于半永久性休眠状态&#xff0c;从而…