企业级虚拟化数据库基础平台自动化部署项目
一、项目简介及准备工作
1.1.虚拟化平台简介
1.1.1.ESXi 8 是什么?
-
定义:
ESXi 8 是 VMware 推出的最新版本 裸机虚拟化管理程序(Hypervisor),属于 VMware vSphere 产品线的核心组件。 -
核心功能:
-
在物理服务器上创建和管理虚拟机(VM)。
-
提供硬件资源的抽象化、池化和动态分配。
-
-
定位:
企业级虚拟化基础设施的基石,适用于数据中心、云计算和虚拟化环境。
1.1.2.ESXi 8 的核心特性
-
性能优化:
-
支持最新硬件(如 Intel Sapphire Rapids 和 AMD EPYC Genoa)。
-
提升虚拟机密度(单主机支持更多 VM)。
-
-
安全性增强:
-
集成 TPM 2.0 和 Secure Boot,支持虚拟机加密。
-
提供基于硬件的安全隔离(如 Intel CET)。
-
-
管理简化:
-
增强的 vSphere Client 界面,支持自动化运维。
-
集成 Kubernetes(通过 Tanzu),支持容器化工作负载。
-
-
存储与网络优化:
-
支持 NVMe over TCP 和 RDMA,提升存储性能。
-
增强网络功能(如 NSX-T 集成)。
-
1.1.3.为什么选择 ESXi 8 构建数据库基础平台?
1. 资源利用率最大化
-
动态资源分配:
根据数据库负载动态调整 CPU、内存和存储资源,避免资源浪费。 -
高密度部署:
单台物理服务器可运行多个数据库实例,降低硬件成本。
2. 高可用性与容灾
-
vSphere HA:
自动检测物理服务器故障,并在其他主机上重启受影响的数据库 VM。 -
vMotion:
支持数据库 VM 的在线迁移,实现零停机维护。 -
备份与恢复:
集成 VMware Data Protection,提供数据库一致性快照。
3. 性能优化
-
NUMA 感知:
优化数据库工作负载的内存访问性能。 -
SR-IOV 支持:
提升网络和存储 I/O 性能,适合 OLTP 和高并发场景。
4. 安全性与合规性
-
虚拟机加密:
保护敏感数据(如客户信息、交易记录)。 -
审计与监控:
集成 vRealize Suite,提供全面的日志和合规性报告。
5. 灵活性与可扩展性
-
混合云支持:
通过 VMware HCX 实现数据库工作负载在本地和云端的无缝迁移。 -
容器化集成:
支持在 VM 中运行 Kubernetes,实现数据库服务的现代化部署。
1.2.项目说明
该项目是一个综合实战项目,重点涉及虚拟化、MySQL 集群和 Shell 脚本,旨在锻炼实操能力。通过参与该项目,深入了解在企业环境中所需的多项知识点,并学习如何通过编写 Shell 脚本实现运维自动化 。
1.3.实验背景
随着信息技术的不断发展和医疗行业的现代化进程,医院的管理系统逐渐向数字化和智能化发展。洛杉矶第一人民医院作为一家大型医疗机构,建立了一个患者就诊历史管理系统,以便患者能方便地通过身份证信息查询自己在医院的就诊记录。这一系统不仅提高了患者的就诊体验,也为医疗服务提供了有效的数据支持。同时,系统的稳定性和安全性在医院运营中显得尤为重要。
然而,随着患者量的增加和数据量的不断增长,原有的物理机器环境在存储和计算能力上逐渐显得疲态,系统的扩展及维护成本逐步上升,面对突发的网络攻击和硬件故障,系统的安全性和可靠性也面临着挑战。为了解决这些问题,医院决定将患者就诊历史管理系统迁移到企业级虚拟化平台上。
企业级虚拟化平台具备灵活的资源调配、高效的负载均衡和良好的安全隔离性,能够在提供高可用性的同时,大幅度降低运维成本。迁移到虚拟化平台后,系统可以实现更好的资源管理和性能优化,并且易于扩展,能够应对未来可能增加的业务需求。同时,虚拟化技术支持的灾难恢复方案能够为医院的就诊历史数据提供更高的保护,确保患者信息安全。
考虑到患者的个人隐私和医疗数据的敏感性,该项目还将注重信息安全的合规性,确保符合相关法规要求,为患者提供更加安全、高效的就医服务。因此,这一迁移项目不仅是技术的升级,更是对医疗服务质量和安全性的一次全面提升。
1.4.实验目的
1. 综合实战项目:课程结合了多个高级技术领域,目的是通过实践把理论知识转化为实际能力,特别是在运维和数据库管理方面。
2. 真实企业案例:通过对接真实企业案例,项目能够帮助理解实际工作场景,避免因虚构项目而带来的不切实际的困扰,促进主动思考和问题解决能力。
3. 实操能力锻炼:强调实操能力的锻炼,不仅关注技术细节,还注重动手能力的提升,包括如何使用 Shell 脚本实现运维自动化,增强其在工作中的实际应用能力。
4. 企业级虚拟化平台与更新软件环境:引入现代虚拟化解决方案,能够接触到最新的工具和技术,为日后在企业中工作打下良好基础。
1.5.实验环境
二、安装企业级虚拟化平台
2.1.VMware 新建虚拟化平台
在 VMware 里新建虚拟机,建立好实验所需的虚拟化环境。
2.2.自定义安装 ESXi 8
建立完成后开机。
在 ESXi 8 安装过程中输入的 runweasel cdromBoot autoPartitionOSDataSize=8192 是一组用于引导和配置安装过程的命令参数,下面为你详细解释每个部分的含义:
runweasel
-
runweasel 是 ESXi 安装程序的启动命令,weasel 实际上是 ESXi 安装程序的内部名称,当你输入 runweasel 时,就会启动 ESXi 安装向导,开始整个安装流程。
cdromBoot
-
cdromBoot 表示从光盘(CD-ROM)启动安装过程。在早期的服务器安装中,使用光盘作为安装介质是比较常见的方式。这里明确指定从光盘引导系统,意味着 ESXi 安装程序会从插入服务器光驱的 ESXi 安装光盘中读取安装文件并进行安装操作。
autoPartitionOSDataSize=8192
-
autoPartition:这表示让安装程序自动对磁盘进行分区。在安装 ESXi 时,磁盘分区是一个重要步骤,autoPartition 选项可以让安装程序根据默认的规则和算法,自动为 ESXi 系统分配磁盘空间,创建必要的分区,而无需用户手动干预分区过程。
-
OSDataSize=8192:OSDataSize 用于指定 ESXi 系统数据分区的大小,单位是兆字节(MB)。这里设置为
8192
,意味着安装程序会自动创建一个大小为 8192 MB(即 8 GB)的系统数据分区,用于存储 ESXi 操作系统的相关数据、配置文件等。
综上所述,runweasel cdromBoot autoPartitionOSDataSize=8192 这一命令组合的作用是:从光盘启动 ESXi 8 的安装程序,让安装程序自动对磁盘进行分区,并将 ESXi 系统数据分区的大小设置为 8GB。
注意:这里系统提示需要断开光盘,再重启。
F2 定制化系统
三、配置 pxe_server 主机
浏览器进入企业级虚拟化平台。
3.1.上传镜像
上传准备好的 rhel9 镜像,等待上传完毕。
3.2.安装 pxe_server 主机
新建虚拟机。
打开 pxe_server 主机。
手动修改完毕,如下图。
注意:要连接光盘。
3.3.准备 pxe_server 主机自动化脚本所需的环境
准备一个主机作为 web 服务器(这里的 IP:192.168.67.170),安装 httpd 服务,配置接下来实验所需的 mysql 软件压缩包和 mysql 主机配置系统所需的 shell 脚本。
3.4.部署自动化脚本
xshell 链接虚拟机。
用 xftp 上传准备好的自动化脚本。
执行脚本。
3.5.自动化脚本代码
#!/bin/bashecho
echo GET READY FOR ENV,PLEASE WAIT...# 设置本机yum源# config rpm reporepoconfig() {rm -rf /etc/yum.repos.d/rpm.repocat << EOF > /etc/yum.repos.d/rpm.repo
[baseos]
name=BaseOS
baseurl=/mnt/BaseOS
gpgcheck=0
[baseos2]
name=AppStream
baseurl=/mnt/AppStream
gpgcheck=0
EOFdnf clean all &> /dev/null
mount /dev/sr0 /mnt &> /dev/nulldnf install initscripts -y &> /dev/null
REPORES=$(rpm -qa | grep initscripts &> /dev/null; echo $?). /etc/rc.d/init.d/functionsif [ ${REPORES} -eq 0 ];
thenecho_successecho "--> Local Repo Config Succeessfully."
elseecho_failureecho "--> Local Repo Config Failed. Please Check."exit 1
fi
}# 设置本机IP# get ip addressgetipadd() {
hostname -I &> /dev/nullif [ $? -eq 0 ];
thenecho_successecho "--> Get IP OK."
elseecho_failureecho "--> Get IP Failed."exit 2
fi#PXE_IP=$(echo $(hostname -I)|awk -F '{print $1}')
PXE_IP=$(hostname -I | cut -d " " -f 1)
PXE_IP_NET=$(echo $PXE_IP | cut -d "." -f 1-3)
PXE_IP_HOST=$(echo $PXE_IP | awk -F "." '{print $4}')IPCONN=$(nmcli connection show | grep ethernet | awk '{print $1}')
nmcli connection modify ${IPCONN} ipv4.addresses ${PXE_IP}/24
nmcli connection modify ${IPCONN} ipv4.gateway ${PXE_IP_NET}.2
nmcli connection modify ${IPCONN} ipv4.dns ${PXE_IP_NET}.2
nmcli connection modify ${IPCONN} ipv4.method manual
nmcli connection modify ${IPCONN} connection.autoconnect yes
nmcli connection up ${IPCONN} &> /dev/nullecho
echo "Host IP address is ${PXE_IP}"
echo "Host name is $(hostname)"
echo
#echo "NET is ${PXE_IP_NET}"
#echo "IP_HOST is ${PXE_IP_HOST}"IPCOUNT=$(hostname -I | wc -l)if [ ${IPCOUNT} -eq 1 ];
thenecho_successecho "--> IP Address OK"
elseecho_failureecho "--> IP Address Failed, Please Check..."exit 3
fi
}# 安装本机pxe需要的软件# Install all rpm packageinstallrpm(){
echo "--> Install packages now, Please wait..."
RPMINST=$(dnf install dhcp-server tftp-server httpd wget -y &> /dev/null;echo $?)if [ "${RPMINST}" -eq 0 ];
thenecho_successecho "--> The packages install complete..."
elseecho_failureecho "--> The packages install failed, Please check..."exit 4
fi
}# 配置DHCP# Config and Starting the dhcp server##dhcpconfig(){
cat << EOF > /etc/dhcp/dhcpd.conf
option architecture-type code 93 = unsigned integer 16;subnet ${PXE_IP_NET}.0 netmask 255.255.255.0 {option routers ${PXE_IP_NET}.2;option domain-name-servers ${PXE_IP_NET}.2;range ${PXE_IP_NET}.100 ${PXE_IP_NET}.200;class "pxeclients" {match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";next-server ${PXE_IP};if option architecture-type = 00:07 {filename "redhat/EFI/BOOT/BOOTX64.EFI";}else {filename "pxelinux/pxelinux.0";}}class "httpclients" {match if substring (option vendor-class-identifier, 0, 10) = "HTTPClient";option vendor-class-identifier "HTTPClient";filename "http://${PXE_IP}/redhat/EFI/BOOT/BOOTX64.EFI";}
}
EOFDHCPRES=$(systemctl restart dhcpd &> /dev/null;echo $?)if [ ${DHCPRES} -eq 0 ];thenecho_successecho "--> Service DHCP starting..."
elseecho_failureecho "--> Service DHCP starting failed, Please check..."exit 5
fi
}# 配置tftp,配置UEFI PXE#/var/lib/tftpboot/
#├── redhat/EFI/BOOT/BOOTX64.EFI 或者 http://${PXE_IP}/redhat/EFI/BOOT/BOOTX64.EFI # Syslinux 提供的 PXE 引导程序
#└── images/
# ├── vmlinuz # Linux 内核
# └── initrd.img # 初始化内存镜像
#└──redhat/EFI/BOOT/grub.cfg # 启动菜单配置文件# Config and starting the tftp servertftpconfig(){
TFTP_DIR=/var/lib/tftpbootrm -rf ${TFTP_DIR}/*mkdir ${TFTP_DIR}/images/
mkdir ${TFTP_DIR}/redhat/cp /mnt/isolinux/initrd.img ${TFTP_DIR}/images/
cp /mnt/isolinux/vmlinuz ${TFTP_DIR}/images/cp -r /mnt/EFI ${TFTP_DIR}/redhat/
chmod -R 755 ${TFTP_DIR}/redhat/cat << EOF > ${TFTP_DIR}/redhat/EFI/BOOT/grub.cfg
set timeout=1
menuentry 'Install RHEL9.3 Operating System' {linuxefi images/vmlinuz ip=dhcp inst.ks=http://${PXE_IP}/ks.cfginitrdefi images/initrd.img
}
EOFsystemctl enable tftp.socket --now &> /dev/nullif [ "$?" -eq 0 ];thenecho_successecho "--> Service TFTP starting..."
elseecho_failureecho "--> Service TFTP starting failed, Please check..."exit 6
fi
}# 创建共享给客户端rpm网络源# Creating Client local repo fileclientrepo(){
echo "--> Creating Client local repo file now, Please wait..."
sleep 3cat << EOF > /var/www/html/rpm.repo
[BaseOS]
name=BaseOS
baseurl=http://$PXE_IP/RHEL-9/BaseOS
gpgcheck=0[AppStream]
name=AppStream
baseurl=http://$PXE_IP/RHEL-9/AppStream
gpgcheck=0
EOF
}# 创建共享给客户端mysql源
# createrepo制作mysql源# Creating Client MySQL repo fileclientmysqlrepo(){
echo "--> Creating Client MySQL repo file now, Please wait..."
sleep 3if [ -e /var/www/html/mysql ];
thenrm -rf /var/www/html/mysql/*
elsemkdir /var/www/html/mysql
fiif [ -e /root/mysql.tar.gz ];
thencp mysql.tar.gz /var/www/html/mysql/
elsewget -q --show-progress http://192.168.67.170/mysql.tar.gz -O /var/www/html/mysql/mysql.tar.gz # 另一台主机共享mysql.tar.gz(192.168.67.170)
fi# 制作mysql的yum仓库
if [ -e /var/www/html/mysql/mysql.tar.gz ];
thencd /var/www/html/mysql/tar xf mysql.tar.gz &> /dev/nulldnf install createrepo -y &> /dev/nullcreaterepo /var/www/html/mysql/ &> /dev/null
else echo "Cound not found MySQL Package, Please check..."exit
ficat << EOF > /var/www/html/mysql.repo
[mysql]
name=MySQL
baseurl=http://$PXE_IP/mysql
gpgcheck=0
EOF
}# 创建kickstart# Creating ks.cfgksfile(){
echo "--> Creating ks.cfg now, Please wait..."
sleep 3cat << EOF > /var/www/html/ks.cfg
# Generated by Anaconda 34.25.3.8
# Generated by pykickstart v3.32
#version=RHEL9
# Use graphical install
#graphical
text
url --url=http://${PXE_IP}/RHEL-9/%addon com_redhat_kdump --enable --reserve-mb='auto'%end# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8%packages
#@^workstation-product-environment
@^Minimal Install
vim-enhanced
bash-completion
wget
tree
lrzsz
net-tools
psmisc
expect
%end# Run the Setup Agent on first boot
firstboot --enable# Generated using Blivet version 3.6.0
ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel# System timezone
timezone Asia/Shanghai --utc# Root password
rootpw --iscrypted --allow-ssh $6$uzsdS7k7Sx75uUAb$8v8T/DwBtd6vDkvh85HoYUAZ8ktZavD2mGgNSXkgX0.9vtgY0E39xCWRXpLTCeGwRXjFRrsF8wimsU/K0h/OW/
user --name=redhat --password=$6$Pq1XFyFW/hDyZ7gJ$gkJkU76IppE8ZG7wdlnA5VJVHOHsbFgb2nHh.jVvDKVuryzymeR33TUDQRXpgDCvoWGYN.nSYYGs.QV3VJJsN. --iscrypted --gecos="redhat"%post
wget http://$PXE_IP/rpm.repo -O /etc/yum.repos.d/rpm.repo &> /dev/null
wget http://$PXE_IP/mysql.repo -O /etc/yum.repos.d/mysql.repo &> /dev/null
wget -q --show-progress http://192.168.67.170/mysql.sh -O /root/mysql.sh &> /dev/null
echo redhat | passwd --stdin root &> /dev/null
echo redhat | passwd --stdin redhat &> /dev/null
echo
echo
echo "Welcome to MySQL Database System" >> /etc/issue
echo "" >> /etc/issue
%end
reboot
EOF
}
# 注意上面的mysql.sh需要另一个主机共享,就是上面所准备的环境(192.168.67.170)# 配置httpd服务,共享yum源httpiso(){HTTPISO=/var/www/html/RHEL-9
umount ${HTTPISO} &> /dev/null
mkdir ${HTTPISO} &> /dev/null
mount /dev/sr0 ${HTTPISO} &> /dev/nullif [ "$?" -eq 0 ];thenecho_successecho "--> The ISO remote repo install ok."
elseecho_failureecho "--> The ISO remote repo install faied."exit 7
fisystemctl enable httpd --now &> /dev/nullif [ "$?" -eq 0 ];thenecho_successecho "--> Service HTTP starting..."
elseecho_failureecho "--> Service HTTP starting failed, Please check..."exit 8
fisystemctl stop firewalld &> /dev/nullHTTP_CON_RES=$(curl http://${PXE_IP}/RHEL-9/media.repo &> /dev/null;echo $?)if [ "$HTTP_CON_RES" -eq 0 ];thenecho_successecho "--> The remote repo test ok."
elseecho_failureecho "--> The remote repo test failed, Please check."exit 9
fi
}firewallconfig(){systemctl start firewalldfirewall-cmd --permanent --add-service=http --add-service=tftp &> /dev/nullfirewall-cmd --reload &> /dev/null
}
#1 config local rpm repo
repoconfig#2 get ip
getipadd#3 install rpm package
installrpm#4 dhcp service config
dhcpconfig#5 tftp service config
tftpconfig#6 config client repo file
clientrepo#7 config MySQL repo file
clientmysqlrepo#8 ks file generate
ksfile#9 iso with http
httpiso#10 firewalld config
firewallconfigecho
echo "The PXE Server deployed complete."
echo
四、配置 MySQL 主机
4.1.安装 MySQL_Master 和 MySQL_Slave 主机
创建 MySQL_Master 主机。
因为 MySQL 主机要用 pxe 自动化安装,所以这里不设置光盘文件。
重复以上操作,再建一个 MySQL_Slave 主机(创建步骤省略)。
创建好之后如下图:
开机,等待自动安装完毕(前面配置的 pxe_server 主机就是为了给这两台主机提供 pxe 服务的,实现自动化安装系统)。
安装完毕,登录 root 账号,查看 IP。
用 xshell 登录,家目录下以下载 mysql.sh 脚本,直接执行自动化脚本,配置 MySQL 主从服务器。
注意:主服务器在执行 shell 脚本时,需要带上 master。slave 服务器需要交互式输入 master 服务器生成的相关信息,从而构建主从服务器。
4.2.登录 MySQL 查看主从同步状态
注意:密码是 #openLAB123
从库查看主从同步状态。
测试主从同步:主库创建一个数据库,从库能查到主库创建的数据库,说明主从同步完成。
4.3.自动化脚本代码
echo GET READY FOR ENV,PLEASE WAIT...MYSQLROLE=$1mysqlinit (){
systemctl stop mysqld &> /dev/null
rm -rf /var/log/mysql*
rm -rf /usr/lib64/mysql
rm -rf /var/lib/mysql
dnf remove mysql mysql84-community-release-el9 -y &> /dev/null
systemctl daemon-reload
dnf install initscripts -y &> /dev/null
. /etc/rc.d/init.d/functions
}mysqlrepo(){
rpm -i https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm &> /dev/nullREPORES=$?
if [ $REPORES -eq 0 ];thenecho_successecho "--> ENV READY"
elseecho_failureecho "--> ENV NOT READY,PLEASE CHECK!!!"exit 1
fi
}# install mysql package
mysqlinstall(){
echo "--> Install MySQL Server Now, Please wait..."
dnf install mysql mysql-server -y &> /dev/nullrpm -qa | grep mysql-server &> /dev/nullINSRES=$?if [ $? -eq 0 ]
thenecho_successecho "--> MySQL install successfully"
elseecho_failureecho "--> MySQL install failure"exit 2
fi
systemctl enable mysqld --now &>/dev/null
firewall-cmd --permanent --add-service=mysql &> /dev/null
firewall-cmd --reload &> /dev/null
}# master config
masterconfig(){
MYSQLTEMPPASS=$(grep "password is generated" /var/log/mysqld.log | awk '{print $NF}' | tail -1)mysql --connect-expired-password -uroot -p${MYSQLTEMPPASS} -e"
ALTER USER 'root'@'localhost' identified by '#openLAB123';
CREATE USER 'repl'@'%' IDENTIFIED BY '#openLAB123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
QUIT" &> /dev/nullsed -i '/server-id/d' /etc/my.cnf
echo "server-id=22" >> /etc/my.cnf
systemctl restart mysqldTEMPFILE=$(mktemp -t mysql.mastertemp.XXXXXX)
mysql --connect-expired-password -uroot -p#openLAB123 -e"
SHOW BINARY LOG STATUS\G;
QUIT" &> $TEMPFILEMYSQLBINFILE=$(grep File ${TEMPFILE} | awk '{print $2}')
MYSQLPOSITION=$(grep Position ${TEMPFILE} | awk '{print $2}')echo "####################################"
echo " MASTER BINFILE : $MYSQLBINFILE"
echo " MASTER POSITION : $MYSQLPOSITION"
echo "MASTER IP ADDRESS : $(hostname -I)"
echo "####################################"echo "MySQL role is MASTER"
}# master config
slaveconfig(){
MYSQLTEMPPASS=$(grep "password is generated" /var/log/mysqld.log | awk '{print $NF}' | tail -1)mysql --connect-expired-password -uroot -p${MYSQLTEMPPASS} -e"
ALTER USER 'root'@'localhost' identified by '#openLAB123';
QUIT" &> /dev/nullsed -i '/server-id/d' /etc/my.cnf
echo "server-id=23" >> /etc/my.cnf
systemctl restart mysqldread -p "Please input the MASTER BINFILE: " BINFILE
read -p "Please input the MASTER POSITION: " POSITION
read -p "Please input the MASTER IP: " MASTERIPmysql --connect-expired-password -uroot -p#openLAB123 -e"
CHANGE REPLICATION SOURCE TO SOURCE_HOST='${MASTERIP}',SOURCE_USER='repl',SOURCE_PASSWORD='#openLAB123',SOURCE_LOG_FILE='${BINFILE}',SOURCE_LOG_POS=${POSITION},GET_SOURCE_PUBLIC_KEY=1;
START REPLICA;
QUIT" &> /dev/nullTEMPFILE=$(mktemp -t mysql.slavetemp.XXXXXX)
mysql --connect-expired-password -uroot -p#openLAB123 -e"
show replica status \G
QUIT" &> $TEMPFILEMYSQL_IO_STA=$(grep Replica_IO_Running ${TEMPFILE} | awk '{print $2}')
MYSQL_SQL_STA=$(grep Replica_SQL_Running ${TEMPFILE} | awk '{print $2}')echo "--> Testing MySQL Cluster Now..."
sleep 5
if [ "${MYSQL_IO_STA}" == "Yes" -o "MYSQL_SQL_STA" == "Yes" ];
thenecho_successecho "Replica Status Ok."
elseecho_failureecho "Replica Status Failed. Please Check."
fiecho "MySQL role is SLAVE"
}mysqlinit
#mysqlrepo
mysqlinstallif [ "${MYSQLROLE}" == "master" ];
thenmasterconfig
elseslaveconfig
fi
相关文章:

企业级虚拟化数据库基础平台自动化部署项目
一、项目简介及准备工作 1.1.虚拟化平台简介 1.1.1.ESXi 8 是什么? 定义: ESXi 8 是 VMware 推出的最新版本 裸机虚拟化管理程序(Hypervisor),属于 VMware vSphere 产品线的核心组件。 核心功能: 在物理…...

关于elementui的时间组件与后端时间和oracle数据库时间的对应格式
前端: <el-date-pickerv-model"formInline.startTime"type"date"value-format"yyyy-MM-dd"placeholder"选择日期"> </el-date-picker> 后端: private String startTime; private String endTime…...

一周学会Flask3 Python Web开发-WTForms表单验证
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…...

qt open3dBPA重建
qt open3dBPA重建 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionBPA_triggered();//bpa重建 void MainWindow::...

Unity游戏开发中的网格简化与LOD技术(Mesh Simplification LOD)
在Unity游戏开发中,网格简化(Mesh Simplification)和LOD(Level of Detail)技术是优化渲染性能的关键手段,尤其在处理复杂场景和高精度模型时至关重要。以下是一套系统的实现方案与优化策略: 一、…...

基于YOLO11深度学习的运动品牌LOGO检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

纯html文件实现目录和文档关联
目录结构 效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>项目结题报告</title><style lang"scss">::-webkit-scrollbar {width: 6px;height: 6px;}::-webkit-scro…...

C# | 委托 | 事件 | 异步
委托(Delegate)和事件(Event) 在C#和C中,委托(Delegate)与事件(Event)以及函数对象(Function Object)是实现回调机制或传递行为的重要工具。虽然…...

数据结构——顺序表与链表
1. 基础介绍 1、线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素; (2)第一个数据元素没有前驱数据…...

【uniapp】图片添加canvas水印
目录 需求&背景实现地理位置添加水印 ios补充 需求&背景 需求:拍照后给图片添加水印, 水印包含经纬度、用户信息、公司logo等信息。 效果图: 方案:使用canvas添加水印。 具体实现:上传图片组件是项目里现有的ÿ…...

ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框
1、启用选择任意一级选项 在 el-cascader 标签上加上配置项: :props"{ checkStrictly: true }"例如: <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…...

【音视频】ffplay常用命令
一、 ffplay常用命令 -x width:强制显示宽度-y height:强制显示高度 强制以 640*360的宽高显示 ffplay 2.mp4 -x 640 -y 360 效果如下 -fs 全屏显示 ffplay -fs 2.mp4效果如下: -an 禁用音频(不播放声音)-vn 禁…...

5人3小时复刻Manus?开源OpenManus项目全解剖,我的DeepSeek股票报告这样诞生
大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! OpenManus是什么 1. 项目背景 OpenManus 是由 MetaGPT 核心团队仅用 3 小时复刻而成的开源…...

【Python运维】用Python自动化AWS资源管理:利用boto3实现高效管理S3桶和EC2实例
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算的普及,AWS(Amazon Web Services)已经成为许多企业和开发者首选的云平台。为了提高工作效率,自动化管理AWS资源成为了一个热…...

django各种mixin用法
在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...

Java 大视界 -- Java 大数据在智能教育考试评估与学情分析中的应用(112)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

Manus AI : Agent 元年开启.pdf
Manus AI : Agent 元年开启.pdf 是由华泰证券出品的一份调研报告,共计23页。报告详细介绍了Manus AI 及 Agent,主要包括Manus AI 的功能、优势、技术能力,Agent 的概念、架构、应用场景,以及 AI Agent 的类型和相关案例࿰…...

【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率
计算机网络的性能指标 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是:网速、最高网速和实时网速。 相信大家看到这三个词应该就…...

FreeRTOS第15篇:FreeRTOS链表实现细节03_List_t与ListItem_t的奥秘
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 FreeRTOS列表的核心数据结构 FreeRTOS的列表实现由两个关键结构体组成:List_t(列表)和ListItem_t(列表项)。它们共同…...

git 添加额外的远程仓库 URL
要使用 git branch -a 查看 net-next 远程仓库中的所有分支,请按照以下步骤操作: 步骤 1: 确保已添加 net-next 远程仓库 如果尚未添加 net-next 远程仓库,请运行以下命令: git remote add net-next git://git.kernel.org/pub/s…...

不同类型光谱相机的技术差异比较
一、波段数量与连续性 多光谱相机 波段数:通常4-9个离散波段,光谱范围集中于400-1000nm。 数据特征:光谱呈阶梯状,无法连续覆盖,适用于中等精度需求场景(如植被分类)。 高光谱相机…...

Swift系列01-Swift语言基本原理与设计哲学
本文将深入探讨Swift的核心原理、设计理念以及与Objective-C的对比 1. Swift与Objective-C的架构差异分析 Swift和Objective-C尽管可以无缝协作,但它们的架构设计存在本质差异。 1.1语言范式 Objective-C是一种动态语言,建立在C语言之上并添加了Smal…...

《OpenCV》——dlib(人脸应用实例)
文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章:https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331,故此这篇文章只介绍dlib的人…...

以太网通讯
接口开发笔记-WebApi-CSDN博客 以太网常用通讯协议 1、modbus tcp using EasyModbus; using System;class Program {static void Main(string[] args){// 创建Modbus客户端实例ModbusClient modbusClient new ModbusClient("192.168.1.100"); // IP地址modbusCli…...

UDP学习笔记(一)为什么UDP需要先将数据转换为字节数组
UDP 发送数据时需要先将数据转换为字节数组再发送,主要是因为计算机网络传输的最基本单位是“字节”(Byte)。让我们从以下几个方面来深入理解这个设计选择: 1. 计算机网络只能传输“字节” 在网络通信中,无论是 TCP 还…...

数据分析/数据科学常见SQL题目:连续登录用户、留存率、最大观看人数
文章目录 1. SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?2. 已知表user,字段id, date,求新用户的次日留存率3. 已知表user,字段id,date,求每个日期新用户的次日留…...

【Conda】Windows安装conda/Anaconda环境
安装conda并配置powershell 访问该网址,下载安装即可: Anaconda下载 安装完成后,打开Anaconda,并访问Powershell Prompt 弹出Windows Terminal,并正常进入Conda 【非必须】如果不是通过Windows Terminal打开&#x…...

olmOCR:高效精准的 PDF 文本提取工具
在日常的工作和学习中,是否经常被 PDF 文本提取问题困扰?例如: 想从学术论文 PDF 中提取关键信息,却发现传统 OCR 工具识别不准确或文本格式混乱?需要快速提取商务合同 PDF 中的条款内容,却因工具不给力而…...

数字投屏叫号器-发射端python窗口定制
窗口 本系列前章介绍,叫号器的显示端,完成了视频音频的形成和传输的介绍。本章节开始定制小窗口。 最终实现,处于桌面最前端,发送指令,集合前篇即可完成: 处理本地text.txt更新,随之被rtsp采集…...

从零开始实现大语言模型(十四):高阶训练技巧
1. 前言 预训练大语言模型的流程与训练普通神经深度网络模型本质上并没有任何不同。可以使用深度学习实践中已经被证明非常有效的高阶训练技巧,优化大语言模型预训练流程,使大语言模型预训练效率更高,训练过程更稳定。 本文介绍深度学习领域…...