【实战】jenkins api 接口

news2024/12/24 20:49:14

jenkins api 接口实战

  • 一、Jenkins Api简介
  • 二、Jenkins Api 环境准备
    • 1、获取所有job接口
    • 2、获取所有job名字接口
    • 3、获取所有job名字和url接口
  • 三、使用curl调用 获取所有构建队列
  • 四、使用curl调用 获取Job信息
  • 五、使用curl调用操作Job
    • 1、操作Job需要验证crumb
      • a、使用token发起接口(不推荐)
      • b、获取crumb使用
      • c、上面命令操作完成后会生成config.xml文件
    • 2、创建job
    • 3、复制job
    • 4、修改job
    • 5、无参构建
    • 6、有参构建
    • 7、删除job
  • 六、使用curl调用 操作指定构建的Job
    • 1、查看最新构建任务编号
    • 2、查看某次构建控制台日志
    • 3、删除某次构建
  • 七、Python Jenkins Api常用接口操作
    • 1、安装 pip install jenkinsapi
    • 2、jenkinsapi 连接Jenkins服务
    • 3、jenkinsapi 获取所有jobs
    • 4、jenkinsapi 获取构建队列
    • 5、jenkinsapi 获取Job信息
    • 6、jenkinsapi 操作Job信息
      • a、查看my_job.get_config()信息
      • b、查看生成的config.xml文件
    • 7、jenkinsapi 操作指定构建的Job
    • 8、整合以上代码

一、Jenkins Api简介

Jenkins 对外暴露的动作交付入口
为外部程序提供入口,可以控制Jenkins
支持协议 - Http
Api 接口支持用户名、密码认证
Jenkins Api支持的典型功能:运行Job、查看任务状态、返回任务编号…等

二、Jenkins Api 环境准备

创建一个有任务运行和查询权限的用户
较老版本的Jenkins操作关闭跨站脚本伪造请求保护,新版本的Jenkins无此选项了

1、获取所有job接口

curl -u USERNAME:PASSWORD “JENKINSURL:PORT/api/json?pretty=true”

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/api/json?pretty=true"

在这里插入图片描述

2、获取所有job名字接口

[root@mylinux1 ~]# curl -u admin:admin -g "http://192.168.22.3:8080/api/json?pretty=true&tree=jobs[name]"

{
  "_class" : "hudson.model.Hudson",
  "jobs" : [
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "build_no_params"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "build_with_params"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "father_job"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "first_job"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "git_demo"

3、获取所有job名字和url接口

[root@mylinux1 ~]# curl -u admin:admin -g "http://192.168.22.3:8080/api/json?pretty=true&tree=jobs[name,url]"

{
  "_class" : "hudson.model.Hudson",
  "jobs" : [
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "build_no_params",
      "url" : "http://192.168.22.3:8080/job/build_no_params/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "build_with_params",
      "url" : "http://192.168.22.3:8080/job/build_with_params/"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "father_job",
      "url" : "http://192.168.22.3:8080/job/father_job/"
    },

三、使用curl调用 获取所有构建队列

curl -u USERNAME:PASSWORD JENKINSURL:PORT/queue/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/queue/api/json?pretty=true"
{
  "_class" : "hudson.model.Queue",
  "discoverableItems" : [
    
  ],
  "items" : [
    
  ]

四、使用curl调用 获取Job信息

获取任务所有信息
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/build_with_params/api/json?pretty=true" 

获取最后一次构建信息
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/lastBuild/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/build_with_params/lastBuild/api/json?pretty=true"

获取最后稳定构建信息
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/lastStableBuild/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/build_with_params/lastStableBuild/api/json?pretty=true"

获取最后成功的构建
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/lastSuccessfulBuild/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/build_with_params/lastSuccessfulBuild/api/json?pretty=true"

获取最后完成的构建
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/lastCompletedBuild/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/build_with_params/lastCompletedBuild/api/json?pretty=true"

最近失败的构建
curl -u USERNAME:PASSWORD JENKINSURL:PORT/job/JOBNAME/lastFailedBuild/api/json?pretty=true

[root@mylinux1 ~]# curl -u admin:admin "http://192.168.22.3:8080/job/maven_demo/lastFailedBuild/api/json?pretty=true"

五、使用curl调用操作Job

1、操作Job需要验证crumb

a、使用token发起接口(不推荐)

在这里插入图片描述

b、获取crumb使用

[root@mylinux1 ~]# username_password="admin:admin"
[root@mylinux1 ~]# jenkins_url="http://192.168.22.3:8080"
[root@mylinux1 ~]# cookie_file="$(mktemp)"
[root@mylinux1 ~]# jenkins_crumb=$(curl -s -f -u "${username_password}" --cookie-jar "${cookie_file}" -s "${jenkins_url}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
[root@mylinux1 ~]# echo $jenkins_crumb
Jenkins-Crumb:bcc9f0c335fbcffe6e12f5aa4398ec2bdc74749b72b3389003bdc3f321d9b164

c、上面命令操作完成后会生成config.xml文件

[root@mylinux1 ~]# ls config.xml
config.xml
vim config.xml

<?xml version='1.1' encoding='UTF-8'?>
<project>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.tasks.Shell>
      <command>echo &quot;good&quot;</command>
      <configuredLocalRules/>
    </hudson.tasks.Shell>
  </builders>
  <publishers/>
  <buildWrappers/>
</project>

2、创建job

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/createItem?name=create_job2" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}" -H 'Content-Type:text/xml' --data-binary "@./config.xml"
[root@mylinux1 ~]# 

在这里插入图片描述

3、复制job

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/createItem?name=create_job3&mode=copy&from=create_job1" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}"
[root@mylinux1 ~]# 

在这里插入图片描述

4、修改job

在这里插入图片描述

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/create_job2/config.xml" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}" -H 'Content-Type:text/xml' --data-binary "@./config.xml"
[root@mylinux1 ~]# 

在这里插入图片描述

5、无参构建

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/build_no_params/build" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}"
[root@mylinux1 ~]# 

在这里插入图片描述

6、有参构建

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/build_with_params/buildWithParameters" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}" --data-urlencode json='{"env":"dev"}'

在这里插入图片描述

7、删除job

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/create_job2/doDelete" --cookie "${cookie_file}" -X POST -H "${jenkins_crumb}"

六、使用curl调用 操作指定构建的Job

查看最新构建任务编号
curl -u USERNAME:PASSWORD “JENKINSURL:PORT/job/son_demo/lastBuild/buildNumber”

查看某次构建控制台日志
curl -u USERNAME:PASSWORD “JENKINSURL:PORT/job/JOBNAME/ID/logText/progressiveText”

删除某次构建
curl -u USERNAME:PASSWORD "JENKINSURL:PORT/job/JOBNAME/ID/doDelete" -X POST --cookie "${cookie_file}" -H "${jenkins_crumb}"

1、查看最新构建任务编号

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/build_with_params/lastBuild/buildNumber"
5[root@mylinux1 ~]# 

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

2、查看某次构建控制台日志

[root@mylinux1 ~]# curl -u "${username_password}" "${jenkins_url}/job/build_with_params/6/logText/progressiveText"Started by user admin
Running as SYSTEM
Building on the built-in node in workspace /var/jenkins_home/workspace/build_with_params
[build_with_params] $ /bin/sh -xe /tmp/jenkins11717514708564825855.sh
+ [ online = dev ]
+ [ online = test ]
+ [ online = online ]
+ echo online runtime
online runtime
Finished: SUCCESS
[root@mylinux1 ~]# 

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

3、删除某次构建

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

七、Python Jenkins Api常用接口操作

1、安装 pip install jenkinsapi

2、jenkinsapi 连接Jenkins服务

from jenkinsapi import jenkins

class JenkinsApiStudy:

    def __init__(self):
        """
        实现对jenkins的连接
        """
        jenkins_url="http://192.168.22.3:8080"
        #username="admin"
        #password="admin"
        用户名="admin"
        密码="admin"
        self.my_jenkins = jenkins.Jenkins(jenkins_url, username, password, use_crumb=True)

3、jenkinsapi 获取所有jobs

    def get_all_jobs(self):
        """
        jenkinsapi 获取所有jobs
        :return:
        """
        jobs=[]
        # 需要注意,如果请求的url与Jenkins Location配置的Jenkins URL不一致时,获取到的key会拼接上一截地址
        #jobs=self.my_jenkins.keys()  # 获取所有的job名称
        for info in self.my_jenkins.get_jobs_info():
            jobs.append(info) # 获取job的url与名称  比较卡
        return jobs

4、jenkinsapi 获取构建队列

    def get_queue(self):
        """
        获取队列信息
        :return:
        """
        return self.my_jenkins.get_queue().keys()

5、jenkinsapi 获取Job信息

    def get_job_info(self,job_name):
        """
        jenkinsapi 获取Job信息
        :return:
        """
        # 获取job对象
        my_job=self.my_jenkins.get_job(job_name)
        # 获取最后一次构建对象
        print(my_job.get_last_build())
        # 获取最后一次完成的构建对象
        print(my_job.get_last_completed_build())
        # 获取最后一次成功的构建对象
        print(my_job.get_last_good_build())
        # 获取最后一次失败的构建编号
        print(my_job.get_last_failed_buildnumber())

6、jenkinsapi 操作Job信息

        def deal_job(self,job_name):
        """
        jenkinsapi 操作Job信息
        :param job_name: job名称
        :return:
        """
        #my_job = self.my_jenkins.get_job(job_name)
        # 获取job的config
        #print(my_job.get_config())
        # 创建job
        # 先获取到job的config
        with open(f"{job_name}_config.xml", "w", encoding="utf-8") as f:
            my = self.my_jenkins.get_job(job_name).get_config()
            f.write(my)
        self.my_jenkins.create_job("create_python_job", open("./build_no_params_config.xml", encoding="utf-8").read())
        # 复制job
        self.my_jenkins.copy_job(job_name, "build_no_params_job1")
        #todo 禁用job:当创建job或者复制job时,会出现job没有构建功能;操作:禁用后再操作启用
        #my_job.disable()
        # 启用job
        #my_job.enable()
        # 重命名job
        self.my_jenkins.rename_job(job_name, f"{job_name}_new")
        # 无参构建
        self.my_jenkins.build_job(job_name)
        # 有参构建
        self.my_jenkins.build_job(job_name, params={"env": "test"})
        # 删除job
        #self.my_jenkins.delete_job(job_name)

a、查看my_job.get_config()信息

在这里插入图片描述

b、查看生成的config.xml文件

 def deal_job(self,job_name):
        """
        jenkinsapi 操作Job信息
        :param job_name: job名称
        :return:
        """
        #my_job = self.my_jenkins.get_job(job_name)
        # 获取job的config
        #print(my_job.get_config())
        # 创建job
        # 先获取到job的config
        with open(f"{job_name}_config.xml", "w", encoding="utf-8") as f:
            my = self.my_jenkins.get_job(job_name).get_config()
            f.write(my)
        self.my_jenkins.create_job("create_python_job", open("./build_no_params_config.xml", encoding="utf-8").read())

在这里插入图片描述

7、jenkinsapi 操作指定构建的Job

    def get_build_info(self,job_name,build_id=None):
        """
        jenkinsapi 操作指定构建的Job 获取build信息
        :param job_name: job名称
        :param build_id: 构建id
        :return:
        """
        my_job = self.my_jenkins.get_job(job_name)
        # 当前job对象是否在队列/构建中
        print(my_job.is_queued_or_running())
        # 获取指定构建ID的对象
        build_object = my_job.get_build(build_id)
        # 获取构建对象的时间戳
        print(build_object.get_timestamp())
        # 获取控制台日志
        print(build_object.get_console())
        # 获取构建参数
        print(build_object.get_params())
        # 获取构建的状态
        print(build_object.get_status())
        # 获取构建的变更日志
        print(build_object.get_changeset_items())
        # 删除指定构建
        #my_job.delete_build(build_id)

输出结果

2023-04-16 05:52:26+00:00
Started by user admin
Running as SYSTEM
Building on the built-in node in workspace /var/jenkins_home/workspace/build_with_params
[build_with_params] $ /bin/sh -xe /tmp/jenkins12197874264732667620.sh
+ [ test = dev ]
+ [ test = test ]
+ echo test runtime
test runtime
Finished: SUCCESS

{'env': 'test'}
SUCCESS
[]

8、整合以上代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/4/16 21:47
# @Author  : 杜兰特
# @File    : jenkins_api_study.py

from jenkinsapi import jenkins

class JenkinsApiStudy:

    def __init__(self):
        """
        实现对jenkins的连接
        """
        jenkins_url="http://192.168.22.3:8080"
        #username="admin"
        #password="admin"
        用户名="admin"
        密码="admin"
        self.my_jenkins = jenkins.Jenkins(jenkins_url, username, password, use_crumb=True)

    def get_all_jobs(self):
        """
        jenkinsapi 获取所有jobs
        :return:
        """
        jobs=[]
        # 需要注意,如果请求的url与Jenkins Location配置的Jenkins URL不一致时,获取到的key会拼接上一截地址
        #jobs=self.my_jenkins.keys()  # 获取所有的job名称
        for info in self.my_jenkins.get_jobs_info():
            jobs.append(info) # 获取job的url与名称  比较卡
        return jobs

    def get_queue(self):
        """
        获取队列信息
        :return:
        """
        return self.my_jenkins.get_queue().keys()

    def get_job_info(self,job_name):
        """
        jenkinsapi 获取Job信息
        :return:
        """
        # 获取job对象
        my_job=self.my_jenkins.get_job(job_name)
        # 获取最后一次构建对象
        print(my_job.get_last_build())
        # 获取最后一次完成的构建对象
        print(my_job.get_last_completed_build())
        # 获取最后一次成功的构建对象
        print(my_job.get_last_good_build())
        # 获取最后一次失败的构建编号
        print(my_job.get_last_failed_buildnumber())

    def deal_job(self,job_name):
        """
        jenkinsapi 操作Job信息
        :param job_name: job名称
        :return:
        """
        my_job = self.my_jenkins.get_job(job_name)
        # 获取job的config
        print(my_job.get_config())
        # 创建job
        # 先获取到job的config
        # with open(f"{job_name}_config.xml", "w", encoding="utf-8") as f:
        #     my = self.my_jenkins.get_job(job_name).get_config()
        #     f.write(my)
        #self.my_jenkins.create_job("create_python_job", open("./build_no_params_config.xml", encoding="utf-8").read())
        # 复制job
        # self.my_jenkins.copy_job(job_name, "build_no_params_job1")
        #todo 禁用job:当创建job或者复制job时,会出现job没有构建功能;操作:禁用后再操作启用
        #my_job.disable()
        # # 启用job
        #my_job.enable()
        # 重命名job
        # self.my_jenkins.rename_job(job_name, f"{job_name}_new")
        # 无参构建
        # self.my_jenkins.build_job(job_name)
        # 有参构建
        # self.my_jenkins.build_job(job_name, params={"env": "test"})
        # # 删除job
        #self.my_jenkins.delete_job(job_name)


    def get_build_info(self,job_name,build_id=None):
        """
        jenkinsapi 操作指定构建的Job 获取build信息
        :param job_name: job名称
        :param build_id: 构建id
        :return:
        """
        my_job = self.my_jenkins.get_job(job_name)
        # 当前job对象是否在队列/构建中
        print(my_job.is_queued_or_running())
        # 获取指定构建ID的对象
        build_object = my_job.get_build(build_id)
        # 获取构建对象的时间戳
        print(build_object.get_timestamp())
        # 获取控制台日志
        print(build_object.get_console())
        # 获取构建参数
        print(build_object.get_params())
        # 获取构建的状态
        print(build_object.get_status())
        # 获取构建的变更日志
        print(build_object.get_changeset_items())
        # 删除指定构建
        #my_job.delete_build(build_id)



if __name__ == '__main__':
    jk=JenkinsApiStudy()
    #print(jk.get_all_jobs())
    #print(jk.get_queue())
    #jk.get_job_info("python_interface_project")
    #jk.deal_job("build_no_params")
    jk.get_build_info("build_with_params",10)

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

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

相关文章

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题&#xff0c;就是它的模型训练数据&#xff0c;迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代&#xff0c;相隔两小时&#xff0c;消息都有可能滞后&#xff0c;更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

eLife:情绪学习对人脑记忆整合的回溯性促进机制

所谓“一朝被蛇咬&#xff0c;十年怕井绳”&#xff0c;带有强烈情绪色彩的事件不仅令人记忆深刻&#xff0c;还会影响与之相关的其他事件。我们的日常生活中充满了无数平凡琐碎的小事&#xff0c;这些事情并不会给我们留下深刻印象。但是&#xff0c;当一件微不足道的小事事后…

计算机网络中常见的数据传输方式(电路交换,报文交换,分组交换)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍计算机网络中常见的数据传输方式&#xff0c;如电路交换&#xff0c;报文交换&#xff0c;分组交换。 如果文章有什么需要改进的地方还请大佬不吝赐教&…

Spring DI简介及依赖注入方式和依赖注入类型

目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…

使用Dino+SAM+Stable diffusion 自动进行图片的修改

SAM 是Mata发布的“Segment Anything Model”可以准确识别和提取图像中的对象。 它可以分割任何的图片&#xff0c;但是如果需要分割特定的物体&#xff0c;则需要需要点、框的特定提示才能准确分割图像。 所以本文将介绍一种称为 Grounding Dino 的技术来自动生成 SAM 进行分割…

【微机原理】计算机中数的表示及运算

目录 一、数的类型 二.数值的相互转换 三.机器数的表示 四.机器数的运算--补码加减法 五.运算结果溢出的判断。 六.数据的编码 一、数的类型 1.十进制&#xff08;Decimal&#xff09; 基数为10&#xff0c;用0、1、2、3、4、5、6、7、8、9十个数码表示数值&#xff0c;采用逢1…

思考外语学习的底层逻辑(以英语、法语为例)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言一、英语1.学习历程2.英语学习的心得3.理论检验&#xff08;持续更新&#xff09; 二、法语1.学习历程2.读入数据 总结 前言 提示&#xff1a;这里谈谈自己为什么要…

IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。

IDEA中使用Git提交代码提示&#xff1a;您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。 问题背景&#xff1a; 在IDEA中&#xff0c;使用Git提交代码到远程仓库时&#xff0c;结果弹出一个警告窗口 问题原因&#xff1a; …

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传&#xff0c;大大达到了陶瓷业的“色型”要求。实现产品管理方便&#xff0c;起到立竿见影的效果&#xff0c;不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点&#xff0c;全线马上更新。采用B/S模式&#x…

Shell快速入门笔记

文章目录 Shell 快速入门笔记1、Shell概述2、Shell初体验4、注释5、变量6、数据类型6.1 字符串6.2 数组 7、参数传递8、运算符9、常用命令9.1 echo命令9.2 printf命令9.3 test命令 10、流程控制10.1 条件判断10.2 循环 11、函数12、输入/输出重定向12.0 前置知识12.1 输出重定向…

实验六~Web事件处理与过滤器

1. 创建一个名为exp06的Web项目&#xff0c;编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…

DDD系列:二、应用架构设计演变

作用: ​ 通过规定一个固定的架构设计&#xff0c;可以让团队内有一个统一的开发规范&#xff0c;降低沟通成本&#xff0c;提升效率和代码质量。 目标&#xff1a; ​ 在做架构设计时&#xff0c;一个好的架构应该需要实现以下几个目标&#xff1a; 独立于UI&#xff1a;前…

02-Vue技术栈之基础篇(下)

目录 1、class 与 style 绑定1.1 理解1.2 class 绑定1.3 style绑定1.4 代码示例 2、条件渲染2.1 v-if2.2 v-show2.3 注意事项2.4 代码示例 3、列表渲染3.1 基本列表3.2 key的原理3.2.1 虚拟DOM中key的作用&#xff1a;3.2.2 对比规则&#xff1a;3.2.3 用index作为key可能会引发…

防火墙GRE和NAT

要求&#xff1a; Pc2和pc3之间互通&#xff1b;做gre pc2与pc3访问公网pc1要做地址转换 基本配置&#xff1a;省略&#xff0c;小孩子都会 这里查看效果&#xff1a; 区域划分 fw1&#xff1a; fw2&#xff1a; 接口地址划分&#xff1a; fw1&#xff1a; fw2&#xff1a;…

武汉大学惯性导航课程合集【2021年秋】1.1惯性导航和惯性器件

重力外力加速度 机械阻尼换为电阻尼&#xff0c;带宽提高取决于控制器响应速度 右方是不平衡跷跷板&#xff0c;测量顶面电容 机械中测量角速度的旋转编码器&#xff0c;测速电机测量的两个看得见实际物体的转子定子相对角速度&#xff0c;但是陀螺是相对于惯性参考系&#xf…

【YOLO系列】YOLOv6论文超详细解读(翻译 +学习笔记)

前言 YOLOv6 是美团视觉智能部研发的一款目标检测框架&#xff0c;致力于工业应用。论文题目是《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》。 本框架同时专注于检测的精度和推理效率&#xff0c;在工业界常用的尺寸模型中&#xff…

如何让 Edge 浏览器更干净!

如果你也喜欢 Edge 或想要尝试迁移&#xff0c;本文介绍一些能够让 Edge 浏览器体验更加干净、纯粹的设置技巧。 洗白新标签页 Edge 的新标签页提供了多种页面设置方案&#xff0c;在没有安装第三方新标签页扩展的前提下&#xff0c;我们可以在默认新标签页右上角的齿轮设置中…

【MCS-51】时钟电路和复位

单片机的处理器内部具有众多模块&#xff0c;但是要想协调这些模块统一工作并不是一件易事。为了确保各部分能够统一有序工作&#xff0c;因为单片机已经是一个同步时序电路&#xff0c;所以要想让它内部能够有序工作&#xff0c;我们需要从外部输入一个时钟信号。 目录 &am…

MyBatis凭什么征服SpringBoot ?

1、MyBatis的优势 众所周知&#xff0c;MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。通过xml映射到接口&#xff0c;使开发者使用接口的方式就能够轻松的映射、解析、执行xml中的SQL。MyBatis 消除了几乎所有的JDBC代码和参数的手工设…