CICD 流程学习(五)Jenkins后端工程构建
案例1:数据库服务部署
MySQL部署
#安装MySQL服务
[root@Services ~]# yum clean all; yum repolist -v
...
Total packages: 8,265
[root@Services ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64
...
Complete!
[root@Services ~]# #启动MySQL服务
[root@Services ~]# systemctl enable mysqld #设置MySQL服务开机自启动
[root@Services ~]# systemctl start mysqld #启动MySQL服务
[root@Services ~]# ss -antpul | grep mysql #确认3306端口被监听
tcp LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=6875,fd=22))
tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=6875,fd=25))
[root@Services ~]# #初始化MySQL服务
[root@Services ~]# mysql
mysql> ALTER USER root@'localhost' IDENTIFIED BY 'Tarena'; #设置root用户密码
Query OK, 0 rows affected (0.00 sec)mysql> exit
Bye
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' -e "STATUS;"
mysql: [Warning] Using a password on the command line interface can be insecure.
--------------
mysql Ver 8.0.26 for Linux on x86_64 (Source distribution)Connection id: 9
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.26 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/lib/mysql/mysql.sock
Binary data as: Hexadecimal
Uptime: 2 min 0 secThreads: 2 Questions: 9 Slow queries: 0 Opens: 130 Flush tables: 3 Open tables: 46 Queries per second avg: 0.075
--------------[root@Services ~]# #创建HIS项目数据库
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena'
mysql> CREATE DATABASE his; #创建his库
Query OK, 1 row affected (0.00 sec)mysql> CREATE USER 'his'@'192.168.88.60' IDENTIFIED BY 'hisadmin'; #创建his用户
Query OK, 0 rows affected (0.01 sec)mysql> GRANT ALL ON his.* TO 'his'@'192.168.88.60'; #授权his用户
Query OK, 0 rows affected (0.00 sec)mysql> SHOW GRANTS FOR 'his'@'192.168.88.60'; #查看his用户权限
+----------------------------------------------------------+
| Grants for his@192.168.88.60 |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `his`@`192.168.88.60` |
| GRANT ALL PRIVILEGES ON `his`.* TO `his`@`192.168.88.60` |
+----------------------------------------------------------+
2 rows in set (0.00 sec)mysql> exit
Bye
[root@Services ~]# #导入HIS项目SQL
[root@Services ~]# ls his.sql
his.sql
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' his < his.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@Services ~]# mysql -hlocalhost -uroot -p'Tarena' -e "SHOW TABLES FROM his;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+
| Tables_in_his |
+----------------------------------+
| bms_bills_record |
| bms_invoice_exp |
| bms_invoice_record |
| bms_operator_settle_record |
| bms_settlement_cat |
| dms_case_history |
| dms_case_model |
| dms_case_model_catalog |
| dms_dise |
| dms_dise_catalog |
| dms_dosage |
| dms_drug |
| dms_drug_model |
| dms_drug_refund_item_record |
| dms_herbal_item_record |
| dms_herbal_model_item |
| dms_herbal_prescription_record |
| dms_medicine_item_record |
| dms_medicine_model_item |
| dms_medicine_prescription_record |
| dms_non_drug |
| dms_non_drug_item_record |
| dms_non_drug_model |
| dms_registration |
| pms_patient |
| sms_dept |
| sms_description |
| sms_frequent_used |
| sms_login_log |
| sms_permission |
| sms_registration_rank |
| sms_role |
| sms_role_permission_relation |
| sms_skd |
| sms_skd_rule |
| sms_skd_rule_item |
| sms_staff |
| sms_workload_record |
+----------------------------------+
[root@Services ~]#
Redis部署
#安装Redis服务
[root@Services ~]# yum -y install redis.x86_64 #配置Redis服务
[root@Services ~]# vim /etc/redis.conf
[root@Services ~]# sed -rn '69p;88p;507p' /etc/redis.conf
bind 0.0.0.0 #监听本地所有网络
protected-mode no #关闭保护模式
requirepass hisadmin #设置redis访问密码
[root@Services ~]# #启动Redis服务
[root@Services ~]# systemctl enable redis.service #设置Redis服务开机自启动
[root@Services ~]# systemctl start redis.service #启动Redis服务
[root@Services ~]# ss -antpul | grep redis #确认6379端口被监听
tcp LISTEN 0 128 0.0.0.0:6379 0.0.0.0:* users:(("redis-server",pid=7839,fd=6))
[root@Services ~]# #测试Redis服务
[root@Services ~]# redis-cli -h localhost -p 6379 -a hisadmin info
案例2:Jenkins全局工具配置
配置JDK环境


配置Git工具

配置Maven工具
#Jenkins主机安装Maven
[root@Jenkins ~]# ls apache-maven-3.6.3-bin.tar.gz
apache-maven-3.6.3-bin.tar.gz
[root@Jenkins ~]# tar -xf apache-maven-3.6.3-bin.tar.gz #解包
[root@Jenkins ~]# mv apache-maven-3.6.3 /usr/local/maven #移动到指定目录
[root@Jenkins ~]# ls /usr/local/maven/
bin boot conf lib LICENSE NOTICE README.txt
[root@Jenkins ~]# #配置Maven环境变量
[root@Jenkins ~]# vim /etc/bashrc #修改bash环境配置
[root@Jenkins ~]# tail -2 /etc/bashrc
export MAVEN_HOME="/usr/local/maven/" #声明MAVEN_HOME变量
export PATH=${MAVEN_HOME}/bin/:$PATH #将MAVEN命令加入PATH
[root@Jenkins ~]# source /etc/bashrc #刷新bash环境
[root@Jenkins ~]# echo ${MAVEN_HOME} #测试变量声明
/usr/local/maven/
[root@Jenkins ~]# mvn -v #测试mvn命令
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 11.0.15, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.15.0.9-2.el8_5.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix"
[root@Jenkins ~]# #部署Maven本地仓库
[root@Jenkins ~]# ls repository.tar.gz
repository.tar.gz
[root@Jenkins ~]# tar -xPpf repository.tar.gz -C / #解压Maven仓库
[root@Jenkins ~]# ls /var/lib/jenkins/.m2/
repository
[root@Jenkins ~]# ls /var/lib/jenkins/.m2/repository/
aopalliance classworlds commons-beanutils commons-io de joda-time net
backport-util-concurrent cn commons-codec commons-lang io junit org
ch com commons-collections commons-logging javax mysql
[root@Jenkins ~]#

配置邮件工具
#启动邮件服务
[root@Jenkins ~]# systemctl enable postfix.service
[root@Jenkins ~]# systemctl start postfix
[root@Jenkins ~]# ss -antpul | grep master
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=1203,fd=13))
tcp LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1203,fd=14))
[root@Jenkins ~]#


#确认邮件接收情况
[root@Jenkins ~]# yum -y install mailx #安装邮件客户端命令
Complete!
[root@Jenkins ~]# mail -u root #查看root用户邮件
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/mail/root": 1 message 1 new
>N 1 没有配置邮箱地址 Fri Feb 24 12:04 18/640 "Test email #4"
& 1
Message 1: #查看邮件内容
From nobody@nowhere Fri Feb 24 12:04:20 2023
Return-Path: <nobody@nowhere>
X-Original-To: root
Delivered-To: root@Jenkins.localdomain
Date: Fri, 24 Feb 2023 12:04:20 +0800 (CST)
From: 没有配置邮箱地址 <nobody@nowhere>
To: root@Jenkins.localdomain
Subject: Test email #4
Content-Type: text/plain; charset=UTF-8
Status: RThis is test email #4 sent from Jenkins& quit
Held 1 message in /var/mail/root
[root@Jenkins ~]#
案例3:Jenkins后端工程构建
Jenkins中创建HIS-BACKEND工程






#Maven打包参数:Maven执行打包操作时需要调用pom.xml文件,所以需要指定pom.xml文件位置
clean package -Dmaven.test.skip=true #清理旧文件、跳过测试直接打包
测试HIS-BACKEND工程构建



#Jenkins主机确认HIS-BACKEND构建情况
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/ #确认拉取HIS-BACKEND代码
HIS-BACKEND HIS-FONTEND
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/
HIS-api HIS-common HIS-demo HIS-mbg HIS-service pom.xml
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/
mvnw mvnw.cmd pom.xml src target
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/ #确认打包
classes generated-sources HIS-api-1.0-SNAPSHOT.jar HIS-api-1.0-SNAPSHOT.jar.original maven-archiver maven-status
[root@Jenkins ~]# #清理HIS-BACKEND本次构建
[root@Jenkins ~]# rm -rf /var/lib/jenkins/workspace/HIS-BACKEND/
[root@Jenkins ~]#
案例4:Jenkins后端自动发布
添加SSH服务器


HIS-BACKEND工程配置自动发布




Backend主机部署
- 部署OpenJDK环境
#安装OpenJDK-1.8
[root@Backend ~]# yum clean all; yum repolist -v
...
Total packages: 8,265
[root@Backend ~]# yum -y install java-1.8.0-openjdk-devel.x86_64 #安装jdk-1.8#配置JDK环境变量
[root@Backend ~]# ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el8_5.x86_64/ /usr/lib/jvm/jdk #制作软链接
[root@Backend ~]# vim /etc/bashrc #配置JAVA相关环境变量
[root@Backend ~]# tail -3 /etc/bashrc
export JAVA_HOME="/usr/lib/jvm/jdk/" #声明JAVA_HOME
export PATH=${JAVA_HOME}/bin/:$PATH #将JAVA_HOME加入PATH
export CLASSPATH=. #声明类库路径
[root@Backend ~]# source /etc/bashrc #刷新bash环境
[root@Backend ~]# echo ${JAVA_HOME} #测试变量声明
/usr/lib/jvm/jdk/
[root@Backend ~]# java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
[root@Backend ~]#
- 部署jar包运行配置文件
#HIS项目采用外置配置文件方式
[root@Backend ~]# mkdir /opt/his/
[root@Backend ~]# scp 192.168.88.10:/root/HIS/HIS-CONFIG/*.yml /opt/his/
application-prod.yml 100% 2690 912.9KB/s 00:00
application.yml 100% 257 374.1KB/s 00:00
[root@Backend ~]# ls /opt/his/
application-prod.yml application.yml
[root@Backend ~]#
HIS-BACKEND工程自动发布测试


#Jenkins主机确认HIS-BACKEND打包成功
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar
/var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar
[root@Jenkins ~]##Backend主机确认jar包发布情况
[root@Backend ~]# ls /opt/his/
application-prod.yml application.yml HIS-api-1.0-SNAPSHOT.jar
[root@Backend ~]# #手工运行jar包测试HIS后端程序
[root@Backend his]# java -jar HIS-api-1.0-SNAPSHOT.jar #前台进程
/opt/his/.. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.1.3.RELEASE)
...
2023-02-24 13:00:24.881 INFO 9629 --- [ main] com.neu.his.HisApiApplication : Started HisApiApplication in 13.82 seconds (JVM running for 14.352)#另开终端验证
[root@Backend ~]# ss -antpu | grep :8888 #确认8888端口被监听
tcp LISTEN 0 100 *:8888 *:* users:(("java",pid=9629,fd=63))
[root@Backend ~]# ss -antpu | grep java #访问测试
[root@Backend ~]# curl http://localhost:8888
<!DOCTYPE html>
<html lang="cn">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>HIS</h1>
</body>
</html>[root@Backend ~]# curl http://localhost:8888/actuator/health?pretty
{"status":"UP","details":{"rabbit":{"status":"UP","details":{"version":"3.11.5"}},"diskSpace":{"status":"UP","details":{"total":10725883904,"free":8431407104,"threshold":10485760}},"db":{"status":"UP","details":{"database":"MySQL","hello":1}},"elasticsearch":{"status":"UP","details":{"clusterName":"elasticsearch","numberOfNodes":1,"numberOfDataNodes":1,"activePrimaryShards":22,"activeShards":22,"relocatingShards":0,"initializingShards":0,"unassignedShards":20}},"elasticsearchRest":{"status":"UP","details":{"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":22,"active_shards":22,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":20,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":52.38095238095239}},"redis":{"status":"UP","details":{"version":"5.0.3"}}}}[root@Backend ~]#
案例5:HIS项目展示
配置Nginx前后端交互
#修改his.conf虚拟主机配置
[root@Fontend ~]# vim /etc/nginx/conf.d/his.conf
[root@Fontend ~]# cat /etc/nginx/conf.d/his.conf
server {listen 80 default_server;server_name __;access_log "/opt/his/log/$host.log";location / {root "/opt/his/web/";index index.html index.htm;}#配置api转发location /prod-api/ {proxy_pass http://192.168.88.60:8888/;}
}
[root@Fontend ~]# systemctl restart nginx.service #重启nginx服务
[root@Fontend ~]# ss -antpul | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=952,fd=6),("nginx",pid=951,fd=6),("nginx",pid=950,fd=6))
[root@Fontend ~]#
HIS效果展示
#确保HIS后端程序正常运行
[root@Fontend ~]# curl http://192.168.88.60:8888/
<!DOCTYPE html>
<html lang="cn">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>HIS</h1>
</body>
</html>
[root@Fontend ~]##浏览器访问HIS前端页面:http://192.168.88.70/

案例6:HIS项目全流程
清理Jenkins工作目录
#手工清理Jenkins工作目录
[root@Jenkins ~]# rm -rf /var/lib/jenkins/workspace/*
[root@Jenkins ~]#
前端全流程
#更新HIS-FONTEND工程1、构建前清理/opt/his/web/下原有代码2、构建后自动解压fontend.tar.gz压缩包3、删除fontend.tar.gz压缩包#构建前操作
rm -rf /opt/his/web/* #清理旧版本文件#构建后操作
cd /opt/his/web/ #切换到前端代码存放目录
tar -xf fontend.tar.gz #解压fontend.tar.gz压缩包
rm -rf fontend.tar.gz #清理fontend.tar.gz压缩包






后端全流程
#更新HIS-FONTEND工程1、构建前终止HIS后端jar进程2、清理/opt/his/目录下原有jar包3、发送jar后远程启动jar包#构建前操作
jps | grep jar | awk '{print $1}' | xargs kill #查找HIS后端jar包pid并杀死进程
rm -rf /opt/his/HIS-api-1.0-SNAPSHOT.jar #清理旧版本jar包#构建后操作
cd /opt/his/ #切换到jar包目录
nohup java -jar HIS-api-1.0-SNAPSHOT.jar > ./his.log 2>&1 & #后台启动jar包






CI/CD全流程测试
- 前端全流程测试
#查看现有首页内容,注意title内容为"东软云"
[root@Fontend ~]# vim /opt/his/web/index.html
[root@Fontend ~]# #Programer主机更新前端代码,title更新为"达内云"
[root@Programer HIS-FONTEND]# vim index.html #修改title内容
[root@Programer HIS-FONTEND]# [root@Programer HIS-FONTEND]# git add ./ #添加修改到暂存区
[root@Programer HIS-FONTEND]# git commit -m "modify index.html" #生成新版本
[master 33da040] modify index.html1 file changed, 1 insertion(+), 1 deletion(-)
[root@Programer HIS-FONTEND]# git tag v2 #打v2标签
[root@Programer HIS-FONTEND]# git push #推送分支到服务器
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (3/3), 345 字节 | 345.00 KiB/s, 完成.
总共 3(差异 1),复用 0(差异 0),包复用 0
To http://192.168.88.20/devops/HIS-FONTEND.git2c9f9bb..33da040 master -> master
[root@Programer HIS-FONTEND]# git push --tags #推送标签到服务器
总共 0(差异 0),复用 0(差异 0),包复用 0
To http://192.168.88.20/devops/HIS-FONTEND.git* [new tag] v2 -> v2
[root@Programer HIS-FONTEND]#





#Fontend主机验证构建结果
[root@Fontend ~]# ls /opt/his/web/ #确认fontend.tar.gz清理情况
favicon.ico index.html static
[root@Fontend ~]# vim /opt/his/web/index.html #查看页面内title内容是否为"达内云"
[root@Fontend ~]# #Jenkins主机确认自动清理工作目录
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/
[root@Jenkins ~]#
- 后端全流程测试
#此时HIS后端jar包应为之前的手工启动前台进程
[root@Fontend ~]# curl http://192.168.88.60:8888/
<!DOCTYPE html>
<html lang="cn">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>HIS</h1> #页面展示为HIS
</body>
</html>[root@Fontend ~]# #Programer主机更新HIS-BACKEND代码
[root@Programer ~]# cd HIS/HIS-BACKEND/
[root@Programer HIS-BACKEND]# vim HIS-api/src/main/resources/static/index.html
[root@Programer HIS-BACKEND]# cat HIS-api/src/main/resources/static/index.html
<!DOCTYPE html>
<html lang="cn">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>医疗信息系统</h1> #修改后端首页内容
</body>
</html>
[root@Programer HIS-BACKEND]# git add . #添加修改到暂存区
[root@Programer HIS-BACKEND]# git commit -m "modify index.html" #生成版本库
[master 8343263] modify index.html1 file changed, 2 insertions(+), 2 deletions(-)
[root@Programer HIS-BACKEND]# git tag v2 #打v2标签
[root@Programer HIS-BACKEND]# git push --all #推送所有分支到服务器
枚举对象中: 15, 完成.
对象计数中: 100% (15/15), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (6/6), 完成.
写入对象中: 100% (8/8), 607 字节 | 607.00 KiB/s, 完成.
总共 8(差异 4),复用 0(差异 0),包复用 0
To http://192.168.88.20/devops/HIS-BACKEND.gitf582569..8343263 master -> master
[root@Programer HIS-BACKEND]# git push --tags #推送所有标签到服务器
总共 0(差异 0),复用 0(差异 0),包复用 0
To http://192.168.88.20/devops/HIS-BACKEND.git* [new tag] v2 -> v2
[root@Programer HIS-BACKEND]#



#确认结果
2023-02-24 15:29:58.229 INFO 9629 --- [ Thread-5] AnnotationNacosInjectedBeanPostProcessor : class com.alibaba.nacos.spring.beans.factory.annotation.AnnotationNacosInjectedBeanPostProcessor was destroying!
[root@Backend his]# #手工运行jar包的前台进程退出#确认jar包后台运行
[root@Backend his]# ss -antpu | grep :8888
tcp LISTEN 0 100 *:8888 *:* users:(("java",pid=9934,fd=63))
[root@Backend his]# #测试访问后台首页
[root@Backend his]# curl http://localhost:8888/
<!DOCTYPE html>
<html lang="cn">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>医疗信息系统</h1>
</body>
</html>
[root@Backend his]#

相关文章:
CICD 流程学习(五)Jenkins后端工程构建
案例1:数据库服务部署 MySQL部署 #安装MySQL服务 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 ... Complete! [rootServices ~]# #启动…...
NSS [SWPUCTF 2021 新生赛]sql
NSS [SWPUCTF 2021 新生赛]sql 很明显是sql,有waf。 参数是wllm get型传参,有回显,单引号闭合,回显位3 跑个fuzz看看waf 过滤了空格 and 报错注入 空格->%09 ->like and->&&爆库:test_db -1%27uni…...
【Python机器学习】零基础掌握RandomTreesEmbedding集成学习
如何在高维数据中找到隐藏的结构? 面临大量复杂、高维的数据,例如社交网络分析、电子商务推荐系统或医疗诊断,如何有效地分析和解读这些数据成为一大挑战。一个有效的方法是使用嵌入技术将高维数据转化为低维形式,同时保留其内在结构。这次将介绍一种称为“随机树嵌入”(…...
【C++基础入门】42.C++中同名覆盖引发的问题
一、父子间的赋值兼容 子类对象可以当作父类对象使用(兼容性) 子类对象可以直接赋值给父类对象子类对象可以直接赋值给父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 下面看一个子类对象兼容性的代码: #include <iostream>…...
【C++学习笔记】类和对象(上)
目录 1. 面向对象和面向过程的初步认识 2. 类的引入 3. 类的定义 3.1 类的两种定义方式 3.1.1声明和定义全部放在类体中 3.1.2.类声明放在.h文件中,成员函数定义放在.cpp文件中 4. 类的访问限定符及封装 4.1 访问限定符 4.2 面试题:C中struct…...
TinySnippet轻UI组件开发系列教程 — DataGrid选择事件
应用场景 DataGrid选择一条记录后,希望能够 调用纳流或者打开指定的页面 或者当鼠标悬停在一行时弱出一个指定的页面在右下角(移开就关闭弹出页) 这些都是我们能够实现的 实现过程 本文以调用纳流为例 下载UI组件 TinySnippet-v4.1.2导…...
热搜榜:最热门的话题文本排行榜API接口
近年来,随着社交媒体的兴起,热门话题的数量和更新速度都在不断增加,因此热门话题排行榜的需求也越来越大。在这篇文章中,我们将探讨如何使用#热搜榜# API接口获取最热门的话题文本排行榜,并给出相关代码示例。 一、API…...
vue中替换全局字体
一、背景 产品说项目要拿去展会展示,但现在项目字体是微软雅黑,不支持商用,需要全局替换思源字体。 二、下载字体 推荐一个网址,好用 字体天下,点击跳转 下载好的文件如下: 三、引入字体 1、在项目…...
【AGC】.p12证书文件如何获取MD5
近期在使用DevEco Studio3.1打包应用时遇到了一个问题,我使用Build—Generate Key and CSR创建了密钥库文件。 我这里需要获取到创建的.p12证书文件的MD5值,于是在控制台使用了keytool -list -v -keystore D:\myapp.p12命令获取证书指纹,但是…...
vue2 quill 视频上传 ,基于ruoyi vue,oss
包含两种上传方式,第一种点开弹新页面可选url和点击上传。本文中是第二种,自己拼的。像点击上传图片一样,直接传video文件,原创不易,纯纯踩坑; 因为现阶段能搜索到的内容,99.5%都是一样的内容&…...
YOLOv8改进实战 | 更换损失函数之MPDIOU(2023最新IOU)篇
前言 YOLOv8官方默认损失函数采用的是CIoU。本章节主要介绍如何将MPDIoU损失函数应用于目标检测YOLOv8模型。 目录 一、MPDIoU二、代码实现添加损失函数更换损失函数一、MPDIoU 论文链接:MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression MPDIoU是一种基于…...
图的应用1.0-----最小生成树问题
目录 前言 生成树 1.基本概念 2.生成树的特点 3.生成树形成过程 最小生成树(Minimum Spanning Tree) 1.基本概念 2.构造方法(MST) 普里姆(Prime)算法 1.算法思想 2.代码实现 克鲁斯卡尔(Kruskal)算法 1.算法思想 2.代码…...
【计算机网络笔记】网络应用对传输服务的需求
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
IDEA启动报错:Command line is too long的解决办法
文章目录 1.报错现象2.解决办法验证3.最佳实践4.问题原因5.参考文献1.报错现象 在idea中启动一个spring cloud项目时,编译完成后直接报错,报错内容如下: Error running XXXApplication:Command line is too long. Shorten command line for XXXApplication or also for Sp…...
Android 中的 本地广播LocalBroadcastManager
Android 中的 本地广播LocalBroadcastManager 文章目录 Android 中的 本地广播LocalBroadcastManager一、LocalBroadcastManager 的基本作用二 、LocalBroadcastManager 的基本使用1、包的导入(1)Android 源码中bp文件的导入:(2&a…...
题目 1120: C语言训练-“水仙花数“问题2python详解)——练气三层后期
✨博主:命运之光 🦄专栏:算法修炼之练气篇(C\C版) 🍓专栏:算法修炼之筑基篇(C\C版) 🍒专栏:算法修炼之练气篇(Python版) ✨…...
sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第二周测验
课程3_第2周_测验题 目录:目录 要解决的问题 ① 为了帮助你练习机器学习的策略,本周我们将介绍另一个场景,并询问你将如何行动。 ② 我们认为这个在机器学习项目中工作的“模拟器”将给出一个任务,即领导一个机器学习项目可能…...
基于Pytorch的驾驶员分心行为实时检测
本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…...
【uniapp】小程序开发7:自定义组件、自动注册组件
一、自定义轮播图组件、自动注册 以首页轮播图组件为例。 1、创建组件文件src/components/my-swipper.vue 代码如下: <template><view><view class"uni-margin-wrap"><swiper class"swiper" circular :indicator-dots…...
Modbus转MQTT以太网网关MQT-802主要特点和典型应用
随着社会的快速发展,物联网已经潜移默化地深入工控行业的各个领域,其高效的资源整合和强大的数据采集能力,深受客户的喜爱。上海泗博为实现客户在云端平台接收处理世界万物的信息以及实现远程控制,精心打造一款全新物联网产品&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
