亿级高并发电商项目-- 实战篇 --万达商城项目 十(安装与配置Elasticsearch和kibana、编写搜索功能、向ES同步数据库商品数据)
亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计) | 亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计)_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 二(Zookeeper、Docker、Dubbo-Admin等搭建工作 | 亿级高并发电商项目-- 实战篇 --万达商城项目 二(Zookeeper、Docker、Dubbo-Admin等搭建工作_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 三(通用模块、商品服务模块、后台API模块、IDEA忽略文件显示等开发工作 | 亿级高并发电商项目-- 实战篇 --万达商城项目 三(通用模块、商品服务模块、后台API模块、IDEA忽略文件显示等开发工作_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 ) | 亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 五 (用户服务模块、管理员模块功能 增、删、改、查 、分页,前端工程) | 亿级高并发电商项目-- 实战篇 --万达商城项目 五 (用户服务模块、管理员模块功能 增、删、改、查 、分页,前端工程)_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块) | 亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块)_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 七(品牌模块、商品类型模块等开发) | 亿级高并发电商项目-- 实战篇 --万达商城项目 七(品牌模块、商品类型模块等开发)_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能) | 亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)_童小纯的博客-CSDN博客 |
亿级高并发电商项目-- 实战篇 --万达商城项目 九(广告服务、安装Redis优化用户缓存、广告服务实现类等开发) | 亿级高并发电商项目-- 实战篇 --万达商城项目 九(广告服务、安装Redis优化用户缓存、广告服务实现类等开发)_童小纯的博客-CSDN博客 |
部分开发截图
安装ES服务
前台用户需要进行商品搜索从而找到自己需要的商品,而数据库的 搜索性能远远比不上搜索引擎,所以我们要将数据库中的商品信息 同步到Elasticsearch中,用户在ES中进行商品搜索。
首先安装Elasticsearch和kibana:
1、修改系统最大可创建文件数
#打开系统文件:
vim /etc/sysctl.conf
#配置最大可创建文件数:
vm.max_map_count=655360
#配置生效:
sysctl -p
2、使用rz命令将ES压缩包上传至虚拟机
3、解压ES
#解压:
tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz
#重命名:
mv elasticsearch-7.17.0 elasticsearch
#移动文件夹:
mv elasticsearch /usr/local/
4、使用rz命令将IK分词器和拼音分词器上传至虚拟机
5、解压分词器到elasticsearch的plugins目录下
# 解压ik分词器
unzip elasticsearch-analysis-ik-7.17.0.zip -d /usr/local/elasticsearch/plugins/analysis-ik
# 解压拼音分词器
unzip elasticsearch-analysis-pinyin-7.17.0.zip -d /usr/local/elasticsearch/plugins/analysis-pinyin
6、启动ES服务
#创建一个非root用户
useradd es
#es用户取得ES文件夹权限:
chown -R es:es /usr/local/elasticsearch
#切换为es用户:
su es
#启动ES服务:
ES_JAVA_OPTS="-Xms512m -Xmx512m" /usr/local/elasticsearch/bin/elasticsearch -d
#查询ES服务是否启动成功
curl 127.0.0.1:9200
安装kibana
1、使用rz命令将Kibana压缩文件上传到Linux虚拟机
2、解压
tar -zxvf kibana-7.17.0-linux-x86_64.tar.gz -C /usr/local
3、修改配置
# 修改配置文件
vim /usr/local/kibana-7.17.0-linux-x86_64/config/kibana.yml
# 加入以下内容
# kibana主机IP
server.host: "虚拟机IP"
# Elasticsearch路径
elasticsearch.hosts: ["http://127.0.0.1:9200"]
4、启动kibana
# 给es用户设置kibana目录权限
chown -R es:es /usr/local/kibana-7.17.0-linux-x86_64/
# 切换为es用户
su es
# 启动kibana
/usr/local/kibana-7.17.0-linux-x86_64/bin/kibana
5、访问kibana:http://虚拟机IP:5601
编写搜索相关的实体类
在ES中存储的商品实体类与数据库中的商品实体类不同,且商品的搜索条件和搜索结果都有相关的实体类。我们先编写这三个实体类:
1、在通用模块引入 spring-data-elasticsearch 起步依赖
<!-- elasticsearch -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-dataelasticsearch</artifactId>
</dependency>
2、编写在ES中存储的商品实体类
/**
* 在ES中存储的商品实体类
*/
@Document(indexName = "goods",createIndex = false)
@Data
public class GoodsES implements Serializable {@Fieldprivate Long id; // 商品id@Fieldprivate String goodsName; // 商品名称@Fieldprivate String caption; // 副标题@Fieldprivate BigDecimal price; // 价格@Fieldprivate String headerPic; // 头图@Fieldprivate String brand; // 品牌名称@CompletionFieldprivate List<String> tags; // 关键字@Fieldprivate List<String> productType; //类目名@Fieldprivate Map<String,List<String>> specification; // 规格,键为规格项,值为规格值
}
3、编写商品搜索条件实体类
/**
* 商品搜索条件
*/
@Data
public class GoodsSearchParam implements Serializable {@TableIdprivate String keyword; // 关键字private String brand; // 品牌名private Double highPrice; //最高价private Double lowPrice; //最低价private Map<String,String> specificationOption; // 规格map, 键:规格名,值:规格值private String sortFiled; //排序字段 NEW:新品 PRICE:价格private String sort; //排序方式 ASC:升序 DESC:降序private Integer page; //页码private Integer size; //每页条数
}
4、编写商品搜索结果实体类
/**
* 商品搜索结果
*/
@Data
public class GoodsSearchResult implements Serializable {private Page<GoodsES> goodsPage; // 页面商品信息private GoodsSearchParam goodsSearchParam; // 搜索条件回显private Set<String> brands; // 和商品有关的品牌列表private Set<String> productType; // 和商品有关的类别列表// 和商品有关的规格列表,键:规格名,值:规格集合private Map<String, Set<String>> specifications;
}
创建商品索引
在kibana中创建商品索引:
PUT /goods
{"settings": {"number_of_shards": 5,"number_of_replicas": 1,"analysis": {"analyzer": {"ik_pinyin": {"tokenizer": "ik_smart","filter": "pinyin_filter"},"tag_pinyin": {"tokenizer": "keyword","filter": "pinyin_filter"}},"filter": {"pinyin_filter": {"type": "pinyin","keep_joined_full_pinyin": true,"keep_original": true,"remove_duplicated_term": true}}}},"mappings": {"properties": {"id": {"type": "long","index": true},"goodsName": {"type": "text","index": true,"analyzer": "ik_pinyin","search_analyzer": "ik_smart"},"caption": {"type": "text","index": true,"analyzer": "ik_pinyin","search_analyzer": "ik_smart"},"tags": {"type": "completion","analyzer": "tag_pinyin","search_analyzer": "tag_pinyin"},"price": {"type": "double","index": true},"headerPic": {"type": "keyword","index": true},"brand": {"type": "keyword","index": true},"productType": {"type": "keyword","index": true},"specification":{"properties": {"specificationName":{"type": "keyword","index": true},"specificationOption":{"type": "keyword","index": true}}}}}
}
创建搜索服务模块
1、创建名为 shopping_search_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>
</dependencies>
2、设置该工程的父工程为 shopping 。
<parent><groupId>com.ittxc</groupId><artifactId>shopping</artifactId><version>1.0-SNAPSHOT</version>
</parent>
3、给 shopping 工程设置子模块
<!-- 子模块 -->
<modules><!-- 搜索服务 --><module>shopping_search_service</module>
</modules>
4、编写配置文件 application.yml
# 端口号
server:port: 9008
# 日志格式
logging:pattern:console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'
spring:# elasticsearchelasticsearch:uris: http://192.168.100.131:9200dubbo:application:name: shopping_search_service # 项目名registry:address: zookeeper://192.168.100.131 #注册中心地址port: 2181 # 注册中心的端口timeout: 10000 # 注册到zk上超时时间,msprotocol:name: dubbo # dubbo使用的协议port: -1 # dubbo自动分配端口scan:base-packages: com.itbaizhan.shopping_search_service.service # 包扫描
5、启动类忽略数据源自动配置
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class ShoppingSearchServiceApplication {public static void main(String[] args)
{SpringApplication.run(ShoppingSearchServiceApplication.class, args);}// 分页插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
创建搜索Api模块
1、创建名为 shopping_search_customer_api 的SpringBoot工程,添加相关依赖。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></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>com.ittxc</groupId><artifactId>shopping_common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
2、设置该工程的父工程为 shopping 。
<parent><groupId>com.ittxc</groupId><artifactId>shopping</artifactId><version>1.0-SNAPSHOT</version>
</parent>
3、给 shopping 工程设置子模块
<!-- 子模块 -->
<modules><!-- 用户搜索暴露的api --><module>shopping_search_customer_api</module>
</modules>
4 编写配置文件 application.yml
# 端口号
server:port: 8004
# 日志格式
logging:pattern:console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'
dubbo:application:name: shopping_search_customer_api #
项目名registry:address: zookeeper://192.168.100.131 #注册中心地址port: 2181 # 注册中心的端口timeout: 10000 # 注册到zk上超时时间,msprotocol:name: dubbo # dubbo使用的协议port: -1 # dubbo自动分配端口
5、启动类忽略数据源自动配置
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class ShoppingSearchCustomerApiApplication {public static void main(String[] args){SpringApplication.run(ShoppingSearchCustomerApiApplication.class, args);}
}
编写搜索服务接口
在通用模块编写搜索服务接口:
// 搜索服务
public interface SearchService {/*** 自动补齐关键字* @param keyword 被补齐的词* @return 补齐的关键词集合*/List<String> autoSuggest(String keyword);/*** 搜索商品* @param goodsSearchParam 搜索条件* @return 搜索结果*/GoodsSearchResult search(GoodsSearchParam goodsSearchParam);/*** 向ES同步商品数据* @param goodsDesc 商品详情*/void syncGoodsToES(GoodsDesc goodsDesc);/*** 删除ES中的商品数据* @param id 商品id*/void delete(Long id);
}
向ES同步数据库商品数据
我们要将数据库的商品数据同步到ES中才能进行搜索。之前编写 Goods 实体类没有品牌名,商品类目名等数据,所以我们需要再编写 一个商品详情实体类 GoodsDesc ,并编写查询所有商品详情方法。
查询所有商品详情
1、在通用模块编写商品详情实体类 GoodsDesc
/**
* 商品详情
*/
@Data
public class GoodsDesc implements Serializable {private Long id; // 商品idprivate String goodsName; // 商品名称private String caption; // 副标题private BigDecimal price; // 价格private String headerPic; // 头图private Boolean isMarketable; // 是否上架private String introduction; // 商品介绍private Brand brand; // 品牌private ProductType productType1; //一级类目private ProductType productType2; //二级类目idprivate ProductType productType3; //三级类目idprivate List<GoodsImage> images; // 商品图片private List<Specification> specifications; // 商品规格
}
2、在商品服务模块的Mapper中添加查询所有商品详情方法
// 查询所有商品详情
List<GoodsDesc> findAll();
3、编写Mapper映射文件
<resultMap id="goodsDescMapper" type="com.itbaizhan.shopping_common.pojo.GoodsDesc"><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="introduction" column="introduction"></result><association property="brand" column="brandId" javaType="com.itbaizhan.shopping_common.pojo.Brand"><id property="id" column="brandId"></id><result property="name" column="brandName"></result></association><association property="productType1" column="type1Id" javaType="com.itbaizhan.shopping_common.pojo.ProductType"><id property="id" column="type1Id"></id><result property="name" column="type1Name"></result><result property="level" column="type1Level"></result><result property="parentId" column="type1ParentId"></result></association><association property="productType2" column="type2Id" javaType="com.itbaizhan.shopping_common.pojo.ProductType"><id property="id" column="type2Id"></id><result property="name" column="type2Name"></result><result property="level" column="type2Level"></result><result property="parentId" column="type2ParentId"></result></association><association property="productType3" column="type3Id" javaType="com.itbaizhan.shopping_common.pojo.ProductType"><id property="id" column="type3Id"></id><result property="name" column="type3Name"></result><result property="level" column="type3Level"></result><result property="parentId" column="type3ParentId"></result></association><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="findAll" resultMap="goodsDescMapper">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_brand.`name` brandName,type1.id type1Id,type1.`name` type1Name,type1.`level` type1Level,type1.parentId type1ParentId,type2.id type2Id,type2.`name` type2Name,type2.`level` type2Level,type2.parentId type2ParentId,type3.id type3Id,type3.`name` type3Name,type3.`level` type3Level,type3.parentId type3ParentId,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_image,bz_brand,bz_specification,bz_specification_option,bz_goods_specification_option,bz_product_type AS type1,bz_product_type AS type2,bz_product_type AS type3WHERE bz_goods.id = bz_goods_specification_option.gidAND bz_goods_specification_option.optionId = bz_specification_option.idAND bz_specification.id = bz_specification_option.specIdAND bz_goods.brandId = bz_brand.idAND bz_goods.id = bz_goods_image.goodsIdAND bz_goods.productType1Id = type1.idAND bz_goods.productType2Id = type2.idAND bz_goods.productType3Id = type3.id
</select>
4、修改商品服务接口和实现类
public interface GoodsService {// 查询所有商品详情List<GoodsDesc> findAll();
}
public class GoodsServiceImpl implements GoodsService {@Overridepublic List<GoodsDesc> findAll() {return goodsMapper.findAll();}
}
编写分词方法
在向ES添加数据时,我们需要将数据库的一些字段进行分词作为商 品的关键词,方便编写补齐关键词功能,在搜索服务接口实现类编写分词方法:
@DubboService
public class GoodsESServiceImpl implements GoodsESService {@Autowiredprivate GoodsESRepository goodsESRepository;@Autowiredprivate ElasticsearchRestTemplate template;@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 分词* @param text 被分词的文本* @param analyzer 分词器* @return 分词结果*/@SneakyThrows // 抛出已检查异常public List<String> analyze(String text, String analyzer){// 分词请求AnalyzeRequest request = AnalyzeRequest.withIndexAnalyzer("goods",analyzer, text);// 分词响应AnalyzeResponse response = restHighLevelClient.indices().analyze(request, RequestOptions.DEFAULT);// 分词结果集合List<String> words = new ArrayList<>();// 处理响应List<AnalyzeResponse.AnalyzeToken>tokens = response.getTokens();for (AnalyzeResponse.AnalyzeToken token : tokens) {String term = token.getTerm(); // 分出的词words.add(term);}return words;}
}
在测试时,发现JAVA项目无法连接ES,这是由于ES默认不允许 远程访问。kibana由于和ES在同一台服务器下所以可以访问, JAVA程序在开发电脑中所以无法访问。我们修改es的配置文件,开启远程访问功能:
1、打开ES配置文件
vim /usr/local/elasticsearch/config/elasticsearch.yml
2、添加如下内容
# 单体ES环境
discovery.type: single-node
# 允许所有路径访问
network.host: 0.0.0.0
3、重启ES和kibana。
编写向ES同步商品数据方法
1、在搜索服务模块编写商品Repository
@Repository
public interface GoodsESRepository extends ElasticsearchRepository<GoodsES,Long> {
}
2、在搜索服务接口实现类编写向ES同步商品数据方法
// 向ES同步商品数据
@Override
public void syncGoodsToES(GoodsDesc goodsDesc) {// 将商品详情对象转为GoodsES对象GoodsES goodsES = new GoodsES();goodsES.setId(goodsDesc.getId());goodsES.setGoodsName(goodsDesc.getGoodsName());goodsES.setCaption(goodsDesc.getCaption());goodsES.setPrice(goodsDesc.getPrice());goodsES.setHeaderPic(goodsDesc.getHeaderPic());goodsES.setBrand(goodsDesc.getBrand().getName());// 类型集合List<String> productType = new ArrayList();productType.add(goodsDesc.getProductType1().getName());productType.add(goodsDesc.getProductType2().getName());productType.add(goodsDesc.getProductType3().getName());goodsES.setProductType(productType);// 规格集合Map<String,List<String>> map = new HashMap();List<Specification> specifications = goodsDesc.getSpecifications();// 遍历规格for (Specification specification : specifications) {// 规格项集合List<SpecificationOption> options = specification.getSpecificationOptions();// 规格项名集合List<String> optionStrList = new ArrayList();for (SpecificationOption option : options) {optionStrList.add(option.getOptionName());}map.put(specification.getSpecName(),optio nStrList);}goodsES.setSpecification(map);// 关键字List<String> tags = new ArrayList();tags.add(goodsDesc.getBrand().getName()); //品牌名是关键字tags.addAll(analyze(goodsDesc.getGoodsName(),"ik_smart"));//商品名分词后为关键词tags.addAll(analyze(goodsDesc.getCaption(),"ik_smart"));//副标题分词后为关键词goodsESRepository.save(goodsES);
}
同步所有商品数据到ES
在搜索服务模块编写测试类,查询所有商品数据,同步到ES中:
@SpringBootTest
class ShoppingSearchServiceApplicationTests
{@DubboReferenceprivate GoodsESServiceImpl goodsESService;@DubboReferenceprivate GoodsService goodsService;@Testvoid testSyncGoodsToES(){List<GoodsDesc> goods = goodsService.findAll();for (GoodsDesc goodsDesc : goods) {// 如果商品是上架状态if (goodsDesc.getIsMarketable()){goodsESService.syncGoodsToES(goodsDesc);}}}
}
先启动商品服务,再执行测试类,同步所有商品。
注:同步成功后可以注释测试类,否则启动搜索服务前必须启动商品服务。
相关文章:
亿级高并发电商项目-- 实战篇 --万达商城项目 十(安装与配置Elasticsearch和kibana、编写搜索功能、向ES同步数据库商品数据)
亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计) 亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 (商家端与用户端功能介绍、项目技术架构、数据库表结构等设计&#x…...
windwos安装spring-cloud-alibaba-nacos
windwos安装spring-cloud-alibaba-nacos前言一、预备环境二、下载源码或者安装包1.启动2.关闭总结前言 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 Nacos。 一、预备环境 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#x…...
Spring Boot 项目如何统一结果,统一异常,统一日志
1 统一结果返回目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。1.1 统一结果的一般形式是否响应成功;响应状态码;状态码描述;响应数据;其他标识符&#…...
Ubuntu下用Lean源码编译openwrt及一行命令u盘启动openwrt安装x86硬盘上
Ubuntu下用Lean源码编译openwrt 源码地址:https://github.com/coolsnowwolf/lede 1:首先微软云服务器装好 Ubuntu 64bit,推荐 Ubuntu 20.04 LTS x64,免费一年。ip设置在地球某处。总结就是每一步需要下载的都得下载完,…...
JavaScript Number 对象
JavaScript 是一门非常强大的编程语言,它提供了许多内置对象来帮助开发者在编写 JavaScript 应用时更轻松地处理数据。其中一个非常有用的对象是 JavaScript Number 对象,它可以帮助我们处理数值类型的数据,例如整数和浮点数。在本文中&#…...
【原创】java+swing+mysql银行ATM管理系统
本文主要介绍使用javaswingmysql去设计一个银行ATM管理系统,模仿实现存款、取款、转账、余额查询等功能。 功能分析: 隐含ATM管理系统一般分为管理员和用户角色,管理员可以进行用户管理、账单管理,用户可以进行转取存款等功能如…...
博弈论--总结
博弈分类 按照是否对外产出或消耗 零和博弈:博弈过程作为整体对外无产出也无消耗。非零和博弈:博弈过程作为整体对外有产出或有消耗。 按照博弈参与人数 1人博弈2人博弈3人博弈n人博弈 按照博弈是否重复 注:同一规则的同一博弈过程反复…...
AMBA低功耗接口规范(Low Power Interface Spec)
1.简介 AMBA提供的低功耗接口,用于实现power控制功能。目前AMBA里面包含2种低功耗接口: Q-Channel:实现简单的power控制,如上电,下电。 P-Channel:实现复杂的power控制,如全上电,半上…...
matlab-汽车四分之一半主动悬架模糊控制
1、内容简介汽车四分之一半主动悬架模糊控制651-可以交流、咨询、答疑2、内容说明半主动悬架汽车 1/4 动力学模型建立 本章主要对悬架类型进行简要介绍,并对其进行对比分析,提出半主动悬架的优越性,论述半主动悬架的工作原理,并对…...
【安全加密】通信加密算法介绍
加密常用于通信中,如战争中电台通讯有明码和密码,密码需要不断更换密码本;另外,商用软件也需要用到加密技术,如根据电脑的mac地址设置权限,防止软件被恶意传播。 文章目录一、介绍1. 单向散列/哈希算法2. 对…...
kubernetes教程 --组件详细介绍
组件详细介绍 NameSpace 在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字…...
数字化系统使用率低的原因剖析
当“数字化变革”成为热门话题,当“数字化转型”作为主题频频出现在一个个大型会议中,我们知道数字化时代的确到来了。但是,根据Gartner的报告我们看到一个矛盾的现象——85%的企业数字化建设与应用并不理想、但对数字化系统的需求多年来持续…...
<<Java开发环境配置>>7-Apache Tomcat安装教程环境变量配置IDEA配置
一.Apache Tomcat简介: Apache是普通服务器,本身只支持html即普通网页。不仅可以通过插件支持php,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)。Apache只支持静态网页,但像php,cgi,jsp等动态网页就需要Tomc…...
互联网大厂测开面试记,二面被按地上血虐,所幸Offer已到手
在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 如何备战面试的? 第一步:准备简历…...
网络管理之设备上线技术的发展现状和趋势
网络和网络设备无处不在 随着社会的发展和技术的进步,人类文明开始向信息时代演进,网络逐渐变成现代社会不可或缺的一部分,极大程度影响了人类的认知形式、思维方式与生活模式。从家庭网,到企业网;从无线网࿰…...
SQL67 返回固定价格的产品
描述有表Productsprod_idprod_nameprod_pricea0018sockets9.49a0019iphone13600b0018gucci t-shirts1000【问题】从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9.49 美元的产品。【示例结…...
webpack 开发环境的基本配置(webpack打包样式资源、html、图片、devserver、开发环境配置、以及其他资源)
A.打包样式资源 1. 创建文件 2. 下载安装 loader 包 npm i css-loader style-loader less-loader less -D 3. 修改配置文件 /*webpack.config.js webpack的配置文件作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置ÿ…...
刷题记录:牛客NC14402求最大值
传送门:牛客 题目描述: 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<i<j<n】的最大值。 操作次数有Q次,每次操作需要将位子p处的数字变成y. 输入: 5 2 4 6 8 10 2 2 5 4…...
javaEE 初阶 — 传输层 TCP 协议 中的延迟应答与捎带应答
文章目录1. 延迟应答2. 捎带应答TCP 工作机制:确认应答机制 超时重传机制 连接管理机制 滑动窗口 流量控制与拥塞控制 1. 延迟应答 延时应答 也是提升效率的机制,也是在滑动窗口基础上搞点事情。 滑动窗口的关键是让窗口大小大一点,传输…...
STM32单片机初学8-SPI flash(W25Q128)数据读写
当使用单片机进行项目开发,涉及大量数据需要储存时(例如使用了屏幕作为显示设备,常常需要存储图片、动画等数据),单靠单片机内部的Flash往往是不够用的。 如STM32F103系列,内部Flash最多只能达到512KByte&a…...
MS-SQL创建查询排序语句总结
重新捡起枪杆子,学习N年没用过的MS-SQL,整理一些学习笔记记录。 一、创建、修改和删除表 在SQL中,表有如下规则: 每张表都有一个名字,通常称为表名或关系名。表名必须以字母开头,最大长度为 30 个字符。一…...
subprocess—Python多进程模块
subprocess—Python多进程模块 1.概述 这篇文章介绍并行运算中的subprocess模块,subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。 subprocess 它可以用来调用第三方工具(例如&#x…...
【APP渗透测试】 Android APP渗透测试技术实施以及工具使用(客户端服务端)
文章目录前言一、安全威胁分析二、主要风险项三、Android测试思维导图四、反编译工具五、Android客户端漏洞一、Jnaus漏洞漏洞二、数据备份配置风险漏洞漏洞三、Activity组件泄露漏洞漏洞四、BroadcastReceiver组件泄露漏洞漏洞五、允许模拟器Root环境登录漏洞漏洞六、未识别代…...
字符串匹配 - Overview
字符串匹配(String Matchiing)也称字符串搜索(String Searching)是字符串算法中重要的一种,是指从一个大字符串或文本中找到模式串出现的位置。字符串匹配概念字符串匹配问题的形式定义:文本(Text)是一个长度为 n 的数组 T[1..n]&…...
【IP课堂】Ip地址如何进行精准定位?
通过Ip地址定位,是目前网络上最常见的定位方式。当然,也是最简单的定位方式。其实方法大多都是雷同的,通过Ip定位,就目前网上公开的技术。如通过搜索关键词“定位,定位查询,Ip定位”等,只能查询…...
MySQL 临时表相关参数说明区别
MySQL 临时表参数innodb_temp_tablespaces_dir、innodb_temp_data_file_path、innodb_tmpdir、tmpdir 区分 解决方案 innodb_tmpdir: alter table生成中间表文件,innodb_tmpdir有指定效路径,优选选择innodb_tmpdir,没有则选择tm…...
第二章 变量和基本类型
1.string类型数据的另一种初始化方式 语法: string 变量名 (" 初始化内容 "); 2.C中的列表初始化 语法: 数据类型 变量名 { 变量初始化的值 } ; 数据类型 变量名 { 变量初始化的值 } ; 例: 3.引用常量 常量引…...
【Python】循环语句(while,for)、运算符、字符串格式化
一、while循环Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:while 判断条件(condition):执行语句(statements)执行语句可以是单个语句或语句…...
利用设计模式、反射写代码
软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量,用不到设计模式、Java 高级特性、OOP,平时写代码都在堆 CRUD,个…...
Spring Cloud Alibaba--seata微服务详解之分布式事务(三)
上篇讲述gateway的部署和使用,gateway统一管理和转发了HTTP请求,在互联网中大型项目一定存在复杂的业务关系,尤其在商城类软件中如淘宝、PDD等商城,尤其在秒杀场景中,并发量可以到达千万级别,此时数据库就会…...
什么网站可做浏览器首页/网站开发培训
11月17日,阿里巴巴集团发布2023财年二季度财报。于2022年9月30日止季度,抵销跨分部交易前,菜鸟本季度营业收入同比增长26%至182.82亿元,外部收入占比进一步提升至73%。通过持续建设高质量的产业互联网,做全球化的长期主…...
二级目录怎么做网站/沈阳网站制作推广
不能访问网络位置的解决方法:问题描述:在运行里面输入IP地址不能访问,提示不能访问网络位置,有关网络排除故障的信息,请参阅windows帮助。分析:已经被中间设备拦截,如防火墙等,不过除非大型局域…...
制作网站需要注意什么/江苏网页设计
前言用过腾讯课堂的小伙伴们可能都知道,腾讯课堂播放时左右快进,后退的时候不太灵敏,有时候没反应,非常难受。我就想着能不能下载下来。在网上找了一圈都没有什么好用的方法。直到今天才找到方法,分享出来给大家使用。…...
怎么查看网站根目录/百度一下首页网页百度
一插上网线电脑会自动重启解决方法,网线,解决方法,插上,自动重启,电脑一插上网线电脑会自动重启解决方法易采站长站,站长之家为您整理了一插上网线电脑会自动重启解决方法的相关内容。今天遇到关于电脑的灵异事件,一插上网线电脑会自动重启,只…...
郴州疫情最新消息今天封城了/怎么优化网站关键词排名
传送门 题意: 长为$n$的序列,第$i$位至少$b_i$,$m$种区间使$[l_i,r_i]1$代价为$a_i$ 求满足的最小花费 复习单纯形法重做一遍 原始问题$m$个变量$n$个约束,$a_{ij}1$当$l_j \le i \le r_j$ 对偶问题$n$个变量$m$个约束 $Max\quad …...
网站统计代码添加/专业seo培训学校
[oracle] to_date() 与 to_char() 日期和字符串转换 to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。 即按照第二个参数的格式解释第一个参数。 to_char(日期,"转换格式" ) 即把给定的日期按照“转换…...