目录
日期:9月12日 EureKaServer服务 Spring Cloud Ribbon负载均衡策略
日期:9月13日 Ribbon饥饿加载 SpringCloud Nacos组件
日期:9月14日 Nacos配置管理 Http客户端 Feign 与 统一网关Gateway
日期:9月18日 部署单点ES Restclient操作索引库
1)创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:
步骤1:引入es的RestHighLevelClient依赖
步骤2:因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本
2.3.自动补全查询conmpetion suggester
2.5.自动补全查询的JavaAPI,SuggestBuilder()
1.1.2.swiper 和 swiper-item 组件的基本使用(实现轮播图效果)
日期:9月12日 EureKaServer服务 Spring Cloud Ribbon负载均衡策略
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务哔哩哔哩bilibili
1.今天所学内容摘要:
1.EureKaServer服务
Eureka 又称 服务注册中心,全部服务都需要进行注册才能使用,也是微服务架构中必不可少的组件。
1.1. Eureka 服务端
步骤一:使用IDEA快速创建Spring Boot项目,并且选择Eureka服务端(记得把Web的引用也勾选上,不然会出现项目启动不了的情况)
步骤二:在Spring Boot启动类上加Eureka服务端注解
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
步骤三:直接启动,默认端口是8080,http://localhost:8080
修改Eureka默认配置,修改配置如下:
################ 项目基本配置 ################ spring: application: # 对应注册Eureka中的服务名 name: eureka
1.2. Eureka 客户端
步骤一:采用IDEA快速创建Spring Boot项目,并且选择Eureka客户端依赖(Web也得勾选上,不然会出现项目启动不了)
步骤二:配置Eureka服务端地址,要是yml格式的
################ 项目基本配置 ################ server: port: 8010 servlet: # 项目访问路径前缀 context-path: /product spring: application: # 注册到Eureka的服务名 name: product ################ Eureka配置 ################ eureka: client: service-url: defaultZone: http://localhost:8080/eureka
步骤三:SpringBoot启动类上加上Eureka客户端注解,直接启动就可以了
步骤四:然后访问eureka后台管理页面,会发现有一个PRODUCT服务注册进来了,则表示没问题。
拓展了解:SpringCloud —— Eureka详细使用教程,以及实战案例演示-CSDN博客
2.Spring Cloud Ribbon负载均衡策略
负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 Ribbon 就属于后者——客户端负载均衡器。
客户端负载均衡器的实现原理是通过注册中心,如 Nacos,将可用的服务列表拉取到本地(客户端),再通过客户端负载均衡器(设置的负载均衡策略)获取到某个服务器的具体 ip 和端口,然后再通过 Http 框架请求服务并得到结果
2.1.负载均衡设置
//定义全局负载均衡:使用代码方式(配置在启动类中一般) @Bean public IRule randomRule(){ return new RandomRule(); } //定义局部微服务的负载均衡:使用配置文件方式 userservice: ribbon: NFLoadBalancerRuleClassName: comnetflix,loadbalancer,RandomRule #负载均衡规则
Ribbon 内置了 7 种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略,并且用户可以通过继承 RoundRibbonRule 来实现自定义负载均衡策略
拓展了解:Spring Cloud Ribbon中的 7 种负载均衡策略! - 知乎
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
经过漫长岁月,感觉在去看视频学习有点苦恼了,今天主要是了解了一下微服务的部分内容,微服务说到底其实就是多模块开发的高级版本,多模块开发是指在一个服务端中,将各个功能拆分实现,说到底还是一起的;微服务开发就是将多模块开发延申开来,从一个服务端拆分,由多模块变为多服务端同步开发,从前的各模块之间还能通过依赖直接调用,现在的各服务端之间通过请求接口的方式来调用另一业务的数据,从而达到连接,对于微服务之间个业务服务端的连接同步的也有相应的管理方式如Nacos。
日期:9月13日 Ribbon饥饿加载 SpringCloud Nacos组件
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务哔哩哔哩bilibili
Docker部署:Docker(黑马)_黑马 docker-CSDN博客
SpringAMQP(MQ):RabbitMQ(黑马spring cloud笔记)_rabbitmq 黑马 csdn-CSDN博客
1.今天所学内容摘要:
1.Ribbon饥饿加载
SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的
Ribbon默认是采用懒加载的,及第一次访问时才会去创建LoadBalanceClient,因为创建的过程中要去做服务拉取,所以请求时间会很长;而饥饿加载则会在项目启动时就去创建,降低了第一次访问的耗时。
#基础配置: ribbon: eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice
概念:Nacos服务分级存储模型:服务-集群-实例
Nacos控制台中可设置权重比,用于设置访问实例的概率
拓展了解:SpringCloud学习笔记(黑马)(三)——nacos组件_nacos maven依赖-CSDN博客
2.SpringCloud Nacos组件
Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别 Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除 Nacos支持服务列表变更的消息推送模式,服务列表更新更及时 Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
因为springcloud定义了规范,所以只需要修改组件和配置而不用修改代码,就可以实现原来的功能
//root的pom.xml导入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> //service的pom.xml导入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> //配置服务中心地址 server: port: 8081 spring: application: name: server-order cloud: nacos: server-addr: 127.0.0.1:8848 //nacos服务端地址 discovery: cluster-name: HZ //集群属性配置 namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 //命名空间 (dev环境) ephemeral: false //是否是时实例 service-user: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule //优先使用本地集群
注意:一般有了bootstrap配置文件后,只需要在application中配置一下当前的配置环境即可,例如(dev,pro等),在bootstrap中配置nocas作为服务中心和配置中心等
3.SpringAMQP(MQ)
#1.依赖------------------------------------ <!--AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> #2.配置------------------------------------配置都是一样的 spring: rabbitmq: host: 190.92.246.107 # 主机名 port: 5672 # 端口 virtual-host: / # 虚拟主机 username: root password: 123456 listener: #AMQP有一个消息预取机制,预取多少条消息是可以配置的。 simple: prefetch: 1 #预取1条 #3.实现------------------------------------ #发布者 public class PublisherTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void testSimpleQueue() { String queueName = "simple.queue"; String message = "hello, spring amqp"; rabbitTemplate.convertAndSend(queueName, message); } } #消费者 @Component public class SpringRabbitListener { @RabbitListener(queues = {"simple.queue"}) public void listenSimpleQueue(String msg) { System.out.println(msg); } }
注意:使用前需要去Linux服务器上部署启动RabbitMQ
拓展了解:SpringCloud学习笔记(黑马)(三)——nacos组件_nacos maven依赖-CSDN博客
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
今天学习状态还是不怎么样,迷迷糊糊的;今天主要学习了RabbitMQ的使用,以及SpringAMQP的应用;对于这部分的学习只能说是学的云里雾里;它讲的是消息队列的内容,主要就是模拟发送消息后由多人接收还是单人处理,我听起来感觉还好,但是就是有点不懂这方面的应用该用在哪里,微服务学到的东西感觉暂时都用不上,学习的使用操作起来也不是那么好操作,缺少了自己的想法;而且现在学习的好多东西都需要应用至Linux系统上感觉暂时都用不到现在的需求上。
日期:9月14日 Nacos配置管理 Http客户端 Feign 与 统一网关Gateway
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务哔哩哔哩bilibili
【黑马】Feign学习笔记_feign 扫描包的-CSDN博客
1.今天所学内容摘要:
1.Nacos配置管理
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
1.1. 从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动
spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)引入nacos-config依赖
首先,在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2)添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
注意:这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
3)读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @Value("s{pattern.dateformat}") private String dateformat; GetMapping("now") public String now()[ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); } }
1. 2.配置热更新
我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
要实现配置热更新,可以使用两种方式:
Nacos配置更改后,微服务可以实现热更新,方式: 1.通过@Value注解注入,结合@RefreshScope来刷新 2.通过@ConfigurationProperties注入,自动刷新 注意事项: 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置 配置共享: 微服务启动时,会去nacos读取多个配置文件,如: 1.[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml 2.[spring.application.name].yaml,例如:userservice.yaml 而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。
1.3. 配置共享
微服务启动时,会去nacos读取多个配置文件,如: 1.[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml 2.[spring.application.name].yaml,例如:userservice.yaml 而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。
简单流程如下:
1)添加一个环境共享配置
我们在nacos中添加一个userservice.yaml文件
2)在user-service中读取共享配置
在user-service服务中,修改PatternProperties类,读取新添加的属性,修改UserController,添加一个方法
3)运行两个UserApplication,使用不同的profile
修改UserApplication2这个启动项,改变其profile值
4)配置共享的优先级
当nacos、服务本地同时出现相同属性时,优先级有高低之分
1. 4.搭建Nacos集群
Nacos生产环境下一定要部署为集群状态。
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx
1.4.1搭建集群
因为搭建集群内容比较广泛,所以只是表述流程,具体内容都可以百度到
搭建集群的基本步骤:
-
搭建数据库,初始化数据库表结构
-
下载nacos安装包
-
配置nacos
-
启动nacos集群
-
nginx反向代理
2.Http客户端 Feign 与 统一网关Gateway
网关功能:
身份认证和权限校验 对工作人员或者是内部人员才能允许查看敏感信息 一切请求先到网关再到微服务,这样就能做到身份认证和权限校验
服务路由、负载均衡
倘若我们通过了身份认证和权限校验,那怎么知道访问哪个微服务呢?
服务路由: gateway网关不能处理对应的业务(比如用户查询功能),所以将请求转发到处理用户查询的服务(比如说userservice),因此网关必须根据请求判断把请求放到哪个服务里面
负载均衡:同样是userservice,但是可能有多个实例,此时就要根据负载均衡的规则来判断向哪个服务发送请求(从多个实例里面挑一个)
请求限流 对微服务的一种保护措施 限制人进入的流量,能够允许用户请求的量 比如我们限制500次用户请求,当超过500次之后就会限制进入,要不等着要不回去等人少的时候再来
2.1 搭建网关的步骤
2.1.1 创建新module并引入依赖
创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
<!--网关依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--nacos服务发现依赖 新的module(Gateway)也是一个微服务,也需要服务注册或者从nacos拉取服务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2.1.2 编写路由配置及nacos地址
server: port: 10010 # 网关端口,这个随便自己配置 spring: application: name: gateway # 服务名称 cloud: nacos: server-addr: localhost:8848 # nacos地址 # 上面的是nacos的服务注册与发现 # 下面的才是网络的路由配置 gateway: routes: # 网关路由配置 - id: user-service # 路由id,自定义,只要唯一即可 # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址 uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 路由断言,也就是判断请求是否符合路由规则的条件 - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
解析: uri: http://127.0.0.1:8081 这是向一个具体的ip和端口进行路由,相当于把路由直接写死了,将来都往这个自己去发,我们一般不使用这种方式 uri: lb://userservice lb 就是负载均衡(loadBalance,代表路由的时候要做负载均衡),后面userservice是服务名 predicates 路由断言,判断请求是否符合路由规则的条件
2.1.3 访问Gateway
我们的gateway项目中只有一个pom.xml配置文件一个启动类,并没有做任何的处理逻辑,但是却能访问到userservice中的数据
2.2 总结
网关搭建步骤:
-
创建项目,引入nacos服务发现和gateway依赖
-
配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:
-
路由id:路由的唯一标示
-
路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
-
路由断言(predicates):判断路由的规则
-
路由过滤器(filters):对请求或响应做处理
拓展了解:Nacos配置管理-CSDN博客
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
最近学习心无余力有足,感觉学习的东西一下子就高大上了,难以读懂,今天基于上一天学习内容,进行完善,主要是优化了微服务之间相互调用的方式,通过Feign优化调用;且对于微服务的安全方面学习了Gateway网关,主要作用就是在用户与微服务之间建立一道拦截措施,只有满足条件的人才能通过,类似于拦截器过滤器之类的东西;然后还接触了Docker部署,这玩意真的无语,要记的东西太多了笔记中索性不屑,直接同网址学习吧;总结的来讲今天学的一塌糊涂。,好的不能再好了!!!
日期:9月18日 部署单点ES Restclient操作索引库
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务哔哩哔哩bilibili
安装教程:Elastic Search 安装部署最全教程(Docker)_docker安装es-CSDN博客
索引库:索引库操作-CSDN博客
文档操作:黑马学ElasticSearch(二)-CSDN博客
1.今天所学内容摘要:
1.1.部署单点ES
1.创建网络 #让ES与kibana容器互联 docker network create es-net 2.下载ES以及Kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3.运行es docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1 4.部署kibana docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1 5.安装IK分词器 # 进入容器内部 docker exec -it es bash # 进入bin目录 cd /usr/share/elasticsearch/bin # 在线下载并安装 ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip #退出 exit #重启容器 docker restart es
1.2.Restclient操作索引库
什么是RestClient
ES官方提供了各种不同语言的客户端,用来操作ES
这些客户端的本质就是组装DSL语句,通过http请求发送给ES
其中的Java Rest Client又包括两种:
Java Low Level Rest Client
Java High Level Rest Client
1)创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:
-
字段名、字段数据类型,可以参考数据表结构的名称和类型
-
是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
-
是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
-
分词器,我们可以统一使用ik_max_word
2)初始化Restclient
步骤1:引入es的RestHighLevelClient依赖
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>
步骤2:因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本
<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
步骤3:初始化RestHighLevelClient
public class HotelIndexTest { private RestHighLevelClient client; @BeforeEach void setUp() { this.client = new RestHighLevelClient(RestClient.builder( HttpHost.create("http://192.168.56.100:9200") )); } @AfterEach void tearDown() throws IOException { this.client.close(); } }
3) 创建索引库
整体分为三步:
-
(1)创建Request对象;因为是创建索引库的操作,因此Request是CreateIndexRequest
-
(2)添加请求参数,其实就是DSL的JSON参数部分;因为json字符串很长,这里是定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅
-
(3)发送请求,client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
今天学习了一下对ES索引的使用,索引就好比数据库的另类版,主要不是用于存储数据的,但是在学习中,视频中暂时教的只是将数据库中数据按照索引库所需要的要求放入;然后简单的讲了如何增删改查等操作,没有讲到ES分词的使用,怎么样的应用到软件或者网页中,我无法理解ES的工作原理是什么,当ES分词后如何实现的搜索,又如何将我们所需要的数据呈现出来;自从学习了微服务就感觉有一种脱离实际的感觉,无法将微服务用到我现在所学的项目中去,没有代入感;
日期:9月19日
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务哔哩哔哩bilibili
1.今天所学内容摘要:
1.1.DSL查询文档以及Restclient查询文档
ES的搜索引擎中主要包括{查询、分页、排序、高亮}等功能组成
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
查询所有:查询出所有数据,一般测试用。例如:match_all
全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query
精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:ids,range,term
地理(geo)查询:根据经纬度查询。例如 geo_distance geo_bounding_box
复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:bool,function_score
查询的语法基本一致:
GET /indexName/_search { "query": { "查询类型": { "查询条件": "条件值" } } }
1.2.全文检索查询
1.2.1.使用场景
全文检索查询的基本流程如下:
对用户搜索的内容做分词,得到词条
根据词条去倒排索引库中匹配,得到文档id
根据文档id找到文档,返回给用户
比较常用的场景包括:
商城的输入框搜索
百度输入框搜索
1.2.2.基本语法
常见的全文检索查询包括:
match查询:单字段查询
multi_match查询:多字段查询,任意一个字段符合条件就算符合查询条件
//match查询语法如下: GET /indexName/_search { "query": { "match": { "FIELD": "TEXT" } } } //mulit_match语法如下: GET /indexName/_search { "query": { "multi_match": { "query": "TEXT", "fields": ["FIELD1", " FIELD12"] } } }
1.2.4.总结
match和multi_match的区别是什么?
match:根据一个字段查询
multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
注意:DSL查询语句还有很多大多都是重复的语法,不在演示
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
今天学习了DSL查询文档以及对应的Restclient查询文档,总体来讲两者的语法是差不多的,只要了解了一边的应用,另一边就能快速学会,因此总体来讲今天学习还算可以,但是ES搜索引擎的内容还是太多了,不是很好理解;单个查询文档的学习就有好多内容,一时半会无法完全学会,只有后期项目中多引用估计才能熟练掌握,现在只是对着视频学习实在是有点无力,ES搜索引擎的内容大都是配套的,我现在就像是学了就忘,以前学习的内容已经忘记的差不多了,无法完整的完善一个功能到现在学习的地步,现在学习的内容太依赖于之前所学的配置了,之前的不懂,现在学起来就更加费劲。
日期:9月20日
ElasticSearch基础——聚合、补全、集群。高亮+自定义分词器+自动补全+前后端消息同步
所学出处:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibili
1.今日内容摘要:
1.聚合
1.1.聚合的种类
聚合常见的有三类:
-
桶(Bucket)聚合:用来对文档做分组
-
TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
-
Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
-
-
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
-
Avg:求平均值
-
Max:求最大值
-
Min:求最小值
-
Stats:同时求max、min、avg、sum等
-
-
管道(pipeline)聚合:其它聚合的结果为基础做聚合
注意:参加聚合的字段必须是不能分词,例如是keyword、日期、数值、布尔类型
1.2.DSL实现聚合
1.2..1.Bucket聚合语法
GET /hotel/_search { "size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果。如果设为20,就是既展示20个brand查询的"hits",又展示聚合"aggregations" "aggs": { // 定义聚合 "聚合名": { //给聚合起个名字,例如brandAgg。查询结果里聚合名会嵌套在"aggregations"里 "terms": { // 聚合的类型,按照品牌值聚合,所以选择term "field": "字段名", // 参与聚合的字段,例如brand "size": 20 // 希望获取的聚合结果数量 "order": { "_count": "asc" //按升序排序,默认是降序 } } } } }
1.2.2."query"标签限定聚合范围
“query” 标签和“aggs”标签是并列的,因此“query” 标签不为空就是限定了聚合范围。
默认情况下,Bucket聚合是对索引库的所有文档做聚合,但真实场景下,用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。
GET /hotel/_search { "query": { //添加query标签,限制查询文档内容 "range": { //range:根据值的范围查询 "price": { //查询价格字段 "lte": 200 // 只对200元以下的文档聚合 } } }, "size": 0, "aggs": { "brandAgg": { "terms": { "field": "brand", "size": 20 } } } }
1.2.3.度量(Metric)聚合语法
聚合与聚合之间是可以实现嵌套的,就像文档中的筛选后排序一样;聚合之间的语法配合也可以实现
GET /hotel/_search { "size": 0, "aggs": { "brandAgg": { "terms": { "field": "字段名", "size": 20 }, "aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算 "聚合名如score_stats": { // 聚合名称 "stats": { // 聚合类型,这里stats可以计算min、max、avg等。stats是statistics统计缩写 "field": "score" // 聚合字段,这里是score } } } } } }
1.3.RestAPI实现聚合
1.3.1.Restclient语法
聚合条件与query条件同级别,因此需要使用request.source()来指定聚合条件。
注意:request.source().aggregation(),聚合不是数组,虽然DSL是"aggs",但它不是数组,所以不是request.source().aggregations()
聚合结果:
聚合的解析与查询的解析是一样的都是通过JSON逐层解析的:
注意:response.getAggregations().get("brandAgg")的返回结果要是Terms,注意包别导错了,提示的第一个不是es的包。
2.自动补全
当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项;
2.1.pinyin拼音分词器
下载地址:https://github.com/medcl/elasticsearch-analysis-pinyin
安装方式与IK分词器一样,分三步:
①解压
②上传到虚拟机中,elasticsearch的plugin目录
/var/lib/docker/volumes/es-plugins/_data
③重启elasticsearch
docker restart es
④测试
详细安装步骤可以参考IK分词器的安装过程。
POST /_analyze { "text": "如家酒店还不错", "analyzer": "pinyin" }
结果:
2.2.实现方法
默认的拼音分词器会将每个汉字单独分为拼音,而我们希望的是每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器。
elasticsearch中分词器(analyzer)的组成包含三部分:
-
character filters:在tokenizer之前对特殊字符进行处理。例如删除字符、替换字符
-
tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
-
tokenizer filter:将tokenizer输出的词条做进一步处理,tokenizer的词条结果依然在,只是处理后新加了一些。例如大小写转换、同义词处理、拼音处理等
拼音分词器处理文档流程:
自定义分词器,把ik分词结果过滤成拼音:
settings-analysis下定义分词器analyzer和filter
PUT /test { //设置分词器和过滤器 "settings": { "analysis": { "analyzer": { // 自定义分词器 "my_analyzer": { // 分词器名称,这里不需要指定character filters过滤器,因为没有特殊字符需要处理 "tokenizer": "ik_max_word", "filter": "my_py_filter" //对ik分词结果做进一步处理 } }, "filter": { // 自定义tokenizer filter "my_py_filter": { // 过滤器名称 "type": "pinyin", // 过滤器类型,填写分词器名,这里是pinyin "keep_full_pinyin": false,//eg: 刘德华> [liu,de,hua], default: true "keep_joined_full_pinyin": true,//eg: 刘德华> [liudehua], default: false "keep_original": true,//保留原始输入,默认false "limit_first_letter_length": 16,// "remove_duplicated_term": true,// "none_chinese_pinyin_tokenize": false// 默认true。eg: liudehuaalibaba13zhuanghan -> liu,de,hua,a,li,ba,ba,13,zhuang,han } } } }, //创建索引 "mappings": { "properties": { "name": { "type": "text", "analyzer": "my_analyzer", //拼音分词器适合在创建索引时使用,不能在搜索时候用 "search_analyzer": "ik_smart" //如果搜索时用拼音分词器,搜索"狮子爱跳舞",会搜出"虱子"等同音字 } } } }
注意:拼音分词器适合在创建索引时使用,不能在搜索时候用,如果搜索时用拼音分词器,搜索"狮子爱跳舞",会搜出"虱子"等同音字。
2.3.自动补全查询conmpetion suggester
Completion Suggester查询实现自动补全功能。匹配用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:
-
参与补全查询的字段必须是completion类型,数据是字符串数组。completion译为完成
-
字段的内容一般是用来补全的多个词条形成的数组。
创建索引库:
// 创建索引库 PUT test { "mappings": { "properties": { "title":{ "type": "completion" } } } }
插入数据:
// 示例数据 POST test/_doc { "title": ["天苍苍", "野茫茫"] } POST test/_doc { "title": ["天府", "天下"] } POST test/_doc { "title": ["世界", "黄天"] }
自动补全查询:
// 自动补全查询 GET /test/_search { "suggest": { "titleSuggest": { //例如自定义查询名称 "text": "天", // 关键字 "completion": { "field": "title", // 补全查询的字段,例如title "skip_duplicates": true, // 跳过重复的 "size": 10 // 获取前10条结果 } } } }
2.4.创建新索引库,使用自定义分词器
//酒店数据索引库。先删除旧的,再新的 DELETE /hotel PUT /hotel { "settings": { "analysis": { "analyzer": { "text_anlyzer": { //ik+拼音过滤 "tokenizer": "ik_max_word", "filter": "py" }, "completion_analyzer": { //keyword+拼音过滤,相当于又保持关键词,又新加定制版拼音分词 "tokenizer": "keyword", "filter": "py" } }, "filter": { "py": { "type": "pinyin", "keep_full_pinyin": false, "keep_joined_full_pinyin": true, "keep_original": true, "limit_first_letter_length": 16, "remove_duplicated_term": true, "none_chinese_pinyin_tokenize": false } } } }, "mappings": { "properties": { "id":{ "type": "keyword" }, "name":{ "type": "text", "analyzer": "text_anlyzer", //新建文档时分词器用ik+拼音过滤 "search_analyzer": "ik_smart", //搜索分词器用ik "copy_to": "all" }, "address":{ "type": "keyword", "index": false }, "location":{ "type": "geo_point" }, "pic":{ "type": "keyword", "index": false }, "all":{ "type": "text", "analyzer": "text_anlyzer", "search_analyzer": "ik_smart" }, "suggestion":{ //补全字段suggestion "type": "completion", //补全字段类型必须completion "analyzer": "completion_analyzer" //补全分词器,keyword+拼音过滤 } } } }
2.5.自动补全查询的JavaAPI,SuggestBuilder()
suggest和query是平级的;
而自动补全的结果也比较特殊,解析的代码如下:
2.所遇问题描述:
3.扩展部分:
使用教程:
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步_java黑马酒店概述-CSDN博客
4.学习总结:
今天学习的速度相比之前慢了许多,有点心不在焉了;需要调整一下;今天主要学习了ES中的聚合语法,其中聚合的使用类似与数据库的聚集函数,同时ES中的聚合支持嵌套式,就比如文档的筛选后需要排序一样;聚合的使用场景通常会出现在数据的分类筛选中,如需要知道学校的学院有哪些,就可以通过聚合进行学院的分组;其次今天也学习了一些自动补全相关的内容,主要是扩展了之前的IK分词器,IK分词器支持的是中文分词,因此此次补上了拼音的分词器;自动补全的使用需要依赖于suggestion completion来定义需要自动补全的字段内容,同时通过于拼音分词器配合可以做到通过拼音首字母补全的功能,无论是聚合还是自动补全他们在java中的书写格式几乎和ES中编写是差不多的。
日期:9月21日
ElasticSearch基础——聚合、补全、集群。高亮+自定义分词器+自动补全+前后端消息同步
所学出处:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibili
1.今日内容摘要:
1.mysql与es数据同步
elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步。
1.1.1.思路分析
常见的数据同步方案有三种:
-
同步调用
-
异步通知(学习)
-
监听binlog
1.1.2.异步通知
流程如下:
-
hotel-admin对mysql数据库数据完成增、删、改后,发送MQ消息
-
hotel-demo监听MQ,接收到消息后完成elasticsearch数据修改
2.MQ实现数据同步
2.1.1.思路
使用RabbitMQ的发布/订阅模型topic话题模式,支持不同的消息根据routingKey被不同的队列消费。先声明交换机、队列,增删两个routingKey。只需要增删两个队列,restapi里增改是一致的,id存在则修改,id不存在则新增。
忘了就回顾:SpringCloud基础4——RabbitMQ和SpringAMQP
步骤:
-
声明exchange、queue、RoutingKey
-
在hotel-admin中的增、删、改业务中完成消息发送
-
在hotel-demo中完成消息监听,并更新elasticsearch中数据
-
启动并测试数据同步功能
2.1.2前置操作
0)开启RabbitMQ
docker ps -a docker start 容器名
管理端:
http://ip地址:15672/
1)引入依赖、yml
引入rabbitmq的依赖:
<!--amqp--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
yml:
server: port: 8099 spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/heima?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root password: 1234 main: banner-mode: off rabbitmq: #MQ的相关配置 host: 192.168.200.131 port: 5672 username: itcast password: 123321 virtual-host: / #虚拟主机 mybatis-plus: configuration: map-underscore-to-camel-case: true global-config: banner: false
2)常量类,声明队列交换机名称
在hotel-admin和hotel-demo中的cn.itcast.hotel.constatnts
包下新建一个类MqConstants
:
package cn.itcast.hotel.constants; public class MqConstants { /** * 交换机 */ public final static String HOTEL_EXCHANGE = "hotel.topic"; /** * 监听新增和修改的队列 */ public final static String HOTEL_INSERT_QUEUE = "hotel.insert.queue"; /** * 监听删除的队列 */ public final static String HOTEL_DELETE_QUEUE = "hotel.delete.queue"; /** * 新增或修改的RoutingKey */ public final static String HOTEL_INSERT_KEY = "hotel.insert"; /** * 删除的RoutingKey */ public final static String HOTEL_DELETE_KEY = "hotel.delete"; }
3)声明队列交换机
在config包下创建MqConfig,声明队列、交换机:
@Configuration public class MqConfig { @Bean public TopicExchange topicExchange(){ //第二个参数为是否持久化,第三个参数为是否自动删除。两个参数默认值就是持久化、不自动删除 return new TopicExchange(MqConstants.HOTEL_EXCHANGE, true, false); } @Bean public Queue insertQueue(){ return new Queue(MqConstants.HOTEL_INSERT_QUEUE, true); } @Bean public Queue deleteQueue(){ return new Queue(MqConstants.HOTEL_DELETE_QUEUE, true); } @Bean public Binding insertQueueBinding(){ return BindingBuilder.bind(insertQueue()).to(topicExchange()).with(MqConstants.HOTEL_INSERT_KEY); } @Bean public Binding deleteQueueBinding(){ return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstants.HOTEL_DELETE_KEY); } }
注意:在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:
-
如果新增时,ID已经存在,则修改
-
如果新增时,ID不存在,则新增
3.集群
3.1概述
单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。
-
海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点
-
单点故障问题:将分片数据在不同节点备份(replica )
ES集群相关概念:
-
一个集群里有多个节点,每个节点都是一个es实例, 每个节点保存了自己的分片和一个其他节点备份的分片。
-
集群(cluster):一组拥有共同的 集群名 的 节点。
-
节点(node) :集群中的一个 Elasticearch 实例
-
分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中
3.2.搭建ES集群
Docker Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
-
执行 docker-compose up 命令(后面加-d是在后台运行)来启动并运行整个应用程序
3.2.1.创建es集群
创建同一个集群的三个节点,每个节点都是一个es实例:
①首先编写一个docker-compose.yml文件,上传到/root,内容如下:
#创建三个es容器,容器名和节点名都是es01、es02、es03。 version: '2.2' services: es01: image: elasticsearch:7.12.1 #镜像名称 container_name: es01 #容器名称 environment: - node.name=es01 #集群名称。三个容器集群名称一样,es会自动把他们组装成一个集群。 - cluster.name=es-docker-cluster #集群中其他节点的ip地址;docker容器之间通过名字直接相互访问 - discovery.seed_hosts=es02,es03 #集群中可以参与选举的主节点 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #内存大小,最小和最大内存 volumes: - data01:/usr/share/elasticsearch/data ports: - 9200:9200 #对外端口9200:对内端口9200 networks: - elastic es02: image: elasticsearch:7.12.1 container_name: es02 environment: - node.name=es02 #集群名称。三个容器集群名称一样,es会自动把他们组装成一个集群。 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data02:/usr/share/elasticsearch/data ports: - 9201:9200 networks: - elastic es03: image: elasticsearch:7.12.1 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster #集群名称。三个容器集群名称一样,es会自动把他们组装成一个集群。 - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data03:/usr/share/elasticsearch/data networks: - elastic ports: - 9202:9200 volumes: data01: driver: local data02: driver: local data03: driver: local networks: elastic: driver: bridge
注意端口占用问题:ports:-9200:9200,左边是centos的端口,右边是容器内部端口,只有左边会发生端口占用问题,前面安装过单点es的默认接口是9200,注意一下。
②修改权限:
es运行需要修改一些linux系统权限,修改/etc/sysctl.conf
文件
vi /etc/sysctl.conf
添加下面的内容,或将注释打开:
vm.max_map_count=262144
然后执行命令,让配置生效:
sysctl -p
③通过docker-compose up启动集群:
docker-compose up -d
3.2.2.集群状态监控,安装cerebro
官方网址:GitHub - lmenezes/cerebro
1)进入对应的bin目录:
2)双击其中的cerebro.bat文件即可启动服务
3)双击其中的cerebro.bat文件即可启动服务
4)输入你的elasticsearch的任意节点的地址和端口,点击connect即可:
3.2.3.创建索引库
1)方法一:利用kibana的DevTools创建索引库
在DevTools中输入指令:
PUT /itcast { "settings": { "number_of_shards": 3, // 分片数量,shard译为碎片 "number_of_replicas": 1 // 副本数量,replica译为副本,复制品。 }, "mappings": { "properties": { // mapping映射定义 ... } } }
2)方法二:利用cerebro创建索引库
利用cerebro还可以创建索引库:
填写索引库信息:
4集群脑裂问题
集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。
详细内容通过扩展部分网址查看
2.所遇问题描述:
3.扩展部分:
详细教程:
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步_java黑马酒店概述-CSDN博客
4.学习总结:
今天学习了MYSQL与ES索引库之间的同步处理,主要分为同步与异步两种,现在用的较多的为同步处理,实现原理是基于队列的方式,当用户修改数据后通知ES索引库要更新数据,ES索引通过方法实现调用数据库刷新索引库的操作;其次今天也是了解了ES集群的实现以及ES集群有什么作用,当发生故障时ES的处理机制是怎么样的;今天学习的内容较少,相比之前,今天学的更清晰一点,没有那么的胡乱。
日期:9月25日
所学出处: 微信小程序开发 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili
1.今天所学内容摘要:
1.宿主环境--组件
1.1.1.scroll-view(滚动效果)
scroll-y 属性:允许纵向滚动 scroll-x 属性:允许横向滚动 设置滚动的方向 <scroll-view class="container1" scroll-y> 内容 </scroll-view> 设置固定高度 .container1{ width: 100px; height: 120px; }
注意:使用竖向滚动时,必须给scroll-view 一个固定高度
1.1.2.swiper 和 swiper-item 组件的基本使用(实现轮播图效果)
页面设计
<swiper class="swiper-container" indicator-dots indicator-color="white" indicator-active-color="green"> <swiper-item> <view class="item">A</view> </swiper-item> </swiper>
添加样式
.swiper-container{ height: 150; } .item{ height: 100%; line-height: 150px; text-align: center; }
1.1.3. text
通过 text 组件的 selectable 属性,实现长按选中文本内容的效果 <view> 长按选中: <text selectable>11111111</text> </view>
1.1.4.rich-text
通过 rich-text 组件的 nodes 属性节点,把 HTML 字符串渲染为对应的 UI 结构: <rich-text nodes="<h1 style='color:red'>标题</h1>"></rich-text>
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
今天学习了微信小程序开发的相关内容,主要是前端的内容;微信小程序的开发与VUE的使用差不了太多,就是有部分内容是不同的,今天暂时只是了解了几个关键的组件使用而已,然后了解了微信小程序中各个文件的作用以及结构层次;总体来所还是通俗易懂的,相比外国人开发的玩意,国人的开发总是好理解,今天学习上没有遇到什么问题,就是微信小程序的初始化设置一开始不了解,所以刚开始的时候会出现一些小事情,但是不算问题,只能是不了解而已,了解了就感觉没什么。 今天主要学习:block容器 hidden与wx:if wx:key @import
日期:9月26日
所学出处: 微信小程序开发 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili
1.今天所学内容摘要:
1.全局配置
1.1.1.tabBar
list: tab页签的列表 最少2个最多5个 pagePath: 页面路径,页面必须在pages中预先定义 text: tab上显示的文字 iconPath: 未选中时的图片路径 selectedIconPath: 选中时的图片路径 color: tab 上文字的默认 (未选中)颜色 selectedColor: tab 上的文字选中时的颜色 backgroundColor: tabBar 的背景色 borderStyle: tabBar 上边框的颜色 仅支持black/white position: tabBar的位置,仅支持bottom与top
"tabBar":{ "list": [ { "pagePath": "pages/index/index", "text": "index" }, { "pagePath": "pages/list/list", "text": "list" } ], "color": "#ff55ff", "backgroundColor": "#ffffff", "borderStyle": "black" }
注意:tabBar与window同级编写
1.1.2.全局window配置以及页面配置项
navigationBarBackgroundColor: 当前页面导航栏背景颜色,如 #000000 navigationBarTextStyle: 当前页面导航栏标题颜色,仅支持 black / white navigationBarTitleText: 当前页面导航栏标题文字内容 backgroundColor: 当前页面窗口的背景色 backgroundTextStyle: 当前页面下拉 loading 的样式,仅支持 dark / light enablePullDownRefresh: 是否为当前页面开启下拉刷新的效果 onReachBottomDistance: 页面上拉触底事件触发时距页面底部距离,单位为 px
注意:对于某些需要全局使用的配置项应配置在全局window配置中,对于部分页面的功能配置则单独实现在页面的JSON配置文件中
1.1.3.发送GET/POST请求
wx.request({ url: 'https://baidu.com', //请求的接口地址,必须基于https协议 method:'POST', //请求方式 data: { //发送到服务器的数据 name: 'zs', age: '22' }, success: (res) => { //请求成功之后的回调函数 console.log(res.data) } })
1.1.4.在页面加载时请求数据
在页面刚加载的时候,自动请求一些初始化数据
//生命周期函数--监听页面加载 onLoad:function (options){ this.add() }
2.页面导航
2.1.1.声明式导航
(1. 导航到tabBar页面
tabBar 页面指的是被配置为 tabBar 的页面 在使用<navigator> 组件跳转到指定的 tabBar 页面时,需要指定 url属性和 open-type 属性,其中:
-
url 表示要跳转的页面的地址,必须以 / 开头
-
open-type 表示跳转的方式,必须为 switchTab
<navigator url="/pages/message/message" open-type="switchTab"> 导航 </navigator>
(2. 导航到非tabBar页面
非tabBar 页面指的是没有被配置为 tabBar 的页面 在使用<navigator> 组件跳转到指定的 tabBar 页面时,需要指定 url属性和 open-type 属性,其中:
-
url 表示要跳转的页面的地址,必须以 / 开头
-
open-type 表示跳转的方式,必须为 navigate (默认 可不写)
<navigator url="/pages/info/info" open-type="navigate"> 导航 </navigator>
(3. 后退导航
如果要后退到上一页面或多级页面,则需要指定 open-type 属性和 delta 属性,其中:
-
open-type 的值必须是 navigateBack,表示要进行后退导航
-
delta 的值必须是数字,表示要后退的层级 (默认为1 可不写)
<navigator open-type="navigateBack" delta="1"> 返回上一页 </navigator>
2.1.2.编程式导航
(1. 导航到tabBar页面
调用wx.switchTab() 方法,跳转tabBar页面。
// 页面结构 <button bindtap="gotoMessage">跳转到消息页面</button> // 通过编程式导航,跳转到 message 页面 gotoMessage() { wx.switchTab({ url:' /pages/message/message )} }
(2. 导航到非tabBar页面
调用wx.navigateTo() 方法,跳转页面。
// 通过编程式导航,跳转到 message 页面 gotoMessage() { wx.navigateTo({ url:' /pages/message/message )} }
(3. 导航到非tabBar页面
调用wx.navigateBack() 方法。
gotoMessage() { wx.navigateBack() }
2.1.3.导航传参
(1.传参
无论是哪一种导航形式,都可以使用路径传参,即在路径后跟上 ? 然后参数;若添加多个参数则使用 & 衔接,与AJAX一致
(2.接参
接收导航传递参数需要在onLoad中接收,若需要使用,可在data中声明空变量,将接收参数赋予变量
//生命周期函数--监听页面加载 onLoad: function(options) { //options 就是导航传递过来的参数对象 console.log(options) }
3.页面事件
3.1.1.下拉刷新
全局启用 app.json中window节点下配置; "enablePullDownRefresh": true 局部启用 当前页面JSON配置文件中配置; "enablePullDownRefresh": true 样式配置 backgroundColor: 用来配置下拉刷新窗口的背景颜色,仅支持16 进制的颜色值 backgroundTextStyle: 用来配置下拉刷新 loading 的样式,仅支持 dark 和 light 页面相关事件处理函数--监听用户下拉动作 onPullDownRefresh () { console.log('触发下拉刷新') // 关闭下拉刷新 wx.stopPullDownRefresh() },
3.1.2.上拉触底
/** * 页面上拉触底事件的处理函数 */ onReachBottom() { console.log('上拉触底刷新') } //配置上拉触底距离(默认50px) json配置文件 "onReachBottomDistance": 150 //上拉触底刷新页面 原理:在触发条件的时候,调用请求,请求接下去要显示的内容,将请求到的数据输入到DATA变量保存,从而显示在页面 onReachBottom() { this.setData({ colorList: [ ...this.data.colorList, ...["/images/66.webp", "/images/67.webp", "/images/68.webp", "/images/69.webp"] ] }) } 加载提示框 wx:showLoading({title:"数据加载中..."}) //显示 wx.hindeLoading() //隐藏
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
今天学习了微信小程序中导航栏除的设计以及快速切换页面的tabBar设计;这两部分内容不难,反而简化了我们前端的学习难度,更好的帮助我们使用组件;其次今天也学习了一些请求方式如GET PoST等,然后是导航链接就是超链接,最后学习了页面事件的两种刷新,学习了微信小程序才知道小程序的开发不支持图片与文件共存,需要通过云服务的云存储来调用数据,总体来说今天学习相对轻松,没有问题,学习的内容也让我感兴趣,希望明天依旧如此
日期:9月27日
所学出处: 微信小程序开发 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili
1.今天所学内容摘要:
1.WXS脚本
1.1.1.内嵌WXS脚本
wxs 代码可以编写在 wxml文件中的 <wxs>标签内,就像Javascript 代码可以编写在html文件中的<script> 标签内一样。 wxml文件中的每个<wxs></wxs>标签,必须提供 module 属性,用来指定当前 wxs 的模块名称,方便在wxml中访问模块中的成员:
<view>{{m1.toUpper(username)}}</view> <wxs module="m1"> // 将大小写转换 module.exports.toUpper = function(str){ return str.toUpperCase() } </wxs>
1.1.2.定义外联的wxs脚本
wxs代码可以编写在以.wxs为后缀的文件内
//Itools.wxs 文件 function toLower(str) { return str.toLowerCase() } module.exports = { toLower: toLower }
在wxml中引入外联的 wxs 脚本时,必须为 <wxs> 标签添加 module 和 src属性,其中
-
module 用来指定模块的名称
-
src 用来指定要引入的脚本的路径,且必须是相对路径
<wxs src="../../utils/tools .wxs" module="m2"></wxs>
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
日期:9月28日
所学出处: 微信小程序开发 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili
1.今天所学内容摘要
1.自定义组件
1.1.1.数据监听器
数据监听器只能在组件中使用
数据监听器用于监听和响应任何属性和数据字段的变化,从而执行特定的操作。它的作用类似于 vue 中的watch 侦听器。在小程序组件中,数据监听器的基本语法格式如下:
Component({ data: {n1: 0,n2: 0,sum: 0}, methods: { add1() {this.setData({n1: this.data.n1 + 1})}, add2() {this.setData({n2: this.data.n2 + 1})}, }, observers: { 'n1,n2': function(n1,n2){ this.setData({sum: n1 + n2}) } } })
2.所遇到的问题描述:
3.扩展学习部分:
4.学习总结:
##