jenkins插件集成api使用

news2024/10/7 11:20:57

jenkins配置插件&api使用

jenkins

https://mirrors.jenkins.io/war-stable/2.222.1/ 包下载地址

jenkins镜像源修改

sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g'  default.json
sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g'  default.json

http://mirror.xmission.com/jenkins/plugins/

java

https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html java下载

tar xf jdk-8u144-linux-x64.tar.gz
mv jdk-8u144-linux-x64 /usr/local/jdk
vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk     #建议使用自带的java,不然会出现版本兼容各种问题
export PATH=${JAVA_HOME}/bin:$PATH

启动jenkins

nohup java -Dhudson.model.DownloadService.noSignatureChecke=true \
-DJENKINS_HOME=/app/jenkins -jar /app/jenkins/jenkins.war &

maven

https://maven.apache.org/download.cgi

https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz

[root@vm ~]# tar zxf apache-maven-3.9.0-bin.tar.gz -C /usr/local/
[root@vm ~]# vim /etc/profile
...
export MAVEN_HOME=/usr/local/apache-maven-3.6.0
export PATH=$PATH:$MAVEN_HOME/bin
[root@vm ~]# source /etc/profile
[root@vm ~]# mvn -v
Apache Maven 3.9.0 

maven clean 清理构建目录
maven clean package 打包
maven clean install 打包部署
maven clean test 单元测试

系统设置->全局工具配置->Maven->Maven 安装
在这里插入图片描述

创建一条pipeline任务

pipeline {
    agent any
    
    tools { 		maven 'maven'    // maven 与全局配置里的名字保持一致  
    }
    
    stages {
    	stage('Example'){
            steps {
                echo 'Hello World'
                script {
                    mavenHome = tool 'maven'    //  工具名
                    println(mavenHome)
                    sh "${mavenHome}/bin/mvn -v"
                }
            }
        }
    }      
}
mvn clean install -DskipTests
mvn clean package 

ant

https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.10-bin.tar.gz

[root@vm ~]# tar zxf apache-ant-1.10.10-bin.tar.gz -C /usr/local/
[root@vm ~]# vim /etc/profile
...
export ANT_HOME=/usr/local/apache-ant-1.10.10
export PATH=$PATH:$MAVEN_HOME/bin:$ANT_HOME/bin
source /etc/profile
[root@vm ~]# source /etc/profile
pipeline {
    agent any
    
    tools { 		ant 'ANT'    // ANT 与全局配置里的名字保持一致  
    }
    
    stages {
    	stage('Example'){
            steps {
                script {
                    antHome = tool 'ANT'    //  工具名
                    sh "${antHome}/bin/ant -version"
                }
            }
        }
    }      
}

gradle

https://downloads.gradle-dn.com/distributions/gradle-7.0-bin.zip

[root@vm ~]# unzip gradle-7.0-bin.zip  -d /usr/local/
[root@vm ~]# vim /etc/profile
...
export GRADLE_HOME=/usr/local/gradle-7.0
export PATH=$PATH:$GRADLE_HOME/bin
source /etc/profile
[root@vm ~]# source /etc/profile

Gradle常用命令

gradlew -v 	#版本号,首次运行,没有gradle的要下载的哦。
gradlew clean 	#删除HelloWord/app目录下的build文件夹
gradlew build 	#检查依赖并编译打包
gradlew assembleDebug 	#编译并打Debug包
gradlew assembleRelease 	#编译并打Release的包
gradlew installRelease Release	#模式打包并安装
gradlew uninstallRelease 	#卸载Release模式包

node

https://nodejs.org/download/release/v14.10.1/node-v14.10.1-linux-x64.tar.xz

[root@vm ~]# tar xf node-v14.10.1-linux-x64.tar.xz -C /usr/local/
[root@vm ~]# vim /etc/profile
...
export NODE_HOME=node-v14.10.1-linux-x64
export PATH=$PATH:$NODE_HOME/bin
[root@vm ~]# source /etc/profile
node {
    stage ("npmbuild"){
        sh """
           export npmHome=/usr/local/node-v14.10.1-linux-x64
           export PATH=\$PATH:\$npmHome/bin
           npm -v
           """
    }    
}	
tools 固定命名,Valid tool types: [ant, hudson.tasks.Ant$AntInstallation, git, hudson.plugins.git.GitTool, gradle, hudson.plugins.gradle.GradleInstallation, jdk, hudson.model.JDK, jgit, org.jenkinsci.plugins.gitclient.JGitTool, jgitapache, org.jenkinsci.plugins.gitclient.JGitApacheTool, maven, hudson.tasks.Maven$MavenInstallation]    }

try-catch异常抛出

// 不做抛出的话,流水线报错是执行失败的状态, 加上try,部分步骤没执行,但流水线是绿色OK的
pipeline {
    agent any
    
    tools { 		jdk 'jdk17'    // maven 与全局配置里的名字保持一致  
    }
    
    stages {
    	stage('Example'){
            steps {
                echo 'Hello World'
                script {
                    try {
                        mavenHome = tool 'jdk17'    //  工具名
                        println(mavenHome)
                        sh "${mavenHome}/bin/mvn -v"
                    } catch(e){
                        println(e)
                    }
                }
            }
        }
    }      
}

分支标签参数选择

pipeline {
    agent any
    
    tools { 		jdk 'jdk17'    // maven 与全局配置里的名字保持一致  
    }

    parameters {
        gitParameter name: 'branch', 
                     type: 'PT_BRANCH_TAG',
                     branchFilter: 'origin/(.*)',
                     defaultValue: 'master',
                     selectedValue: 'DEFAULT',
                     sortMode: 'DESCENDING_SMART',
                     description: 'Select your branch or tag.'           
    }

    stages {
    	stage('checkout') {
            steps {
                  git branch: "${params.branch}", url: "https://gitee.com/wg_pub_test/pub_test.git"
                  sh "cat jenkinsfile"
            }
        }
    }      
}

选项参数

pipeline {
    agent any

    parameters {
        choice(
          name: 'branch',
          choices: ['develop', 'feature'],
          description: '选择分支'
        )
    }

    stages {
    	stage('checkout') {
            steps {
                  sh "echo ${params.branch}"
            }
        }
    }      
}

saltstack

https://mirrors.tuna.tsinghua.edu.cn/saltstack/#rhel
yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest.el8.noarch.rpm
String deployHosts = "host1,host02"
pipeline{
    agent any
    
    stages{
        
        stage("Deploy"){
            steps{
                script{
                    hosts = deployHosts.split(",").toList()
                    for(host in hosts){
                        //sh "salt ${host}cmd.run ls"
                        println(host)
                    }
                }
            }
        }
    }
}

ansible

yum install epel-release ansbile

LDAP认证集成

phpldapadmin、openldap  两个容器服务 
LDAP 插件

Jenkins API

http://192.168.1.11:8080/api/
Python API
Web REST API
jenkins Core API

Python API

库名称:python-jenkins
仓库Pypi : https://pypi.org/project/python-jenkins/
在线文档: http://python-jenkins.readthedocs.org/en/latest/

jenkinsapi库也能使用,暂未研究
Create newjobs 创建新项目
Copy existingjobs 复制已存在的项目
Delete jobs 删除项目
Update jobs 更新项目
Get a job's build information 获取一个项目的构建信息
Get Jenkins master version information 获取Jenkins master的版本信息
Get Jenkins plugin information 过去jenkins插件信息
Start a build on ajob 构建一个项目Create nodes 创建一个节点
Create nodes 创建一个节点
Enable/Disable nodes 启用/禁用节点
Getinformation on nodes 获取节点信
息Create/delete/reconfig views 创建/删除/更新视图
Put server in shutdown mode (quiet down)关机
List running builds 列出构建中的项目
Delete builds 删除构建
Wipeout job workspaceCreate/delete/update folders 创建/删除/更新文件夹
Set the next build number 设置下次构建ID
Install plugins 安装插件
# pip install python-jenkins==1.6.0

import jenkins
server=jenkins.Jenkins("http://192.168.1.11:8080",username="admin" ,password="123456")
import jenkins

server = jenkins.Jenkins("http://192.168.1.11:8080", username="admin", password="123456")

print(server.get_whoami())
print(dir(server))   #查看 所有的⽅法

do操作方法
在这里插入图片描述

get获取方法

在这里插入图片描述

其他方法

在这里插入图片描述

每个接口的使用方法:https://python-jenkins.readthedocs.io/en/latest/api.html

import jenkins

server = jenkins.Jenkins("http://192.168.1.11:8080", username="admin", password="123456")

print(server.job_exists("newpipe"))		# 判断job存在
server.copy_job("pipe","newpipe")  # 复制一个项目
server.create_job(name, config_xml)	# 需要准备xml文件
print(server.get_job_config('pipe'))	# 打印匹配的config_xml
<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@1326.ve643e00e9220">
  <actions>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@2.2150.v4cfd8916915c"/>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction plugin="pipeline-model-definition@2.2150.v4cfd8916915c">
      <jobProperties/>
      <triggers/>
      <parameters/>
      <options/>
    </org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction>
  </actions>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <jenkins.model.BuildDiscarderProperty>
      <strategy class="hudson.tasks.LogRotator">
        <daysToKeep>3</daysToKeep>
        <numToKeep>5</numToKeep>
        <artifactDaysToKeep>-1</artifactDaysToKeep>
        <artifactNumToKeep>-1</artifactNumToKeep>
      </strategy>
    </jenkins.model.BuildDiscarderProperty>
  </properties>
  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@3837.v305192405b_c0">
    <script>String deployHosts = &quot;host1,host02&quot;
pipeline{
    agent any
    
    stages{
        
        stage(&quot;Deploy&quot;){
            steps{
                script{
                    hosts = deployHosts.split(&quot;,&quot;).toList()
                    for(host in hosts){
                        //sh &quot;salt ${host}cmd.run ls&quot;
                        println(host)
                    }
                }
            }
        }
    }
}</script>
    <sandbox>true</sandbox>
  </definition>
  <triggers/>
  <disabled>false</disabled>
</flow-definition>

修改config_xml文件,创建新的任务

import jenkins
# import re  #配合正则做配置更新
serverUrl="http://192.168.1.11:8080"
username = "admin"
password ="123456"
server = jenkins.Jenkins(serverUrl,username ,password)
defProjectName ="pipe"
newProjectName ="my_new_pipe"

if server.job_exists(newProjectName)!= True :
    print("项目不存在开始新建项目")
    config_xml=server.get_job_config(defProjectName)	# 获取config_xml
    newconfig_xml = config_xml.replace("println(host)","println(host)\nprintln(\"hello\")")
    print(newconfig_xml)
    server.create_job(newProjectName,newconfig_xml)
else:
    print("项目已存在!")

更新配置

import jenkins

serverUrl = "http://192.168.1.11:8080"
username = "admin"
password = "123456"
server = jenkins.Jenkins(serverUrl, username, password)
defProjectName = "pipe"
newProjectName = "free_style"

if server.job_exists(newProjectName) != True:
    print("项目不存在开始新建项目")
    config_xml = server.get_job_config(defProjectName)
    newconfig_xml = config_xml.replace("println(host)", "println(host)\nprintln(\"hello\")")
    server.create_job(newProjectName, newconfig_xml)
else:
    config_xml = server.get_job_config(defProjectName)
    new_config_xml = config_xml.replace("$J_branch", "$H_branch")   # 分支参数$J_branch 改成$H_branch
    server.upsert_job("free_style", new_config_xml)
    server.build_job("free_style",parameters=None,token=None)  #job命名不要用中文

批量创建job

import jenkins

serverUrl = "http://192.168.1.11:8080"
username = "admin"
password = "123456"
server = jenkins.Jenkins(serverUrl, username, password)
defProjectName = "temp_back"  # temp_web    需要先创建好,使用xml文件
job_list = ["free_job2", "free_job3", "free_job4", "free_job5","free_job6"]

for ProjectName in job_list:
    newProjectName = ProjectName + "_back"    # 前端可以 + "_web"
    if server.job_exists(newProjectName) != True:
        print(newProjectName + "项目不存在,开始新建项目")
        config_xml = server.get_job_config(defProjectName)

        newconfig_xml = config_xml.replace("appname", newProjectName)  # 替换部分关键信息,如代码仓名

        server.create_job(newProjectName, newconfig_xml)
        print(newProjectName + "已创建")
    else:
        print(newProjectName + "已存在")

Web REST API

API首页:http://127.0.0.1:8080/api/
http://192.168.1.11:8080/job/my_new_pipe/api/json
# get
获取项目信息
    接口:http://127.0.0.1:8080/job/{projectName}/api/json

获取项目构建信息
    接口:http://127.0.0.1:8080/job/{projectName}/{buildNumber}/api/json
    
获取项目配置
    接口:http://127.0.0.1:8080/job/{projectName}/config.xml
# post
创建项目
	接口: http://127.0.0.1:8080/createltem?name={projectName)
	参数: --data-binary @config.xml 头部: -H "Content-Type:text/xml"

禁用项目
	接口:http://127.0.0.1:8080/job/{projectName}/disable

启用项目
	接口:http://127.0.0.1:8080/job/{projectName}/enable

删除项目
	接口:http://127.0.0.1:8080/job/{projectName}/delete

构建项目
	接口:http://127.0.0.1:8080/job/{projectName}/build
。 方式:POST
参数化构建
	接口:http://127.0.0.1:8080/job/{projectName}/buildWithParameters

[root@vm ~]# ls config.xml
[root@vm ~]# curl -X POST -u admin:123456 http://127.0.0.1:8080/createltem?name={projectName)  --data-binary @config.xml -H "Content-Type:text/xml"

如果没有做认证集成:用户名+密码 如果做了集成:用户名+token

pipeline{
    agent any

    stages{
        stage("test"){
            steps{
                script{
                    httpRequest authentication: 'pipeline',
                    httpMode: 'POST',
                    responseHandle: 'NONE',
                    url: 'http://192.168.1.11:8080/job/newpipe/disable'
                }
            }
        }
    }
}

jenkins Core API

需java基础

jira创建需求(也可关联版本) --> jenkins 插件创建分支–> 触发 gitlab 创建分支 gitlab提交代码触发 jenkins 构建

Jira(需求)+ GitLab(代码)+Jenkins(CI)+Spinnaker(CD一套微服务架构)

插件了解

Jenkins自带推荐插件:Git,Folders,BuildTimeout,Credentials Binding,Timestamper,Workspace Cleanup,Ant,Gradle,Pipeline,GitHub Branch Source等等

Git parameter git参数插件

Role-Based Strategy 角色管理

Generic Webhook Trigger 触发构建

gitlab plugin 触发构建

ssh Publisher 上传执行shell

saltstack plugin 批量自动化发布

log-parser-plugin 增加过滤条件显示日志

生成Jenkinfile方法(项目->Pipeline Syntax->片段生成器)选择salt: Send a message to Salt API补充信息

rancher插件 更新镜像

Nexus Artifact Uploader上传制品

Maven Artifact ChoiceListProvider (Nexus) 选择构建包

jenkins发版

前端打包

yarn install  && npm run build:uat  
#方法一
rsync -az --delete  dist/  /app/nginx/static/test/

#方法二
cp -rf dist/*   test/ && zip -r static.zip test/*
unzip -od /app/nginx/static static.zip

方法三
zip -r $BUILD_TAG.zip dist/*
mv *.zip /app/
ansible -i /root/ansible/hostip proxy -m copy -a \
'src=/app/$BUILD_TAG-admin.zip dest=/usr/share/nginx/html/'
ansible -i /root/ansible/hostip proxy -m shell -a \
'unzip -o /usr/share/nginx/html/$BUILD_TAG-admin.zip -d /usr/share/nginx/html/"

后端打包

mvn -T 8 clean install -Dmaven.test.skip=true
mvn clean package -s ./settings.xml -Dmaven.test.skip=true

打镜像

FROM openjdk:17.0.2
ADD ./api-0.0.1-SNAPSHOT.jar /app.jar
ENV JAVA_OPTS "-Xms3072m -Xmx3072m -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:HeapDumpPath=/logs/dump/front/document_service.dump"
ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar


tag=`date -d today +"%Y%m%d%H%M"
docker build -t kw.com:80/app/admin:$tag .
docker push kw.com:80/app/admin:$tag
docker rmi kw.com:80/app/admin:$tag
#打通k8s
export KUBECONFIG=$HOME/.kube/config:$HOME/kube/config_perf
kubectl config use-context dev
kubectl set image deployment/admin  container-1=kw.com:80/app/admin:$tag

jar包运行

tag=`date -d today +"%Y%m%d%H%M"
mv ./target/admin.jar /app/admin-$tag.jar
ansible dev -m copy -a "src=/app/admin-$tag.jar dest=/app/dev/"
ansible dev -m shell -a "sed -i 's/admin-[0-9]*.jar/admin-$tag.jar/g' \
/etc/supervisor/conf.d/admin.conf"
ansible dev -m shell -a "supervisorctl update && supervisorctl restart admin"
ansible dev -m shell -a "bash /etc/supervisor/conf.bak/rm.sh"
rm /app/admin-$tag.jar

supervisor服务

cat admin.conf
[program:admin]
command=bash -c "/usr/bin/java -jar -Dhwenvironment=uat /app/dev/admin-282204291446.jar"
redirect stderr= true
autorestart=true
startretries=999
stopwaitsecs=300
stdout_logfile=//app/dev/log/admin-stdout-supervisor.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=20

jar包清理脚本

cat rm.sh
for i in  cheat common home admin
do
num=`ls /app/dev/.jar|grep $i |wc -l`
jar=`ls -lrt /app/dev/*.jar |grep $i|awk '{print $NF}' |head -1`
if [ $num -gt 5 ]
	then
	rm -f $jar & echo "delete $jar"
fi
done

“supervisorctl update && supervisorctl restart admin”
ansible dev -m shell -a “bash /etc/supervisor/conf.bak/rm.sh”
rm /app/admin-$tag.jar


supervisor服务

```sh
cat admin.conf
[program:admin]
command=bash -c "/usr/bin/java -jar -Dhwenvironment=uat /app/dev/admin-282204291446.jar"
redirect stderr= true
autorestart=true
startretries=999
stopwaitsecs=300
stdout_logfile=//app/dev/log/admin-stdout-supervisor.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=20

jar包清理脚本

cat rm.sh
for i in  cheat common home admin
do
num=`ls /app/dev/.jar|grep $i |wc -l`
jar=`ls -lrt /app/dev/*.jar |grep $i|awk '{print $NF}' |head -1`
if [ $num -gt 5 ]
	then
	rm -f $jar & echo "delete $jar"
fi
done

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

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

相关文章

使用YOLOv8训练自己的【目标检测】数据集

文章目录 1.收集数据集1.1 使用开源已标记数据集1.2 爬取网络图像1.3 自己拍摄数据集1.4 使用数据增强生成数据集1.5 使用算法合成图像 2.标注数据集2.1确认标注格式2.2 开始标注 3.划分数据集4.配置训练环境4.1获取代码4.2安装环境 5.训练模型5.1新建一个数据集yaml文件5.2预测…

ASP.NET Core 模型绑定

&#x1f340;介绍 在C#中&#xff0c;特别是在ASP.NET Core中&#xff0c;模型绑定是一个将HTTP请求中的数据映射到C#对象的过程。它使得开发者能够方便地从请求中提取数据&#xff0c;而无需手动解析请求体、查询字符串、路由数据等。ASP.NET Core提供了多种特性&#xff08…

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起&#xff1a;西方民主制度的金融起源 你好&#xff0c;今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变&#xff0c;即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…

如何保护大模型API安全

大模型的崛起正在改变着我们对机器学习和人工智能的理解&#xff0c;它们不仅提供了令人惊叹的预测和分析能力&#xff0c;还在各行各业的应用中发挥着重要作用。通过提供 API&#xff0c;用户无需了解底层实现细节&#xff0c;使大型模型能够更好地与用户和应用程序进行交互&a…

深度学习相关知识

一.环境配置 1.cuda/cudnn安装&#xff1a; 安装cuda之前首先安装vs&#xff0c;vs版本从低到高安装。 a) 安装cuda&#xff1a;首先查看显卡支持的最高CUDA的版本&#xff0c;以便下载对应的CUDA安装包&#xff1b; cmd命令行&#xff1a;nvidia-smi,显示如下&#xff1a;…

【GPT-4 Turbo】、功能融合:OpenAI 首个开发者大会回顾

GPT-4 Turbo、功能融合&#xff1a;OpenAI 首个开发者大会回顾 就在昨天 2023 年 11 月 6 日&#xff0c;OpenAI 举行了首个开发者大会 DevDay&#xff0c;即使作为目前大语言模型行业的领军者&#xff0c;OpenAI 卷起来可一点都不比同行差。 OpenAI 在大会上不仅公布了新的 …

基于单片机多模式多样式跑马灯系统仿真设计

**单片机设计介绍&#xff0c;基于单片机多模式多样式跑马灯系统仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机多模式多样式跑马灯系统仿真设计是一个集硬件仿真、软件编程和灯光控制于一体的综合性项目。以下是对该设…

Quantinuum与微软携手突破:开创容错量子计算新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容&#xff1a;SystemC入门书中的简单测试平台编写示例。 模块文件编写 带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。 sync_mux41.h文件 #include <systemc.h>SC_MODULE(sync_mux41) {sc_in<bool> clock, reset;sc_in<sc_uint<…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

C#操作MySQL从入门到精通(5)——查询数据

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,本文详细介绍了查询数据的各种操作,包括查询一列数据、 查询两列数据、查询所有列数据、查询不重复的数据、查询指定行数据,绝对是C#操作MySql数据库史上最详细教程,能够帮助小白快速入门以及将这些功能迅速…

闪站侠洗护管理系统,洗衣洗鞋小程序软件定制,干洗连锁店软件系统搭建;

闪站侠洗护管理系统&#xff0c;洗衣洗鞋小程序软件定制&#xff0c;干洗连锁店软件系统搭建&#xff1b; 为了让每一个洗衣洗鞋工厂与门店的连接更加高效便捷&#xff0c;送洗流程更加简单轻松&#xff0c;拽牛科技倾心打造洗衣洗鞋管理软件。我们的目标是通过高效和优质的服务…

栈的详解和例题(力扣有效括号)

感谢各位大佬的光临&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 前言一.什么是栈二.栈的实现三.例题&#xff…

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大&#xff0c;总共需要将131个视频下载下来&#xff0c;所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的&#xff0c;所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

excel统计分析——多项式回归

参考资料&#xff1a;生物统计学 多项式回归属于单变量曲线回归&#xff0c;但其形式和求解方法与多元线性回归相似。多项式回归的数学模型为&#xff1a; 令&#xff0c;&#xff0c;&#xff0c;&#xff0c;则 由于X不可逆&#xff0c;两边同时乘以X得&#xff0c;&#xff…

《QT实用小工具·十五》多种样式的开关控件

1、概述 源码放在文章末尾 目前实现了三种样式的开关控件按钮&#xff0c;如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef IMAGESWITCH_H #define IMAGESWITCH_H/*** 图片开关控件 * 1. 自带三种开关按钮样式。* 2. 可自定义开关图片。*/#include <QWid…

使用Android完成案例教学

目录 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞机和黄飞机移动的开发。&#xff08;全代码解析&#xff09; 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞…

利用native的方式实现跨线程调用

简介 在OpenHarmony应用开发实践中&#xff0c;经常会遇到一些耗时的任务&#xff0c;如I/O操作、域名解析以及复杂计算等。这些任务如果直接在主线程中执行&#xff0c;将会严重阻塞主线程&#xff0c;影响后续任务的正常流程&#xff0c;进而导致用户界面响应延迟甚至卡顿。…

基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT1、研究背景2、提出方法3、模块详细3.1、什么是HoT3.2、HoT 框架3.3、Token 剪…

JS 利用 webcam访问摄像头 上传到服务器

webcam JS 较为详细的指南 定义标题 <!doctype html> <html> <head><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>How to capture picture from webcam with Webcam.js</title></…