56.windows docker 安装ES、Go操作ES(github.com/olivere/elastic/v7库)

文章目录

  • 一、环境准备
    • 1、 docker安装ES
    • 2、启动容器
    • 3、图像化客户端工具ElasticSearch-Head
  • 二、Go ES连接与认证
    • 1、 连接ES
    • 2、配置ES认证
  • 三、索引的增删改查
  • 四、文档的增删改
    • 创建单个文档
    • 根据文档id删除文档
    • 批量删除文档
    • 批量创建文档
  • 五、文档查询
    • 列表查询
    • 精确匹配
    • 模糊匹配
    • 嵌套字段的搜索
  • 六、 更新文档

代码地址: https://gitee.com/lymgoforIT/golang-trick/tree/master/34-go-es

一、环境准备

1、 docker安装ES

首先需要先安装docker,这个网上教程很多,这里就默认docker已经安装好了。当然如果不想用docker的话,也可以和redis、kafka等组件一样,下载后加压、配置环境变量便可以开始使用了。

拉取elasticsearch的镜像

docker pull elasticsearch:7.12.0

在这里插入图片描述

创建docker容器挂载的目录

之所以在容器启动的时候要配置挂载的宿主机目录,是因为想要在宿主机(本机)上记录下来当前ES容器的配置信息,数据以及插件等,这样即使到时候我们把容器删了,重新用镜像生成容器时,只要挂载的还是这三个目录,那么即使镜像变了,端口变了,但是启动的容器和之前的会是一样的。

PS:挂载指是是宿主机(本机)的目录映射到容器中的某个目录,一方改动,另一方会相应的改动,通过容器启动时 -v 选项配置。

主要是三个目录:config 、data 、plugins,其实我们如果是自己安装ES,而不是通过docker安装的话,也是可以看到这三个目录的。

在这里插入图片描述
既然我们本次是用docker演示的,那就手动创建一下这三个目录吧,如下,放到了自己建的docker-es目录下
在这里插入图片描述
然后在config目录下建立配置文件elasticsearch.yml并写入内容 http.host: 0.0.0.0,表示监听本机上的所有IP地址, 也就是接收本机所有网卡发到本进程端口的请求
在这里插入图片描述

如果是linux的话,通过命令就可以完成上述步骤了,当然目录名字就稍微换了,毕竟linux没有盘符的概念

# linux的命令
mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/pluginschmod 777 /opt/es/dataecho "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml

2、启动容器

linux


docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/es/data:/usr/share/elasticsearch/data -v /opt/es/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

windows


docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v D:\\GoDevKit\\ElasticSearch\\docker-es\\config\\elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v D:\\GoDevKit\\ElasticSearch\\docker-es\\data:/usr/share/elasticsearch/data -v D:\\GoDevKit\\ElasticSearch\\docker-es\\plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

解释:

  • docker run :运行容器的命令
  • --name:启动后容器的名字
  • -p: port 端口映射,表示访问宿主机的9200端口,会映射访问到容器的9200端口,9200是外部访问esrestful端口,9300es集群内部节点之间通信的端口。
  • -e : env 环境变量,ES_JAVA_OPTS="-Xms84m -Xmx512m": esJava写的,这里是设置Java虚拟机相关参数
  • -v: volume 目录挂载映射,这里也可以看到es容器是自带了那三个目录的,就像我们自己安装es一样,只是现在我们想将宿主机的三个目录与之映射,这样即使删除了容器,之前新建的容器只要还是挂载的宿主机这三个目录,那就还是会和原来的容器一样的。
  • -d: daemon后台运行
  • 最后的参数时镜像名字

docker run参数补充
-i interactive 交互
-t terminal 伪终端运行
-u 指定用户启动

docker ps -q 中,-q表示仅打印 容器ID | 镜像ID
如 docker ps -f name=^mys 会打印出所有名字以mys开头的容器全部信息,-f为filter
而 docker ps -q -f name=^mys 只会打印出所有名字以mys开头的容器的ID

启动成功:
在这里插入图片描述

通过docker desktop可以看到容器正在运行中了

在这里插入图片描述

访问本机的9200端口

在这里插入图片描述

并且可以看到我们创建的data空目录中也就有一些数据了

在这里插入图片描述

3、图像化客户端工具ElasticSearch-Head

ElasticSearch-Head的安装和使用可以参考:https://www.cnblogs.com/xuwenjin/p/8792919.html

1、elasticsearch-head是一个基于node.js的前端工程,所以需要先安装node.js,下载地址:https://nodejs.org/en/download,下载完成后,基本就是无脑式下一步即可,安装完成后使用node -v查看版本判断是否安装成功。
在这里插入图片描述
2、安装grunt为全局命令,grunt是基于node.js的项目构建工具

npm install -g grunt-cli

grunt需要的一些jar包也安装上,需要联网下载,可能需要一点时间

npm instll

3、下载elasticsearch-head配置包,下载地址:https://github.com/mobz/elasticsearch-head

下载后,进入到该目录中,打开cmd,输入npm run start

在这里插入图片描述

打开浏览器连接,绿色表示连接成功了,事实上第一次操作是连接不上的,因为9100去连接9200端口,属于跨域了,是会被拒绝了,所以需要在elasticsearch.yml配置文件中加上允许跨域连接的配置

http.cors.enabled: true
http.cors.allow-origin: "*"

在这里插入图片描述

然后通过docker desktop 重启重启容器,就可以看到连接成功啦

在这里插入图片描述

在这里插入图片描述

二、Go ES连接与认证

安装依赖包

go get github.com/olivere/elastic/v7

1、 连接ES

对于连接操作,我们一般都是会定义一个包级别的变量,然后提供一个显示的Init方法,然后在main方法中初始化,如下

es_connect.go

package coreimport ("fmt""github.com/olivere/elastic/v7"
)var EsClient *elastic.Clientfunc InitEsConn() {client, err := elastic.NewClient(elastic.SetURL("http://127.0.0.1:9200"), // ES服务器地址// 我们的ES是通过docker启动的,所以会有docker为其分配的IP地址,但是我们想用本机的,然后通过端口映射访问到docker中的,所以这里设置false,表示跳过IP检查elastic.SetSniff(false),elastic.SetBasicAuth("", ""),)if err != nil {panic(any(err))}EsClient = clientfmt.Println(EsClient)
}

main.go

package mainimport "golang-trick/34-go-es/core"func main() {core.InitEsConn()
}

运行后,可以看到连接成功

在这里插入图片描述

2、配置ES认证

不需要认证的情况

  • 服务器自己使用,92009300端口不对外开放
  • 本身跑在127.0.0.1

需要认证的情况:

  • ES需要对外提供服务的,我们总不能让外部也能随意通过ip:端口的方式随意的访问到我们的ES数据,所以需要配置认证

配置认证的方式参考:https://blog.csdn.net/qq_38669698/article/details/130529829

  1. 启用认证,由于我们配置了目录映射,所以改宿主机的elasticsearch.yml文件即可,添加如下内容
#添加如下内容
#http.cors.allow-headers: Authorization #这个配置改为下面的
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

在这里插入图片描述

2.保存后,重启ES

docker restart es

在这里插入图片描述

  1. 设置用户密码

a. 上一步重启ES容器后,进入容器:

docker exec -it es /bin/bash

b. 进入容器后,执行以下命令

./bin/elasticsearch-setup-passwords interactive
出现:Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]

上边英文大概的意思是:你如果确定开启密码的话,需要设置以下六种账户的密码(建议设置成一样的)

Please confirm that you would like to continue [y/N]yEnter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana]: 
Reenter password for [kibana]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]:Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

在这里插入图片描述

c.完成以上的设置后,需要再次重启ES容器
在这里插入图片描述

d. 验证

http://127.0.0.1:9200/

可以看到再次访问,就需要我们输入用户名和密码了,用户名是固定的elastic,密码则是我们自己设置的

在这里插入图片描述

现在执行我们开始的连接代码,也会报错了,因为没有给用户名和密码

在这里插入图片描述

此外,使用ES-Head连接时,也需要改为http://localhost:9100/?auth_user=elastic&auth_password=123456,即需要带上用户名和密码了

在这里插入图片描述

三、索引的增删改查

在这里插入图片描述

首先我们创建一个结构体User,用于后续封装从ES中查询的出来的数据,并设置一个mapping(定义索引下的字段约束,其中properties表示的就是索引下文档的各字段)

user.go类似MySQL中的Model,定义结构体,表名等。这里就是ES的Model,定义索引名和mapping等。

package modelimport "time"type User struct {Id       uint   `json:"id"`UserName string `json:"user_name"`NickName string `json:"nick_name"`//Age       int    `json:"age"`CreateAt string `json:"create_at"`Title    string    `json:"title"`
}func (u *User) Index() string{return "user_index"
}func (u *User) Mapping() string {return `
{"mappings": {"properties": {"nick_name": { "type": "text"},"user_name": { "type": "keyword" // 完整匹配},"age": { "type": "integer" // 完整匹配},"id": {"type": "integer"},"created_at":{"type": "date","null_value": "null","format": "[yyyy-MM-dd HH:mm:ss]"}}}
}
`
}

index.go :索引的创建、删除、判断索引是否已经存在

package indexsimport ("context""fmt""golang-trick/34-go-es/core""golang-trick/34-go-es/model"
)func CreateIndex(indexName string) error {// 索引不存在时,我们才创建,否则请求创建已经存在的索引会报错的if ExistsIndex(indexName) {// 删除已经存在的索引,然后新建索引err := DeleteIndex(indexName)if err != nil {return err}}index, err := core.EsClient.CreateIndex(indexName).                // 创建索引BodyString((&model.User{}).Mapping()). // 指定索引的mapping,类似mysql中的表各字段的一个类型和其他约束Do(context.Background())               // 执行if err != nil {fmt.Println(err)return err}fmt.Println(fmt.Printf("创建了索引,索引:%v", index))return nil
}func ExistsIndex(indexName string) bool {exists, _ := core.EsClient.IndexExists(indexName).Do(context.Background())return exists
}func DeleteIndex(indexName string) error {_, err := core.EsClient.DeleteIndex(indexName).Do(context.Background())fmt.Println("删除了索引")return err}

运行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/indexs"
)func main() {core.InitEsConn()indexs.CreateIndex("user_index")
}

ES-Head中可以看到索引和相关字段了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

再次执行的话,会按我们的代码定义的方式,先删除原有的索引,然后创建新的索引

在这里插入图片描述

四、文档的增删改

创建单个文档

package docsimport ("context""fmt""golang-trick/34-go-es/core""golang-trick/34-go-es/model""time"
)func CreateDoc() {user := &model.User{Id:       10,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:03:04"), // 需要按照mapping中的约束格式传,否则报错Title:    "学习创建索引",}indexResp, err := core.EsClient.Index().                 // 表明是要对索引进行操作Index(user.Index()).     // 指定要操作的索引BodyJson(user).          // 文档的内容,会将结构体给我们转为JSON字符串Do(context.Background()) // 执行if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", indexResp)
}

运行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")docs.CreateDoc()
}

在这里插入图片描述
在这里插入图片描述

要注意的是,这样查看显示的数据是不全的,比如上面就没有显示titlecreate_at字段,可以点击文档,查看JSON样式的完整数据

在这里插入图片描述

如果是mapping里面没有的字段,文档也是可以创建成功的,并且会加上该字段,如上面的title字段在mapping中就是没有的,但是也保存到文档中成功了。

根据文档id删除文档

// 注意:这里的id是文档id,不是文档内容中的id字段
func DeleteDoc(id string) {deleteResp, err := core.EsClient.Delete().                       // 获取一个DeleteService对象Index((&model.User{}).Index()). // 指明索引Id(id).Refresh("true"). // 删除后,索引会过一会才刷新,这里传true,索引会立即刷新,删除操作我们一般都传trueDo(context.Background())if err != nil { // 如果文档不存在,会报404错误fmt.Println(err)return}fmt.Printf("%#v\n", deleteResp)}

执行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")
}

在这里插入图片描述
在这里插入图片描述

批量删除文档

批量删除需要用到Bulk对象,将要操作的文档放入Bulk中,然后一次性提交给ES服务器执行

在这里插入图片描述

执行前我们又插入了两条数据,用于测试
在这里插入图片描述

根据文档ID列表批量删除文档代码


// 注意:这里的id是文档id,不是文档内容中的id字段
// 传入文档id列表
func BatchDeleteDoc(ids []string) {bulkService := core.EsClient.Bulk(). // 获取BulkService对象Index((&model.User{}).Index()). // 指明要操作的索引Refresh("true")for _, id := range ids {bulk := elastic.NewBulkDeleteRequest().Id(id)bulkService.Add(bulk)}bulkResp, err := bulkService.Do(context.Background())if err != nil {fmt.Println(err)return}// 如果文档不存在,不会有错误,bulkResp.Succeeded()为空,否则就是删除成功的数量fmt.Printf("%#v\n", bulkResp.Succeeded()) }

执行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})
}

批量删除成功

在这里插入图片描述

批量创建文档

与批量删除类似,只是添加到BulkService对象中的对象变为了BulkCreateRequest

func BatchCreateDoc() {userList := []model.User{{Id:       11,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:04:05"),},{Id:       12,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:04:05"),},}bulkService := core.EsClient.Bulk(). // 获取BulkService对象Index((&model.User{}).Index()). // 指明要操作的索引Refresh("true")for _, user := range userList {// 与批量删除主要就是这一行不同bulk := elastic.NewBulkCreateRequest().Doc(user)bulkService.Add(bulk)}bulkResp, err := bulkService.Do(context.Background())if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", bulkResp)}

执行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})docs.BatchCreateDoc()
}

在这里插入图片描述

五、文档查询

列表查询

返回结构如下,主要是res.Hits.Hits中的一条记录,是SearchHit对象,里面的Source为我们的文档数据,json.RawMessage就是[]byte的别名而已,所以可以直接转为string,或者反序列化到我们的结构体对象中
在这里插入图片描述

代码如下:

func FindDoc() {query := elastic.NewBoolQuery()res, err := core.EsClient.Search((&model.User{}).Index()). // 指定索引,且表明是查询操作Query(query). // 查询条件From(0). // 分页操作Size(10).Do(context.Background())if err != nil {fmt.Println(err)return}count := res.Hits.TotalHits.Valuefmt.Println(count)for _, hit := range res.Hits.Hits {fmt.Println(string(hit.Source))}
}

执行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})// docs.BatchCreateDoc()docs.FindDoc()
}

在这里插入图片描述

精确匹配

精确匹配只能对mapping中定义为keyword的字段生效,比如下面我们只能对user_name使用精确匹配,对nick_name字段无法使用,所以在设计索引时,如果已知后面会对某个字段进行精确匹配,应该将其设置为keyword类型

在这里插入图片描述

代码:

func FindDoc() {limit := 10page := 1from := (page - 1) * limit//query := elastic.NewBoolQuery()query := elastic.NewTermQuery("user_name", "lym")res, err := core.EsClient.Search((&model.User{}).Index()). // 指定索引,且表明是查询操作Query(query).                    // 查询条件From(from).                      // 分页操作Size(limit).Do(context.Background())if err != nil {fmt.Println(err)return}count := res.Hits.TotalHits.Valuefmt.Println(count)for _, hit := range res.Hits.Hits {fmt.Println(string(hit.Source))}
}

执行:
在这里插入图片描述
如果换成nick_name,即使写为了完全正确的夜空中最亮的星,也是匹配不到结果的,因为nick_nametypetext,不是keyword
在这里插入图片描述

模糊匹配

  • 主要是查text,也能查keyword

  • 模糊匹配keyword字段,是需要查完整的

  • 匹配text字段则不用,搜完整的也会搜出很多

代码:

查询对象换为NewMatchQuery即可

在这里插入图片描述

嵌套字段的搜索

我们在创建索引时,并没有指定title字段的mapping,但是因为在插入文档时,带了title字段,es会自动帮我们将其加入到mapping中,且是一个嵌套类型,如下

"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}
}

因为titletext类型,只能模糊匹配,但是需要精确匹配的时候,也能通过title.keyword的形式进行精确匹配,如下

query := elastic.NewTermQuery("title.keyword", "学习创建索引2") // 精确匹配
//query := elastic.NewMatchQuery("title", "学习")  // 模糊匹配

六、 更新文档

更新文档,我们一般都是已经知道文档id了,所以就是根据文档id进行更新,传入map即可

更新前

在这里插入图片描述
代码:

func UpdateDoc(id string) {res, err := core.EsClient.Update().Index((&model.User{}).Index()).Id(id).Doc(map[string]any{"user_name": "lymUpdate",}).Do(context.Background())if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", res)
}

执行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})// docs.BatchCreateDoc()// docs.FindDoc()docs.UpdateDoc("eqmeWYwBwPESsKz-nasc")
}

更新后
在这里插入图片描述

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

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

相关文章

五、Microsoft群集服务(MSCS)环境的搭建

一、【目的】 学会利用Windows Server布置群集环境。 二、【设备】 FreeNAS11.2,Windows Server 2019 三、【要求】 学会利用Windows Server布置群集环境,掌握处理问题的能力。 配置表: 节点公网IP(public)内网IP(private)群集IP(clust…

linux磁盘空间清理

查看磁盘使用情况 查看磁盘分区上可以使用的磁盘空间 $ df -h若要查看文件类型和block,使用下面的命令 $ df -T查看每个文件和目录的磁盘使用空间,也就是文件的大小。 $ sudo du -sh /* $ sudo du -h --max-depth1 /清理旧的 Snap 包版本以释放磁盘空…

华为OD试题六(数据最节约的备份方法、TLV解码)

1. 数据最节约的备份方法 题目描述: 有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求 使用光盘最少的文件分布方式 所有文件的大小都是整数的MB,且不超过500MB;文件不能分割、分卷…

centos-LAMP搭建与配置(论坛网站)

文章目录 LAMP简介搭建LAMP环境安装apache(httpd)安装mysql安装PHP安装php-mysql安装phpwind LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:Linux操作系统,网页服务器Apache,…

工作遇到问题与解决办法(二)

弹出确认框 this.$confirm(确定删除全部添加的数据吗?, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning}).then(() > {// 确定操作this.addYpslTempList[];this.isSelectfalse;//删除状态this.addMultiple true;this.$message({type: success,mes…

MySQL InnoDB存储引擎中的索引结构解析

目录 常见的几种数据结构1、二叉树2、红黑树3、B树4、B树5、总结 索引结构1、聚簇索引和非聚簇索引2、Hash索引3、总结 常见的几种数据结构 1、二叉树 特点: 每个节点最多有两个子节点,分别称为左子节点和右子节点。通常不是自平衡的,可能…

Mac中nvm切换node版本失败

Mac中使用 nvm 管理 node 版本,在使用指令:nvm use XXX 切换版本之后。 关闭终端,再次打开,输入 node -v 还是得到之前的 node 版本。 原因: 在这里这个 default 中有个 node 的版本号,使用 nvm use 时&a…

spring boot 实现直播聊天室(二)

spring boot 实现直播聊天室(二) 技术方案: spring bootnettyrabbitmq 目录结构 引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.96.Final</version> </dependency>Si…

安装DevEco Studio

下载 首先进入鸿蒙开发者官网&#xff0c;顶部导航栏选择开发->DevEco Studio 根据操作系统下载不同版本&#xff0c;其中Mac(X86)为英特尔芯片&#xff0c;Mac(ARM)为M芯片。 安装 下载完毕后&#xff0c;开始安装。 点击Agree 首次使用&#xff0c;请选择Do not impor…

Vue 详细教程

Vue实战 1. Vue 引言 渐进式 JavaScript 框架 --摘自官网 官网地址&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js # 渐进式 1. 易用 html css javascript 2. 高效 开发前端页面 非常高效 3. 灵活 开发灵活 多样性 # 总结 Vue 是一个javascript 框架 js 简化页面js操作…

Pr自动从视频脚本剪辑视频FirstCut插件免费下载

FirstCut 插件将自动从视频脚本中剪辑视频&#xff0c;在例如新闻、采访、自媒体视频等带有配音或字幕内容的视频制作中提高了粗剪效率。 使用 FirstCut&#xff0c;大大缩短了粗剪的时间&#xff0c;而不是转到每个视频文件并找到 IN 点和 OUT 点&#xff0c;然后将其插入到序…

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…

数据库动态视图和存储过程报表数据管理功能设计

需求&#xff1a;需要将ERP的报表数据挪到OA中&#xff0c;但是OA表单设计不支持存储过程动态传参&#xff0c;所以需要设计一个系统&#xff0c;可以手动配置&#xff0c;动态显示原本ERP的报表数据&#xff0c;ERP报表是存在数据库的视图和存储过程中 思路&#xff1a;因为E…

c#按照时间进行数据存储(不用数据库)

概要介绍 按照日期生成文件夹&#xff0c;按照时间生成文件名&#xff0c;存储字符串。 可以用于简单数据记录&#xff08;如果数据存储考虑格式文本&#xff0c;保存为csv格式&#xff09; 实现效果 调用方法 SaveText.saveStr("测试字符串"DateTime.Now.ToStrin…

高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 高效排队&#xff0c;紧急响应&#xff1a;RabbitMQ Priority Queue全面指南 引言前言第一&#xff1a;初识RabbitMQ Priority Queue插件插件的背景和目的&#xff1a;为什么需要消息优先级&#xff1…

我的NPI项目之Android 安全系列 -- Google Wallet and Secure Element(SE)

随着电子支付的兴起&#xff0c;越来越多的支付方式出现在我们的生活中。其中就有基于NFC的“碰一碰”的支付&#xff0c;支付宝的“扫一扫”支付&#xff0c;我们还知道有Google Pay(Wallet), Apple Pay(Wallet)。作为Android BSP的开发者&#xff0c;我比较关心的是Google Pa…

Processon的使用以及流程图的绘制

目录 一、ProcessOn 1.2 官方网站 门诊流程图 会议OA流程图 药库采购入库流程图 ​住院流程图 二、Axure自定义元件库 2.1 新建元件库 2.2 自定义元件 2.3 添加元件库 一、ProcessOn ProcessOn是一款在线的流程图、思维导图、组织结构图、网络拓扑图等多种图表类型…

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…

Java基础面试题小结

基础面试题 Java语言简介 Java是1995年由sun公司推出的一门高级语言&#xff0c;该语言具备如下特点: 简单易学&#xff0c;相较于C语言和C&#xff0c;没有指针的概念&#xff0c;所以操作和使用是会相对容易一些。平台无关性&#xff0c;即Java程序可以通过Java虚拟机在不…

MongoDB 与 Python 的交互

文章目录 第1关&#xff1a;MongoDB 与 Python 的交互 第1关&#xff1a;MongoDB 与 Python 的交互 编程要求 根据提示&#xff0c;在右侧编辑器 Begin-End 处补充代码&#xff0c;完成右侧程序。 测试说明 点击评测&#xff0c;平台会对你编写的代码进行测试。 import pymo…