实训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

news2024/9/28 5:30:01

1、roles(角色)介绍


roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独 的⽬录中,并可以便捷地调⽤它们的⼀种机制。

假设我们要写⼀个playbook来安装管理lamp环境,那么这个 playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能 拆分, 分成apache管理,php管理,mysql管理,然后在需要使⽤的时候 直接调⽤就可以了,以免重复写。就类似编程⾥的模块化的概念,以 达到代码复⽤的效果。

2、roles目录介绍


 files:⽤来存放由copy模块或script模块调⽤的⽂件。
 tasks:⾄少有⼀个main.yml⽂件,定义各tasks。
 handlers:有⼀个main.yml⽂件,定义各handlers。
 templates:⽤来存放jinjia2模板。
 vars:有⼀个main.yml⽂件,定义变量。
 meta:有⼀个main.yml⽂件,定义此⻆⾊的特殊设定及其依赖关系。
注意: 在每个⻆⾊的⽬录中分别创建files, tasks,handlers,templates,vars和meta⽬录,⽤不到的⽬录可以创建为空⽬录。

3、使用roles安装httpd和mysql


1)创建roles角色基础目录与文件
 [root@1 ~]# cd /etc/ansible/roles/
 [root@1 roles]# mkdir {httpd,mysql}
 [root@1 roles]# mkdir {httpd,mysql}/{tasks,handlers,vars,meta}
 [root@1 roles]# touch {httpd,mysql}/{tasks,handlers,vars,meta}/main.yml
 [root@1 roles]# tree 
 .
 ├── httpd
 │   ├── files
 │   ├── handlers
 │   │   └── main.yml
 │   ├── meta
 │   │   └── main.yml
 │   ├── tasks
 │   │   └── main.yml
 │   ├── templates
 │   └── vars
 │       └── main.yml
 ├── mysql
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── tasks
    │   └── main.yml
    ├── templates
    └── vars
        └── main.yml
2)创建playbook调用角色
 [root@1 roles]# vim /etc/ansible/playbook/test002.yml
 ---
 - hosts: s
   remote_user: root
   roles:
   - httpd
   - mysql 
 [root@1 roles]# cd
 [root@1 ~]# vim /etc/ansible/roles/mysql/tasks/main.yml 
 ---
 - name: 卸载mysql
   yum: name=mysql state=absent
 - name: 安装mysql
   yum: name=mysql state=present
 [root@1 ~]# vim /etc/ansible/roles/httpd/tasks/main.yml
 ---
 - name: 卸载httpd
   yum: name=httpd state=absent
 - name: 安装httpd
   yum: name=httpd state=present
 - name: 启动httpd
   service: name=httpd state=started enabled=yes
 [root@1 ~]# ansible-playbook /etc/ansible/playbook/test002.yml 


4、练习:使用role来实现lnmp

.
1、nginx改配置8080

2、mariadb中创建eleme数据库

3、创建表 t_user

1)使用剧本修改nginx的端口号为80
 [root@m0 ~]# vim /etc/ansible/playbook/nginx.yml
 ---
 - hosts: s
   remote_user: root
   tasks:
   - name: 卸载httpd
     yum: name=httpd   state=absent
   - name: 安装nginx
     yum: name=nginx   state=present
   - name: 修改资源文件
     shell: echo 'i am nginx,port is 80' > /usr/share/nginx/html/index.html
   - name: 修改端口
     command: sed -i '/listen/ s/80/8080/g' /etc/nginx/nginx.conf
     notify:
   - restart nginx
   - name: 启动服务
     service: name=nginx   state=started  enabled=yes
   handlers:
   - name: restart nginx
     service: name=nginx   state=restarted
  ...
 [root@m0 ~]# ansible-playbook /etc/ansible/playbook/nginx.yml
2)安装mariadb,命令行形式创建数据库和表
 [root@1 ~]# yum -y remove *mariadb*
 [root@1 ~]# yum -y install mariadb
 [root@1 ~]# yum -y install mariadb-server.x86_64 
 [root@1 ~]# yum -y install mariadb-devel.x86_64 
 [root@1 ~]# systemctl start mariadb
 [root@1 ~]# mysql
 MariaDB [(none)]> quit
 Bye
 [root@1 ~]# mysql << EOF
 > create database if not exists eleme charset utf8mb4;
 > use eleme;
 > create table user(id int primary key auto_increment,username varchar(45) not null,password varchar(45) not null,remark varchar(45));
 > quit
 > EOF
 [root@1 ~]# mysql
 MariaDB [(none)]> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | eleme              |
 | mysql              |
 | performance_schema |
 | test               |
 +--------------------+
 5 rows in set (0.00 sec)
 MariaDB [test]> use eleme;
 Database changed
 MariaDB [eleme]> show tables;
 +-----------------+
 | Tables_in_eleme |
 +-----------------+
 | user            |
 +-----------------+
 1 row in set (0.00 sec)
3)使用roles安装mariadb并执行脚本创建数据库和表
 [root@1 ~]# cd /etc/ansible/roles/
 [root@1 roles]# cp -r httpd mariadb
 [root@1 roles]# cd mariadb/
 [root@1 mariadb]# ls
 files  handlers  meta  tasks  templates  vars
 [root@1 mariadb]# vim tasks/main.yml 
 ---
 - name: 卸载mariadb
   yum: name=mariadb,mariadb-server,mariadb-devel state=absent
 - name: 安装mariadb
   yum: name=mariadb,mariadb-server,mariadb-devel state=present
 - name: 启动mariadb
   service: name=mariadb state=started enabled=yes
 - name: 执行脚本,创建数据库和数据表
   script: /etc/ansible/script/dbtable.sh
 [root@1 mariadb]# cd /etc/ansible/
 [root@1 ansible]# mkdir script
 [root@1 ansible]# cd script/
 [root@1 script]# vim dbtable.sh
 #!/bin/bash
 mysql << EOF
 create database if not exists eleme charset utf8mb4;
 use eleme;
 create table t_user(
 id int primary key auto_increment,
 username varchar(45) not null,
 password varchar(45) not null,
 remark varchar(45) 
 );
 quit
 EOF
 [root@1 script]# vim /etc/ansible/playbook/test003.yml
 ---
 - hosts: s
   remote_user: root
   roles:
   - mariadb
 [root@1 script]# cd /etc/ansible/playbook/
 [root@1 playbook]# ansible-playbook test003.yml 

配置⼀主⼆从的mysql服务器 mysql57


1)mysql服务器端⼝3306,不要关闭防⽕墙


 # 主从配置
 [root@mysql57 ~]# firewall-cmd --permanent --add-port=3306/tcp 
 success
 [root@mysql57 ~]# firewall-cmd --reload 
 success
 [root@mysql57 ~]# firewall-cmd --list-ports 
 3306/tcp
 96  yum -y install lrzsz
 66  tar -zxf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 
 67  cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql
 68  mkdir /usr/local/mysql/mysql-files
 69  useradd -r -s /sbin/nologin mysql
 70  chown mysql:mysql /usr/local/mysql/mysql-files/
 71  chmod 750 /usr/local/mysql/mysql-files/
 72  rm -rf /etc/my.cnf
 # 主配置
 73  /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql
 74  /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
 76  cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql57
 77  service mysql57 start
 79  sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile
 80  source /etc/profile
 vim /usr/local/mysql/my.cnf
 [mysqld]
 basedir=/usr/local/mysql
 datadir=/usr/local/mysql/data
 socket=/tmp/mysql.sock
 activate_all_roles_on_login=on
 port=3306
 log-error=/usr/local/mysql/data/db01-master.err
 log-bin=/usr/local/mysql/data/binlog
 server-id=10
 character_set_server=utf8mb4
 service mysql57 restart
 81  mysql -p'zc0fLfoM%SDP'
  mysql> alter user 'root'@'localhost' identified by '123';
  Query OK, 0 rows affected (0.15 sec)     //修改root密码
  mysql> create user 'slave0'@'%' identified by '123';
  Query OK, 0 rows affected (0.03 sec)      //创建slave用户
  mysql> grant replication slave on *.* to 'slave0'@'%';
  Query OK, 0 rows affected (0.02 sec)      //授予replication slave权限
  mysql> flush privileges;                  //重新加载权限表
  Query OK, 0 rows affected (0.00 sec)
  mysql> flush tables with read lock;       //刷新所有表并施加一个全局读锁
  Query OK, 0 rows affected (0.01 sec)
  mysql> show master status;                //查看主服务器当前二进制日志的状态信息
  +---------------+----------+--------------+------------------+-------------------+
  | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +---------------+----------+--------------+------------------+-------------------+
  | binlog.000003 |     1178 |              |                  |                   |
  +---------------+----------+--------------+------------------+-------------------+
  1 row in set (0.00 sec)
  rm -rf /usr/local/mysql/data/auto.cnf
  rsync -av /usr/local/mysql/data root@10.0.0.58:/usr/local/mysql/
  rsync -av /usr/local/mysql/data root@10.0.0.59:/usr/local/mysql/
 # 从配置
 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql57
 service mysql57 start
 sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile
 source /etc/profile
 vim /usr/local/mysql/my.cnf
 [mysqld]
 basedir=/usr/local/mysql
 datadir=/usr/local/mysql/data
 socket=/tmp/mysql.sock
 activate_all_roles_on_login=on
 port=3310
 log-error=/usr/local/mysql/data/db01-slave.err
 relay-log=/usr/local/mysql/data/relaylog
 server-id=11
 character_set_server=utf8mb4
 service mysql57 restart
 mysql -p'123'
 mysql> change master to
      -> master_host='10.0.0.57',
      -> master_user='slave0',
      -> master_password='123',
      -> master_port=3306,
      -> master_log_file='binlog.000003',
      -> master_log_pos=1178;
  Query OK, 0 rows affected, 9 warnings (0.02 sec)
  mysql> start slave;
  Query OK, 0 rows affected, 1 warning (0.03 sec)
  mysql> show slave status\G
  *************************** 1. row ***************************
                 Slave_IO_State: Waiting for source to send event
                    Master_Host: 10.0.0.57
                    Master_User: slave
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: binlog.000003
            Read_Master_Log_Pos: 1178
                 Relay_Log_File: relaylog.000002
                  Relay_Log_Pos: 323
          Relay_Master_Log_File: binlog.000003
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes


2)在mysql中添加eleme数据库设置为utf8mb4


 [root@mysql57 ~]# mysql -p'123'
 mysql> create database if not exists eleme charset utf8mb4;
 Query OK, 1 row affected (0.00 sec)
 mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | eleme              |
 | mysql              |
 | performance_schema |
 | sys                |
 +--------------------+
 6 rows in set (0.00 sec)


3)添加表t_user


 mysql> create table eleme.t_user(
     -> id int not null primary key,
     -> name varchar(32) not null,
     -> username varchar(32) not null,
     -> password varchar(32) not null,
     -> remark varchar(32) not null
     -> );
 Query OK, 0 rows affected (0.01 sec)
 mysql> desc eleme.t_user;
 +----------+--------------+------+-----+---------+-------+
 | Field    | Type         | Null | Key | Default | Extra |
 +----------+--------------+------+-----+---------+-------+
 | id       | int(11)      | NO   | PRI | NULL    |       |
 | name     | varchar(32) | NO   |     | NULL    |       |
 | username | varchar(32) | NO   |     | NULL    |       |
 | password | varchar(32) | NO   |     | NULL    |       |
 | remark   | varchar(32) | NO   |     | NULL    |       |
 +----------+--------------+------+-----+---------+-------+
 5 rows in set (0.02 sec)


4)添加2⾏记录


 mysql> insert into eleme.t_user values(1,'超级管理员','admin','admin','超级管理员'),(2,'普通用户','guest','guest','普通用户');
 Query OK, 2 rows affected (0.00 sec)
 Records: 2  Duplicates: 0  Warnings: 0
 mysql> select * from eleme.t_user;
 +----+-----------------+----------+----------+-----------------+
 | id | name            | username | password | remark          |
 +----+-----------------+----------+----------+-----------------+
 |  1 | 超级管理员      | admin    | admin    | 超级管理员      |
 |  2 | 普通用户        | guest    | guest    | 普通用户        |
 +----+-----------------+----------+----------+-----------------+
 2 rows in set (0.00 sec)


5)使⽤mycat为3台数据库设置负载均衡(读写分离)


 [root@mycat ~]# systemctl stop firewalld
 [root@mycat ~]# systemctl disable firewalld
 [root@mycat ~]# ls
 anaconda-ks.cfg             Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
 jdk-8u192-linux-x64.tar.gz  v
 [root@mycat ~]# tar -xf jdk-8u192-linux-x64.tar.gz 
 [root@mycat ~]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz 
 [root@mycat ~]# cp -r jdk1.8.0_192/ /usr/local/jdk
 [root@mycat ~]# cp -r mycat/ /usr/local/
 [root@mycat ~]# ls /usr/local/jdk/
 bin             lib          src.zip
 COPYRIGHT       LICENSE      THIRDPARTYLICENSEREADME-JAVAFX.txt
 include         man          THIRDPARTYLICENSEREADME.txt
 javafx-src.zip  README.html
 jre             release
 [root@mycat ~]# sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile
 [root@mycat ~]# source /etc/profile
 [root@mycat ~]# $JAVA_HOME
 -bash: /usr/local/jdk: 是一个目录
 [root@mycat ~]# sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile
 [root@mycat ~]# source /etc/profile
 [root@mycat ~]# $PATH
 -bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk/bin: 没有那个文件或目录
 [root@mycat ~]# javac -version 
 javac 1.8.0_192
 [root@mycat ~]# ls /usr/local/mycat/
 bin  catlet  conf  lib  logs  version.txt
 [root@mycat ~]# ll /usr/local/mycat/
 总用量 12
 drwxr-xr-x. 2 root root  190 8月  15 15:19 bin
 drwxr-xr-x. 2 root root    6 8月  15 15:19 catlet
 drwxr-xr-x. 4 root root 4096 8月  15 15:19 conf
 drwxr-xr-x. 2 root root 4096 8月  15 15:19 lib
 drwxr-xr-x. 2 root root    6 8月  15 15:19 logs
 -rwxr-xr-x. 1 root root  219 8月  15 15:19 version.txt
 [root@mycat ~]# ls /usr/local/mycat/bin/mycat      
 [root@mycat ~]# vim /usr/local/mycat/conf/server.xml
         <user name="li" defaultAccount="true">
                 <property name="password">li</property>
                 <property name="schemas">eleme</property>
                 <!-- 表级 DML 权限设置 -->
                 <!--            
                 <privileges check="false">
                         <schema name="TESTDB" dml="0110" >
                                 <table name="tb01" dml="0000"></table>
                                 <table name="tb02" dml="1111"></table>
                         </schema>
                 </privileges>           
                  -->
         </user>
 <!--
         <user name="user">
                 <property name="password">user</property>
                 <property name="schemas">TESTDB</property>
                 <property name="readOnly">true</property>
         </user>
 -->
 [root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

 [root@mycat ~]# /usr/local/mycat/bin/mycat start
 Starting Mycat-server...
 [root@mycat ~]# netstat -lnput | grep 8066
 tcp6       0      0 :::8066                 :::*                    LISTEN      1336/java 

6、配置静态资源服务器,为前段提供图⽚和视频

7、部署2台有java17.0.3环境的后端服务器,端⼝8080,不关防⽕墙

8、部署nginx代理java服务器,负载均衡策略为轮询问,端⼝为80

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

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

相关文章

Native开发与逆向第二篇 - 动态注册函数逆向

ida静态分析 示例app是网上找的一个杀毒软件&#xff0c;做安全的app防护应该是OK的。 直接找到JNI_OnLoad 类名没处理&#xff0c;直接是明文。 jint JNI_OnLoad(JavaVM *vm, void *reserved) {jint v2; // w19__int64 v4; // [xsp0h] [xbp-30h] BYREFqword_25148 vm;if ( …

全免费的数据恢复工具推荐!这几个不容错过!

不小心的数据丢失总会带来许多困扰&#xff0c;不过这些困扰也能通过一些全免费的数据恢复工具解决。接下来&#xff0c;就来给大家介绍几款好用的数据恢复工具&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxit-restore/ 福昕数据恢复…

6.2K star!推荐一款开源混沌工程测试平台:Chaos Mesh

1、Chaos Mesh 介绍 Chaos Mesh是一个开源的混沌工程平台&#xff0c;旨在帮助用户在生产环境中测试、验证和优化其应用程序的可靠性和稳定性。通过引入故障注入和混沌工程原则&#xff0c;Chaos Mesh可以模拟各种故障场景&#xff0c;如网络延迟、节点故障、磁盘故障等&#…

【spring】学习笔记1:starter和application

https://spring.io/toolsSpring Boot Extension Pack vs版本 使用Spring Tool Suite初始化Spring项目

如何将本地的hexo博客部署到云服务器

云服务器系统&#xff1a;centos 7 本地电脑 mac 第一步&#xff1a; 初始化Hexo博客 npm install hexo-cli -g hexo init HexoBlog 注意node版本需要16以上 cd HexoBlog hexo server访问地址localhost:4000 云服务器执行以下操作 配置的ssh访问用户 useradd git passw…

知网硕士论文稿酬领取方式

目录 知网硕士论文稿酬领取方式: 建议:版税制付酬 版税 知网 学位年度2008年(含2008年)以后的稿酬标准 知网硕士论文稿酬领取方式: 建议:版税制付酬 你怎么能把自己看死了,以后有大用。 中国知网是由清华大学、清华同方发起,始建于1999年6月,是以实现全社会知识…

一文300字从0到1使用Postman轻松搞定文件上传测试!

postman经常用于接口测试&#xff0c;但是上传文件参数还是蛮复杂的&#xff0c;记录下过程 01、上传文件参数 1.选择请求方式 选择post请求方式&#xff0c;输入请求地址 2.填写Headers Key&#xff1a;Content-Type &#xff1b; Value&#xff1a;multipart/form-data …

【数学建模】层次分析法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。前言 – 人工智能教程 在数学建模问题求解中什么时候用到层次分析法 在数学建模问题求解中&#xff0c;层次分析法&#xff08;Analytic…

Python进阶04-网络编程

零、文章目录 Python进阶04-网络编程 1、计算机网络 网络相关知识请参考计算机网络详解 &#xff08;1&#xff09;IP地址的概念 IP 地址就是标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。 &#xff08;2&#xff09;IP地址的表现形式 IP 地址分为两类…

ArcGIS栅格裁剪与合并,制作等高线

1、下载高程数据&#xff08;DEM&#xff09; https://mp.weixin.qq.com/s/ewlUUVV0PwdcspPGtSdCog 项目区域对应的卫片&#xff0c;也可以在谷歌地图里看大致经纬度范围 2、项目区域 确定项目区域&#xff0c;例如某个县区范围 3、栅格裁剪与合并 将DEM多个栅格数据合并&#…

《黑神话:悟空》惊世背后,AI 究竟如何铸就数字人神话?

在游戏的广袤世界中&#xff0c;每一部新作的问世皆如一次扣人心弦的探险之旅。而《黑神话&#xff1a;悟空》的惊艳登场&#xff0c;无疑是一场震撼灵魂的奇幻冒险。它象征着中国游戏产业的一次石破天惊的飞跃&#xff0c;更是 AI 技术在游戏制作领域应用的杰出典范。 AI时代已…

【Pytorch】生成对抗网络实战

GAN框架基于两个模型的竞争&#xff0c;Generator生成器和Discriminator鉴别器。生成器生成假图像&#xff0c;鉴别器则尝试从假图像中识别真实的图像。作为这种竞争的结果&#xff0c;生成器将生成更好看的假图像&#xff0c;而鉴别器将更好地识别它们。 目录 创建数据集 定…

改变潜意识,让梦想照进现实

你是否经常感到困惑&#xff0c;为何努力不得其果&#xff1f;今天我们将一起探索如何通过重新规划潜意识&#xff0c;让你的内心世界和外在行动达到和谐统一&#xff0c;让潜意识成为你坚不可摧的后盾。 想象一下&#xff0c;如果你的潜意识全天候无休止地为你的梦想努力&…

故障电弧探测器在工业与民用建筑电气线路中的设计与应用

安科瑞徐赟杰 【摘要】&#xff1a;电气设备是建筑中不可缺少的一部分&#xff0c;具有较为重要的作用和意义&#xff0c;在应用过程中不仅能够提升建筑本身实用性能&#xff0c;而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障&#xff0c;不仅会影响…

合宙低功耗4G模组Air780EQ——硬件设计手册02

Air780EQ是一款基于移芯EC716E平台设计的LTECat1无线通信模组。 支持FDD-LTE/TDD-LTE的4G远距离无线 传输技术。 另外&#xff0c;模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 本文将继续介绍合宙Air780EQ的硬件设计中的 应用接口&#xff0c;射频接口&am…

一分钟学会万用表

目录&#xff1a; 1、电池的安装 1&#xff09;指针万用表 2&#xff09;数字万用表 3&#xff09;高精度表 2、表笔的分类 3、表笔安装 5、常用测量方法 1&#xff09;二极管测量 2&#xff09;电阻与通断测量 3&#xff09;电压测量 4&#xff09;电流测量 …

面对孩子自闭症,我们该怎么办?

当得知孩子被诊断为自闭症时&#xff0c;家长们往往会感到震惊、无助甚至绝望。然而&#xff0c;面对这一挑战&#xff0c;我们需要做的是保持冷静&#xff0c;积极寻找应对策略&#xff0c;为孩子创造一个充满爱与希望的环境。 深入了解自闭症是关键。自闭症是一种复杂的神经发…

八款精品图纸加密软件强力推荐2024年图纸加密软件最佳选择!

在数字化时代&#xff0c;设计图纸的安全问题越来越受到企业的重视。为了保障企业的知识产权和核心竞争力&#xff0c;选择一款合适的图纸加密软件显得尤为重要。以下是2024年八款精品图纸加密软件的强力推荐&#xff0c;它们各具特色&#xff0c;能够满足不同企业的需求。 1.…

视频美颜SDK的核心技术:打造智能化主播美颜工具详解

视频美颜SDK不仅提升了视频质量&#xff0c;还为主播们提供了智能化、个性化的美颜功能。那么&#xff0c;视频美颜SDK的核心技术究竟是什么&#xff1f;又是如何为主播打造智能化美颜工具的呢&#xff1f; 1.人脸检测与特征点识别 视频美颜SDK技术通过深度学习算法&#xff…

H5带建站时长可自定义背景官网/引导页源码

源码名称&#xff1a;带建站时长可自定义背景官网/引导页源码 源码介绍&#xff1a;一款带动态时间显示建站时长的引导页源码&#xff0c;可用于引导页、工作室官网、个人主页等。源码为H5自适应手机端、电脑端。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.…