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

亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)

专栏:高并发---分布式项目 

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 

安装FastDFS

接下来我们编写商品管理功能。在进行商品管理时,需要上传商品图片。在百战商城中,我们使用FastDFS存储上传的图片,还需要使用Nginx的代理功能访问FastDFS存储的图片。 接下来我们要在虚拟机中安装FastDFS和Nginx:

1、下载安装gcc编译器

yum install gcc-c++ perl-devel pcre-devel
openssl-devel zlib-devel wget

2、下载FastDFS和FastDFS依赖包

# 进入根目录
cd /
# 使用rz上传FastDFS(V6.06.tar.gz)和FastDFS依赖包(V1.0.43.tar.gz)

3、安装FastDFS依赖

# 解压FastDFS依赖包
tar -zxvf V1.0.43.tar.gz -C /usr/local
# 进入依赖解压包
cd /usr/local/libfastcommon-1.0.43/
# 编译依赖
./make.sh
# 安装依赖
./make.sh install

4、安装FastDFS

# 解压FastDFS
cd /
tar -zxvf V6.06.tar.gz -C /usr/local
# 进入FastDFS解压包
cd /usr/local/fastdfs-6.06
# 编译FastDFS
./make.sh
# 安装FastDFS
./make.sh install# 进入etc目录
cd /etc/fdfs/
# 复制配置文件
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

5、启动tracker服务(跟踪服务)

# 创建tracker目录
mkdir -p /data/fastdfs/tracker
# 修改配置文件
vim /etc/fdfs/tracker.conf
disabled=false                  #启用配置文件
port=22122                      #设置
tracker的端口号
base_path=/data/fastdfs/tracker #设置
tracker的数据文件和日志目录
http.server_port=8888           #设置http端口号
# 启动tracker服务
/etc/init.d/fdfs_trackerd start
# 检查tracker服务
netstat -lntup |grep fdfs

6、启动storage服务(存储服务)

# 创建storage目录
mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage
# 修改配置文件
vim /etc/fdfs/storage.conf
disabled=false                        #启用配置文件
group_name=group1                     #组名,根据实际情况修改
port=23000                          
#storage的端口号
base_path=/data/fastdfs/base        
#storage的日志目录
store_path_count=1                    #存储路径个数
store_path0=/data/fastdfs/storage     #存储路径
tracker_server=192.168.0.159:22122  
#tracker服务器路径
http.server_port=8888                 #设置http端口号
# 启动storage服务
/etc/init.d/fdfs_storaged start
# 查看storage服务
netstat -lntup |grep fdfs

7、配置客户端连接

# 创建日志目录
mkdir -p /data/fastdfs/client
# 修改Client配置文件
vim /etc/fdfs/client.conf
connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      #日志路径
tracker_server=192.168.0.159:22122   # tracker服务器路径

安装Nginx

1、解压FastDFS的Nginx模块包

cd /
# 使用rz上传FastDFS的Nginx模块包(V1.22.tar.gz)
# 解压FastDFS的Nginx模块包
tar -zxvf V1.22.tar.gz -C /usr/local

 2、安装Nginx依赖文件

yum install -y gcc gcc-c++ zlib zlib-devel
openssl openssl-devel pcre pcre-devel gddevel epel-release

3、安装Nginx

# 使用rz上传Nginx(nginx-1.19.2.tar.gz)
# 解压Nginx
tar -xzvf nginx-1.19.2.tar.gz -C
/usr/local
# 进入Nginx安装路径
cd /usr/local/nginx-1.19.2/
# 建立Makefile文件,检查Linux系统环境以及相关的关键属性。
./configure --addmodule=/usr/local/fastdfs-nginx-module-1.22/src/
# 编译Nginx
make
# 安装Nginx
make install

4、拷贝配置文件

cp /usr/local/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/fastdfs-6.06/conf/http.conf /etc/fdfs/
cp /usr/local/fastdfs-nginx-module1.22/src/mod_fastdfs.conf /etc/fdfs/

5、进行FastDFS存储配置

# 编辑配置文件
vim /etc/fdfs/mod_fastdfs.conf
#保存日志目录
base_path=/data/fastdfs/storage      
#tracker服务器的IP地址以及端口号
tracker_server=192.168.0.159:22122  
#文件url中是否有group名
url_have_group_name = true          
#存储路径
store_path0=/data/fastdfs/storage  
#设置组的个数
group_count = 1                      
#然后在末尾添加分组信息,目前只有一个分组,就只写一个
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage

6、配置Nginx

# 编辑Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module;}
}

7、启动Nginx

# 进入sbin目录
cd /usr/local/nginx/sbin/
# 启动服务
./nginx -c /usr/local/nginx/conf/nginx.conf

创建文件服务模块

接下来我们创建文件服务模块,编写文件上传和文件删除的服务。

1、创建名为 shopping_file_service 的SpringBoot工程,添加相关依赖。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.itbaizhan</groupId><artifactId>shopping_common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><!-- 操作zookeeper --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- FastDFS --><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version></dependency>
</dependencies>

 2、设置该工程的父工程为 shopping

<parent><groupId>com.ittxc</groupId><artifactId>shopping</artifactId><version>1.0-SNAPSHOT</version>
</parent>

 3、给 shopping 工程设置子模块

<!-- 子模块 -->
<modules><!-- 文件服务 --><module>shopping_file_service</module>
</modules>

4、编写配置文件 application.yml

# 端口号
server:port: 9003
# 日志格式
logging:pattern:console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'
dubbo:application:name: shopping_file_service # 项目名registry:address: zookeeper://192.168.25.100 #注册中心地址port: 2181       # 注册中心的端口timeout: 10000 # 注册到zk上超时时间,msprotocol:name: dubbo # dubbo使用的协议port: -1 # dubbo自动分配端口scan:base-packages: com.itbaizhan.shopping_file_service.service # 包扫描
fdfs:so-timeout: 3000connect-timeout: 6000tracker-list: # TrackerList路径- 192.168.0.159:22122fileUrl: http://192.168.0.159 # 自定义配置,文件访问路径

5、启动类忽略数据源自动配置

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class ShoppingFileServiceApplication {public static void main(String[] args){SpringApplication.run(ShoppingFileServiceApplication.class, args);}
}

编写文件上传功能

1、在通用模块添加文件服务接口

// 文件服务
public interface FileService {/*** 上传文件* @param fileBytes 图片文件转成的字节数组* @param fileName 文件名* @return 上传后的文件访问路径*/String uploadImage(byte[] fileBytes,String fileName) throws IOException;/*** 删除文件* @param filePath 文件路径*/void delete(String filePath);
}

2、在文件服务模块创建文件服务接口实现类

@DubboService
public class FileServiceImpl implements FileService {@Autowiredprivate FastFileStorageClient fastFileStorageClient;@Value("${fdfs.fileUrl}")private String fileUrl; // Nginx访问FastDFS中文件的路径@Overridepublic String uploadImage(byte[] fileBytes, String fileName) {if (fileBytes.length != 0) {try {// 1.将文件字节数组转为输入流InputStream inputStream = new ByteArrayInputStream(fileBytes);// 2.获取文件的后缀名String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);// 3.上传文件StorePath storePath = fastFileStorageClient.uploadFile(inputStream, inputStream.available(), fileSuffix,null);// 4.返回图片路径String imageUrl = fileUrl + "/"+storePath.getFullPath();return imageUrl;} catch (IOException ioException) {throw new BusException(CodeEnum.UPLOAD_FILE_ERROR);}} else {throw new BusException(CodeEnum.UPLOAD_FILE_ERROR);}}@Overridepublic void delete(String filePath) {fastFileStorageClient.deleteFile(filePath);}
}

编写文件上传控制器

1、在后台管理Api模块编写文件控制器

/**
* 文件
*/
@RestController
@RequestMapping("/file")
public class FileController {@DubboReferenceprivate FileService fileService;/*** 上传文件* @param file 文件* @return 文件路径* @throws IOException*/@PostMapping("/uploadImage")public BaseResult<String> upload(MultipartFile file) throws IOException {// MultipartFile对象不能再服务间传递,必须转为byte数组byte[] bytes = file.getBytes();String url = fileService.uploadImage(bytes,file.getOriginalFilename());return BaseResult.ok(url);}/*** 删除文件* @param filePath 文件路径* @return 操作结果*/@DeleteMapping("/delete")public BaseResult delete(String filePath){fileService.delete(filePath);return BaseResult.ok();}
}

2、测试控制器

编写新增商品功能

1、在通用模块添加商品服务接口

/**
* 商品服务
*/
public interface GoodsService {// 新增商品void add(Goods goods);// 修改商品void update(Goods goods);// 根据id查询商品详情Goods findById(Long id);// 上架/下架商品void putAway(Long id,Boolean isMarketable);// 分页查询Page<Goods> search(Goods goods, int page, int size);
}

2 新增商品时,需要新增商品数据,商品图片数据,商品_规格项 数据。需要创建 GoodsMapperGoodsImageMapper

public interface GoodsMapper extends BaseMapper<Goods> {// 添加商品_规格项数据void addGoodsSpecificationOption(@Param("gid") Long gid, @Param("optionId")Long optionId);
}
public interface GoodsImageMapper extends BaseMapper<GoodsImage> { }

3、编写映射文件 GoodsMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper
3.0//EN""http://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper namespace="com.itbaizhan.shopping_goods_service.mapper.GoodsMapper"><insert id="addGoodsSpecificationOption">INSERT INTO bz_goods_specification_option VALUES(# {gid},#{optionId})</insert>
</mapper>

4、编写商品服务接口实现类

@DubboService
public class GoodsServiceImpl implements
GoodsService {@Autowiredprivate GoodsMapper goodsMapper;@Autowiredprivate GoodsImageMapper goodsImageMapper;@Overridepublic void add(Goods goods) {// 插入商品数据goodsMapper.insert(goods);// 插入图片数据Long goodsId = goods.getId(); // 获取商品主键List<GoodsImage> images = goods.getImages(); // 商品图片for (GoodsImage image : images) {image.setGoodsId(goodsId); // 给图片设置商品idgoodsImageMapper.insert(image); //插入图片}// 插入商品_规格项数据// 1.获取规格List<Specification> specifications = goods.getSpecifications();// 2.获取规格项List<SpecificationOption> options = new ArrayList(); //规格项集合// 遍历规格,获取规格中的所有规格项for (Specification specification : specifications) {options.addAll(specification.getSpecificationOptions());}// 3.遍历规格项,插入商品_规格项数据for (SpecificationOption option : options) {goodsMapper.addGoodsSpecificationOption(goodsId,option.getId());}}
}

5、编写商品控制器

/**
* 商品
*/
@RestController
@RequestMapping("/goods")
public class GoodsController {@DubboReferenceprivate GoodsService goodsService;/*** 新增商品** @param goods 商品实体* @return 执行结果*/@PostMapping("/add")public BaseResult add(@RequestBody Goods goods) {goodsService.add(goods);return BaseResult.ok();}
}

6、测试接口

编写修改商品功能

1、修改商品时,修改商品图片和规格项,我们先删除旧的图片和规 格项数据,再插入新的图片和规格项数据。首先我们在 GoodsMapper 中添加 删除商品下的所有规格项方法。

public interface GoodsMapper extends BaseMapper<Goods> {// 删除商品下的所有规格项void deleteGoodsSpecificationOption(Long gid);
}

 2、编写映射文件 GoodsMapper.xml

<delete id="deleteGoodsSpecificationOption">DELETE FROM bz_goods_specification_option WHERE gid = #{gid}
</delete>

3、编写商品服务接口实现类

@Override
public void update(Goods goods) {// 删除旧图片数据Long goodsId = goods.getId(); // 商品 idQueryWrapper<GoodsImage> queryWrapper = new QueryWrapper();queryWrapper.eq("goodsId",goodsId);goodsImageMapper.delete(queryWrapper);// 删除旧规格项数据goodsMapper.deleteGoodsSpecificationOption(goodsId);// 插入商品数据goodsMapper.updateById(goods);// 插入图片数据List<GoodsImage> images = goods.getImages(); // 商品图片for (GoodsImage image : images) {image.setGoodsId(goodsId); // 给图片设置商品idgoodsImageMapper.insert(image); //插入图片}// 插入商品_规格项数据List<Specification> specifications = goods.getSpecifications(); // 获取规格List<SpecificationOption> options = new ArrayList(); // 规格项集合// 遍历规格,获取规格中的所有规格项for (Specification specification : specifications) {options.addAll(specification.getSpecifica tionOptions());}// 遍历规格项,插入商品_规格项数据for (SpecificationOption option : options) {goodsMapper.addGoodsSpecificationOption(goodsId,option.getId());}
}

4、编写商品控制器

/**
* 修改商品
*
* @param goods 商品实体
* @return 执行结果
*/
@PutMapping("/update")
public BaseResult update(@RequestBody Goods goods) {goodsService.update(goods);return BaseResult.ok();
}

5、测试接口

编写上/下架商品功能

1、在 GoodsMapper 中添加修改商品上架状态方法

// 商品上/下架
void putAway(@Param("id") Long id,@Param("isMarketable") Boolean isMarketable);

2、编写映射文件 GoodsMapper.xml

<update id="putAway">UPDATE bz_goods SET isMarketable = # {isMarketable} WHERE id = #{id}
</update>

3、编写商品服务接口实现类

@Override
public void putAway(Long id, Boolean isMarketable) {goodsMapper.putAway(id,isMarketable);
}

4、编写商品控制器

/**
* 上架/下架商品
*
* @param id 商品id
* @param isMarketable 是否上架
* @return 执行结果
*/
@PutMapping("/putAway")
public BaseResult putAway(Long id,Boolean isMarketable) {goodsService.putAway(id,isMarketable);return BaseResult.ok();
}

5、测试接口

编写根据id查询商品功能

根据id查询商品时,需要关联查询图片数据、规格数据等,所以需要进行多表的关联查询。

1、在 GoodsMapper 中添加根据id查询商品详情方法 

// 根据id查询商品详情
Goods findById(Long id);

2、编写映射文件 GoodsMapper.xml

<resultMap id="goodsMapper"
type="com.itbaizhan.shopping_common.pojo.G
oods"><id property="id" column="bid"></id><result property="goodsName" column="goodsName"></result><result property="caption" column="caption"></result><result property="price" column="price"></result><result property="headerPic" column="headerPic"></result><result property="isMarketable" column="isMarketable"></result><result property="brandId" column="brandId"></result><result property="productType1Id" column="productType1Id"></result><result property="productType2Id" column="productType2Id"></result><result property="productType3Id" column="productType3Id"></result><result property="introduction" column="introduction"></result><collection property="images" column="bid" ofType="com.itbaizhan.shopping_common.pojo.GoodsImage"><id property="id" column="imageId"></id><result property="imageTitle" column="imageTitle"></result><result property="imageUrl" column="imageUrl"></result></collection><collection property="specifications" column="bid" ofType="com.itbaizhan.shopping_common.pojo.Specification"><id property="id" column="specificationId"></id><result property="specName" column="specName"></result><result property="productTypeId" column="productTypeId"></result><collection property="specificationOptions" column="specificationId" ofType="com.itbaizhan.shopping_common.pojo.SpecificationOption"><id property="id" column="optionId"></id><result property="optionName" column="optionName"></result></collection></collection>
</resultMap>
<select id="findById"
resultMap="goodsMapper">SELECTbz_goods.`id` bid,bz_goods.`goodsName` goodsName,bz_goods.`caption` caption,bz_goods.`price` price,bz_goods.`headerPic` headerPic,bz_goods.`introduction` introduction,bz_goods.`isMarketable` isMarketable,bz_goods.`brandId` brandId,bz_goods.`productType1Id`
productType1Id,bz_goods.`productType2Id`
productType2Id,bz_goods.`productType3Id`
productType3Id,bz_goods_image.`id` imageId,bz_goods_image.`imageTitle`
imageTitle,bz_goods_image.`imageUrl` imageUrl,bz_specification.`id` specificationId,bz_specification.`specName` specName,bz_specification.`productTypeId`
productTypeId,bz_specification_option.`id` optionId,bz_specification_option.`optionName`
optionNameFROMbz_goods,bz_goods_specification_option,bz_specification_option,bz_specification,bz_goods_imageWHERE bz_goods.`id` =
bz_goods_specification_option.`gid`
AND
bz_goods_specification_option.`optionId` =
bz_specification_option.`id`AND bz_specification.`id` =
bz_specification_option.`specId`AND bz_goods.`id` =
bz_goods_image.`goodsId`AND bz_goods.id = #{gid}
</select>

3、编写商品服务接口实现类

@Override
public Goods findById(Long id) {return goodsMapper.findById(id);
}

4、编写商品控制器

/*** 根据id查询商品详情** @param id 商品id* @return 商品详情*/
@GetMapping("/findById")
public BaseResult<Goods> findById(Long id)
{Goods goods = goodsService.findById(id);return BaseResult.ok(goods);
}

5、测试接口

编写分页查询商品功能

1、编写商品服务接口实现类

@Override
public Page<Goods> search(Goods goods, int page, int size) {QueryWrapper<Goods> queryWrapper = new QueryWrapper();// 判断商品名不为空if (goods != null && StringUtils.hasText(goods.getGoodsName())){queryWrapper.like("goodsName",goods.getGoodsName());}Page<Goods> page1 = goodsMapper.selectPage(new Page(page,size), queryWrapper);return page1;
}

2、编写商品控制器

/**
* 分页查询
* @param goods 商品条件对象
* @param page 页码
* @param size 每页条数
* @return 查询结果
*/
@GetMapping("/search")
public BaseResult<Page<Goods>> search(Goods goods, int page, int size) {Page<Goods> page1 = goodsService.search(goods, page, size);return BaseResult.ok(page1);
}

3、测试接口

编写秒杀商品服务接口

在管理员新增商品后,可以将商品设置为秒杀商品。“秒杀”是网络 卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一 种销售方式。用户秒杀商品时,需要通过一些技术方案降低服务器 的压力,这个我们编写用户端时再做介绍。管理员管理秒杀商品, 需要先在数据库拿到相应的普通商品,再将该商品构造为秒杀商品 添加到数据库中。接下来我们在通用模块编写秒杀商品服务接口:

public interface SeckillGoodsService {/*** 添加秒杀商品** @param seckillGoods 秒杀商品实体*/void add(SeckillGoods seckillGoods);/*** 修改秒杀商品** @param seckillGoods 秒杀商品实体*/void update(SeckillGoods seckillGoods);/*** 分页查询秒杀商品** @param page 页数* @param size 每页条数* @return 查询结果*/Page<SeckillGoods> findPage(int page, int size);
}

编写秒杀商品服务实现类

1、在商品服务模块编写秒杀商品Mapper:

public interface SeckillGoodsMapper extends BaseMapper<SeckillGoods> {
}

2、在商品服务模块编写秒杀商品服务实现类:

@DubboService
public class SeckillGoodsServiceImpl implements SeckillGoodsService {@Autowiredprivate SeckillGoodsMapper seckillGoodsMapper;@Overridepublic void add(SeckillGoods seckillGoods) {seckillGoodsMapper.insert(seckillGoods);}@Overridepublic void update(SeckillGoods seckillGoods) {seckillGoodsMapper.updateById(seckillGoods);}@Overridepublic Page<SeckillGoods> findPage(int page, int size) {return seckillGoodsMapper.selectPage(new Page(page, size), null);}
}

编写秒杀商品控制器

在后台管理API模块秒杀商品控制器:

/**
* 秒杀商品
*/
@RestController
@RequestMapping("/seckillGoods")
public class SeckillGoodsController {@DubboReferenceprivate SeckillGoodsService seckillGoodsService;/*** 添加秒杀商品* @param seckillGoods 秒杀商品实体* @return 操作结果*/@PostMapping("/add")public BaseResult add(@RequestBody SeckillGoods seckillGoods) {seckillGoodsService.add(seckillGoods);return BaseResult.ok();}/*** 修改秒杀商品* @param seckillGoods 秒杀商品实体* @return 操作结果*/@PutMapping("/update")public BaseResult update(@RequestBody SeckillGoods seckillGoods) {seckillGoodsService.update(seckillGoods);return BaseResult.ok();}/*** 分页查询秒杀商品* @param page 页数* @param size 每页条数* @return 查询结果*/@GetMapping("/findPage")public BaseResult<Page<SeckillGoods>> findPage(int page, int size) {Page<SeckillGoods> seckillGoodsPage = seckillGoodsService.findPage(page, size);return BaseResult.ok(seckillGoodsPage);}
}

相关文章:

亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)

专栏&#xff1a;高并发---分布式项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支…...

Viper捐款7000万韩元,合计人民币是多少钱?

Viper捐款7000万韩元&#xff0c;合计人民币是多少钱&#xff1f; #2023LCK春季赛##英雄联盟# #Viper捐款7000万韩元# Viper向大田东区捐款 7000 万&#xff0c;成为大田荣誉协会 105 号会员。Viper选手从 2019 年开始一直向大田东区捐款&#xff0c;但是他不希望这件事被公开…...

前端vue实现系统拦截跳转外链并进入跳转询问界面

跳转询问界面如下图所示&#xff1a; 给自己挖坑的实现方式&#xff0c;最终解决方案请看最底下 思路&#xff1a;正常情况下我们有2种方式跳转外链 第一种非a标签&#xff0c;我们手动添加事件进行跳转 <div class"dingdan public-padding p-item" click&quo…...

【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解

简要总结 不加引号&#xff1a;不会将含有空格的字符串视为一个整体输出, 如果内容中有变量等&#xff0c;会先把变量解析出结果&#xff0c;然后在输出最终内容来&#xff0c;如果字符串中带有空格等特殊字符&#xff0c;则不能完整的输出&#xff0c;需要改加双引号&#xff…...

本人使用的idea插件

文章目录&#x1f68f; 本人使用的idea插件&#x1f6ac; pojo to Json&#x1f6ac; GsonFormatPlus&#x1f6ac; EasyYapi&#x1f6ac; Chinese (Simplified) Language Pack / 中文语言包&#x1f6ac; MyBatis Log Free&#x1f6ac; MyBatisPlusX&#x1f6ac; Statistic…...

站在行业C位,谷医堂打开健康管理服务新思路

对于农村及贫困地区老百姓来说&#xff0c;由于交通因素和家庭经济条件制约&#xff0c;看病难致身体调理情况一直不太乐观&#xff0c;这也导致心理压力很大。然而&#xff0c;随着近年中医药产业崛起与快速发展&#xff0c;这种局面很快就会得到改观&#xff0c;以湖南谷医堂…...

ABO溶血症概率

[简介]ABO溶血是由于母亲和胎儿ABO血型不合引起的新生儿溶血&#xff0c;概率不是很大&#xff0c;一般出现在准妈妈是O血&#xff0c;准爸爸是非O血&#xff0c;这次容易发生血型不合&#xff0c;但新生儿ABO溶血概率不高&#xff0c;大多数症状相对较轻。ABO溶血的概率是什么…...

【算法数据结构体系篇class03】:数组、链表、栈、队列、递归时间复杂度、哈希表、有序表问题

一、反转链表package class03;import java.util.ArrayList; import java.util.List;/*** 链表反转*/ public class ReverseLinkedList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {p…...

【新2023】华为OD机试 - 最多提取子串数目(Python)

最多提取子串数目 题目 给定由 [a-z] 26 个英文小写字母组成的字符串 A 和 B,其中 A 中可能存在重复字母,B 中不会存在重复字母 现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 1) 同一个位置的字母只能被挑选一次 2) 被挑选字母的相对先后顺序不…...

嵌入式C语言设计模式 --- 代理模式

1 - 什么是代理模式? 代理模式(Proxy Pattern),是指当客户端无法访问某个对象或者访问某个对象存在困难的时候,可以通过一个代理对象来进行间接访问。 举一个生活中的例子,比如,我们在买火车票或者飞机票的时候,有时候不会直接在12306或者航空公司官网上面购买,而是…...

前端性能优化的整理笔记

&#x1f6b4; 前言大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库&#x1f3c4;利用碎片化的时间&#xff0c;系统的整理&#xff0c;性能优化的知识点。&#x1f3af; 前端性能优化&#xf…...

springboot+mybatis连接数据库实现增删改查功能

springbootmybatis连接数据库实现增删改查功能创建表创建项目实体类DAO接口写sql的XML文件Service层Controller启动类结果目录结构参考博客创建表 create table user(id int ,name varchar(30),pwd varchar(40) )insert into user values(2,hxf,789101),(3,hlm,789102),(4,hzh…...

疑似45亿地址信息泄露事件跟进后续

开放隐私计算 收录于合集#数据安全13个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区…...

Hadoop集群配置

一、系统文件配置集群部署规划NameNode和SecondaryNameNode不要安装在同一台服务器ResourceManager也很消耗内存&#xff0c;不要和NameNode、SecondaryNameNode放在同一台机器上。这里装了四台机器&#xff0c;ant151,ant152,ant153,ant154。ant151ant152ant153ant154NameNode…...

【C语言】程序环境和预处理|预处理详解|定义宏(下)

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef ​编辑 4 命令行定义…...

MySQL主从复制

操作流程准备两个服务器主服务器配置1>修改主配置文件 /etc/my.cnf[mysald] log-binmysql-bin //[必须]启用二进制日志server-id12>重启 mysql 服务3>创建mysql用户并授权mysql> GRANT REPLICATION SLAVE ON ** to slaver% identified by 123456;4>查看当前主服…...

做自媒体视频变现的三大要素!

大家都知道做自媒体可以赚钱&#xff0c;做得好的话收入会远超自己的工资&#xff01; 但有些关键点你真的知道吗&#xff1f;有几点是新手很容易忽略的&#xff01; 1、内容价值 我们所创作的内容是否是用户所需要的&#xff1f;用户是不是有强烈的需求&#xff1f;这一点你…...

软件测试如何获得高薪?

软件测试如何获得高薪&#xff1f; 目录&#xff1a;导读 测试基础理论/测试设计能力 业务知识 行业技术知识 数据库 掌握编程语言 搞定自动化测试 质量流程管理 下面谈谈不同level的测试工程师应具备的基本能力 第一个&#xff1a;我们称之为测试员/测试工程师 第二…...

《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)

5.4 特权级深入浅出 5.4.1 特权级哪点事 计算机 访问 可分为访问者和被访问者。 建立特权机制为了通过特权来检查合法性。 0、1、2、3级&#xff0c;数字越小&#xff0c;权力越大。 0特权级是系统内核特权级。 用户程序是3特权级&#xff0c;被设计为“有需求就找操作系统”…...

艾德卡EDEKA EDI 需求分析

艾德卡Edeka 是德国最大的食品零售商&#xff0c;因其采用“指纹付款”的方式进行结算&#xff0c;成为德国超市付款方式改革的先驱。2022年8月&#xff0c;入选2022年《财富》世界500强排行榜&#xff0c;位列第256位。 艾德卡EDEKA EDI需求分析 传输协议 在传输协议层面&a…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...