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

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.mzph.cn/news/878269.shtml

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

相关文章

vite-plugin-svg-icons 用法

vite-plugin-svg-icons 是一个 Vite 插件&#xff0c;用于将本地 SVG 文件转换为可直接在 Vue 组件中使用的图标。这个插件能够自动扫描指定目录下的 SVG 文件&#xff0c;并将其注册为 Vue 组件&#xff0c;从而简化了在 Vue 项目中使用 SVG 图标的过程。 1. 安装插件 首先&…

C++ 图形框架 Duilib

Duilib是一个开源的DirectUI界面库&#xff0c;遵循BSD协议&#xff0c;可以免费用于商业项目。它具有以下特点&#xff1a; 简约易扩展的设计&#xff1a;Duilib遵循简洁、清晰的设计理念&#xff0c;使得用户界面更加直观、易于使用。同时&#xff0c;它也提供了丰富的扩展接…

从被动应对到主动防御:开发团队技术故障处理能力的全面升级,未雨绸缪,制胜未来!

开发团队如何应对突发的技术故障和危机&#xff1f; 网易云音乐 时间&#xff1a;2024年8月19日下午 问题&#xff1a; 服务器故障&#xff1a;网易云音乐网页端出现“502 Bad Gateway”报错&#xff0c;App也无法正常使用。影响&#xff1a;用户无法正常登录和使用app、we…

MAC +win10 笔记本, OBS 桌面音频不起作用 问题 总结

现象: MAC+WIN10笔记本,音频是好好的,可以听,但是OBS使用的时候,桌面音频条,保持静止,录制的视频,也没有系统声音。 问题排查 1、通常的OBS无法捕获音频解决方法 1)、 驱动问题,更新到最新驱动 2)、声音参数配置问题 3)、右侧小喇叭,音量合成器中, 4)、设…

Vue.js 样式绑定

Vue.js 样式绑定 Vue.js 是一种流行的前端框架&#xff0c;它提供了一种简洁而强大的方式来绑定样式到元素上。样式绑定允许开发者根据组件的状态动态地改变元素的样式。在 Vue 中&#xff0c;样式绑定可以通过多种方式实现&#xff0c;包括类绑定、内联样式绑定和计算属性样式…

qt父类和子类转换的安全性问题

在 Qt 中&#xff0c;父类和子类之间的转换遵循 C 的类型转换规则。以下是关于父类和子类转换安全性的详细说明&#xff1a; 1. 向上转型&#xff08;Upcasting&#xff09; 定义&#xff1a;将子类对象转换为父类对象。安全性&#xff1a;这是安全的&#xff0c;因为子类对象…

【Word与WPS如何冻结首行首列及窗口】

1.Word如何冻结首行首列及窗口 microsoft word 中锁定表头是一项实用的功能&#xff0c;可让您在滚动文档时保持表头可见。这在处理大型文档或包含大量数据的表格时非常有用。php小编柚子将为您详细介绍 word 锁定表头位置的方法&#xff0c;帮助您轻松掌握这项实用技巧。 1.…

2024国内十大API接口服务平台

在2024年&#xff0c;国内有许多优秀的API接口服务平台&#xff0c;这些平台为开发者和企业提供了丰富的API资源和便捷的服务。以下是国内十大API接口服务平台的简要介绍&#xff08;排名不分先后&#xff09;&#xff1a; 挖数据&#xff1a; 挖数据是一家专注于大数据服务的…

【STM32】驱动LCD

没买LCD屏&#xff0c;没有上机实践&#xff0c;只是学习了理论。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 屏幕接口 2 屏幕驱动的基本步骤 3 8080时序的各信号线 4 8080的读和写 5 屏…

<Rust>egui学习之小部件(八):如何在窗口中添加滑动条slider部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第八篇博…

使用redis模拟cookie-session,例子:实现验证码功能

目录 在前后端分离架构中不建议使用cookie-session机制实现端状态识别 所以我们可以使用redis来模拟session-cookie机制 下面我们通过实现验证码的功能来举例 第一步&#xff1a;了解前端要我们返回的数据变量名字&#xff0c;变量类型 1.封装code,data成一个result类&…

Linux网络配置实例,主机名和hosts映射

目录 linux网络配置实例 第一种方法&#xff08;自动获取&#xff09; 第二种方法&#xff08;指定ip&#xff09; 重启网络服务或者重启系统生效 设置主机名和hosts映射 设置主机名 设置hosts映射 主机名解析过程分析&#xff08;Hosts&#xff0c;DNS&#xff09; …

指针初阶(指针与二维数组)

0.二维数组特性 ①.存储格式 二维数组&#xff0c;在存储空间内的存储顺序是连续存储&#xff0c;按行优先存。 假设定义一个2X3的数组&#xff0c;其在存储空间的存储格式如下&#xff1a; ②.表示方法 且二维数组还有一个特性&#xff0c;例如有二维数组 a[3][2] ,那么 a[0] …

基于Spring的三方平台接口对接方法(OkHttp/RestTemplate/视图)

本文介绍了三方平台接口对接方法&#xff0c;一是基于OkHttp请求工具及dom4j报文封装解析xml的方法&#xff0c;二是采用RestTemplate方法封装请求&#xff0c;三是采用建立视图和从库数据源的方式查询。 一、OkHttp请求工具及dom4j报文封装解析 1、 依赖引入 <!-- okhtt…

CleanClip for Mac v2.2.0 剪贴板历史管理软件正式激活版

CleanClip 是一款专为 Mac 用户设计的强大剪贴板历史管理工具。它能够自动保存您复制的内容,让您轻松访问和管理剪贴板历史记录,大大提高工作效率。 下载地址&#xff1a;CleanClip for Mac v2.2.0 剪贴板历史管理软件正式激活版 主要特点 自动保存剪贴板历史 CleanClip 会自…

SOMEIP_ETS_074: Wrong_Interface_Version

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个包含错误接口版本的SOME/IP请求时&#xff0c;是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时&#xff0c;如果消息中包含的接口版本不正确&…

[ACP云计算]易错题(原题)

ECS 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、 21、 22、 23、 24、 25、 26、 27、 28、 29、 30、 31、 32、 33、 34、 35、 36、 37、 对象存储OSS 1、 2、 3、 4、 5、 6、 重点&#xff01;&#xff01;&#xff…

ARM 寻址举例(19)

举例&#xff1a; 计算一个数组的所有元素的和。 area first, code, readonly code32entry startldr r0,array ; adr r0,array &#xff1b;ADR为小范围的地址读取伪指令 loopldr r1,[r0],#4cmp r1,#0addne r4,r4,r1bne loop stopb stop; DCD…

深入理解Seaborn库的高级功能(二)

Seaborn作为Python中一个功能强大的可视化库,建立在matplotlib的基础之上,提供了更高级的API,使得数据可视化的创建过程更为简便和直观。在实际的数据分析工作中,Seaborn不仅可以帮助我们快速绘制高质量的图表,还能通过丰富的图形种类和调色板选项,让数据展示更加生动、清…

javaee、ssm(maven)、springboot(maven)项目目录结构以及编译后文件目录存放路径

javaee项目目录结构&#xff1a; src下的文件或者是源码编译后都会放在WebRoot&#xff08;项目根目录&#xff09;文件夹\WebRoot\WEB-INF\classes目录中。 编译后的文件夹目录如下&#xff1a; 以上为普通的javaee项目目录结构&#xff0c;同maven工程目录结构是不一样的。…