├── 博客xmind笔记 ├── Ajax.xmind ├── CSS.xmind ├── HTML.xmind ├── JWT.xmind ├── SEO.xmind ├── UML.xmind ├── Vue2.xmind ├── Vue3.xmind ├── 操作系统.xmind ├── 秒杀系统.xmind ├── 网络编程.xmind ├── Axios.xmind ├── Docker.xmind ├── Dubbo.xmind ├── Linux.xmind ├── Mycat.xmind ├── Nginx.xmind ├── Python.xmind ├── Redis.xmind ├── Shiro .xmind ├── Spring.xmind ├── Tomcat.xmind ├── jQuery.xmind ├── maven.xmind ├── 前端小项目.xmind ├── 开发问题指南.xmind ├── 微信小程序.xmind ├── 计算机网络.xmind ├── Bootstrap.xmind ├── JUC并发编程.xmind ├── JavaWeb.xmind ├── MySql基础.xmind ├── MySql高级.xmind ├── RabbitMQ.xmind ├── SpringMVC.xmind ├── Zookeeper.xmind ├── java8 新特性.xmind ├── java基础篇章1.xmind ├── java基础篇章2.xmind ├── mongoDB.xmind ├── 计算机组成原理.xmind ├── BIO、NIO、AIO.xmind ├── Element UI.xmind ├── HTML5+CSS3.xmind ├── Java设计模式篇章1.xmind ├── Java设计模式篇章2.xmind ├── Mysql高级及实战.xmind ├── Spring Boot.xmind ├── SpringCloud.xmind ├── Swagger 引言.xmind ├── TypeScript.xmind ├── kubernetes .xmind ├── 从前慢-谷粒商城篇章1.xmind ├── 从前慢-谷粒商城篇章2.xmind ├── 从前慢-谷粒商城篇章3.xmind ├── 从前慢-谷粒商城篇章4.xmind ├── 从前慢-谷粒商城篇章5.xmind ├── 各种工具的安装与卸载.xmind ├── 深入理解JVM-篇章1.xmind ├── 深入理解JVM-篇章2.xmind ├── ElasticSearch.xmind ├── Git以及Github的使用.xmind ├── JavaScript基础.xmind ├── JavaScript高级篇.xmind ├── Mybatis-Plus.xmind ├── Sharding-JDBC.xmind ├── ssm企业权限管理系统项目.xmind ├── 深入理解JVM-篇章3 .xmind ├── 移动Web开发之响应式布局.xmind ├── SpringSecurity .xmind ├── 移动WEB开发之rem适配布局.xmind ├── 移动WEB开发之百分比布局及flex布局.xmind ├── JavaScript之Web API-篇章1.xmind ├── JavaScript之Web API-篇章2.xmind ├── JavaScript之Web API-篇章3.xmind ├── JavaScript之Web API-篇章4.xmind └── Node+Gulp+Promise+Express.xmind ├── 博客markdown笔记 ├── 前端杂烩 │ ├── SEO.xmind │ ├── Ajax.xmind │ ├── Axios.xmind │ ├── 微信小程序.xmind │ ├── TypeScript.xmind │ ├── Node+Gulp+Promise+Express.xmind │ ├── 从前慢-SEO.md │ └── 从前慢-Axios.md ├── 工具 │ ├── maven.xmind │ ├── Swagger 引言.xmind │ ├── Git以及Github的使用.xmind │ ├── 从前慢-git以及github的使用.md │ └── 从前慢-Swagger.md ├── 服务框架 │ ├── JWT.xmind │ ├── Docker.xmind │ ├── Dubbo.xmind │ ├── Shiro .xmind │ ├── Spring.xmind │ ├── Mybatis.xmind │ ├── SSM整合方式.xmind │ ├── Spring Boot.xmind │ ├── SpringCloud.xmind │ ├── SpringMVC.xmind │ ├── Zookeeper.xmind │ ├── kubernetes .xmind │ ├── ElasticSearch.xmind │ ├── Mybatis-Plus.xmind │ ├── SpringSecurity .xmind │ └── 从前慢-Zookeeper.md ├── 运维 │ └── Linux.xmind ├── 中间件 │ ├── Mycat.xmind │ ├── Nginx.xmind │ ├── Tomcat.xmind │ ├── RabbitMQ.xmind │ ├── Sharding-JDBC.xmind │ └── 从前慢-Nginx.md ├── 前端三大剑客 │ ├── CSS.xmind │ ├── HTML.xmind │ ├── HTML5+CSS3.xmind │ ├── JavaScript基础.xmind │ ├── JavaScript高级篇.xmind │ ├── 移动Web开发之响应式布局.xmind │ ├── 移动WEB开发之rem适配布局.xmind │ ├── 移动WEB开发之百分比布局及flex布局.xmind │ ├── JavaScript之Web API-篇章1.xmind │ ├── JavaScript之Web API-篇章2.xmind │ ├── JavaScript之Web API-篇章3.xmind │ ├── JavaScript之Web API-篇章4.xmind │ ├── 从前慢-移动WEB开发之rem适配布局.md │ ├── 从前慢-移动Web开发之响应式布局.md │ └── 从前慢-JavaScript之Web API-篇章3.md ├── 前端小项目 │ └── 前端小项目.xmind ├── 前端框架 │ ├── Vue2.xmind │ ├── Vue3.xmind │ ├── jQuery.xmind │ ├── Bootstrap.xmind │ └── Element UI.xmind ├── 后端小项目 │ ├── 秒杀系统.xmind │ └── ssm企业权限管理系统项目.xmind ├── 后端杂烩 │ ├── 网络编程.xmind │ ├── JavaWeb.xmind │ └── 从前慢-网络编程.md ├── 开发指南 │ ├── 开发问题指南.xmind │ ├── 各种工具的安装与卸载.xmind │ └── 从前慢-开发问题指南.md ├── 数据库 │ ├── MySql基础.xmind │ ├── MySql高级.xmind │ ├── Redis.xmind │ ├── mongoDB.xmind │ └── Mysql高级及实战.xmind ├── 计算机基础 │ ├── UML.xmind │ ├── 操作系统.xmind │ ├── 计算机网络.xmind │ ├── 计算机组成原理.xmind │ └── 从前慢-UML.md ├── python │ └── Python.xmind ├── Java基础 │ ├── java8 新特性.xmind │ ├── java基础篇章1.xmind │ └── java基础篇章2.xmind ├── Java并发 │ ├── JUC并发编程.xmind │ └── BIO、NIO、AIO.xmind ├── 谷粒商城 │ ├── 从前慢-谷粒商城篇章1.xmind │ ├── 从前慢-谷粒商城篇章2.xmind │ ├── 从前慢-谷粒商城篇章3.xmind │ ├── 从前慢-谷粒商城篇章4.xmind │ └── 从前慢-谷粒商城篇章5.xmind └── Java进阶 │ ├── Java数据结构和算法.xmind │ ├── Java设计模式篇章1.xmind │ ├── Java设计模式篇章2.xmind │ ├── 深入理解JVM-篇章1.xmind │ ├── 深入理解JVM-篇章2.xmind │ └── 深入理解JVM-篇章3 .xmind └── README.md /博客xmind笔记/Ajax.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Ajax.xmind -------------------------------------------------------------------------------- /博客xmind笔记/CSS.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/CSS.xmind -------------------------------------------------------------------------------- /博客xmind笔记/HTML.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/HTML.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JWT.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JWT.xmind -------------------------------------------------------------------------------- /博客xmind笔记/SEO.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/SEO.xmind -------------------------------------------------------------------------------- /博客xmind笔记/UML.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/UML.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Vue2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Vue2.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Vue3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Vue3.xmind -------------------------------------------------------------------------------- /博客xmind笔记/操作系统.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/操作系统.xmind -------------------------------------------------------------------------------- /博客xmind笔记/秒杀系统.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/秒杀系统.xmind -------------------------------------------------------------------------------- /博客xmind笔记/网络编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/网络编程.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Axios.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Axios.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Docker.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Docker.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Dubbo.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Dubbo.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Linux.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Linux.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Mycat.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Mycat.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Nginx.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Nginx.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Python.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Python.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Redis.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Redis.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Shiro .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Shiro .xmind -------------------------------------------------------------------------------- /博客xmind笔记/Spring.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Spring.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Tomcat.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Tomcat.xmind -------------------------------------------------------------------------------- /博客xmind笔记/jQuery.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/jQuery.xmind -------------------------------------------------------------------------------- /博客xmind笔记/maven.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/maven.xmind -------------------------------------------------------------------------------- /博客xmind笔记/前端小项目.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/前端小项目.xmind -------------------------------------------------------------------------------- /博客xmind笔记/开发问题指南.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/开发问题指南.xmind -------------------------------------------------------------------------------- /博客xmind笔记/微信小程序.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/微信小程序.xmind -------------------------------------------------------------------------------- /博客xmind笔记/计算机网络.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/计算机网络.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Bootstrap.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Bootstrap.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JUC并发编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JUC并发编程.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaWeb.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaWeb.xmind -------------------------------------------------------------------------------- /博客xmind笔记/MySql基础.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/MySql基础.xmind -------------------------------------------------------------------------------- /博客xmind笔记/MySql高级.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/MySql高级.xmind -------------------------------------------------------------------------------- /博客xmind笔记/RabbitMQ.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/RabbitMQ.xmind -------------------------------------------------------------------------------- /博客xmind笔记/SpringMVC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/SpringMVC.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Zookeeper.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Zookeeper.xmind -------------------------------------------------------------------------------- /博客xmind笔记/java8 新特性.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/java8 新特性.xmind -------------------------------------------------------------------------------- /博客xmind笔记/java基础篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/java基础篇章1.xmind -------------------------------------------------------------------------------- /博客xmind笔记/java基础篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/java基础篇章2.xmind -------------------------------------------------------------------------------- /博客xmind笔记/mongoDB.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/mongoDB.xmind -------------------------------------------------------------------------------- /博客xmind笔记/计算机组成原理.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/计算机组成原理.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/SEO.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/SEO.xmind -------------------------------------------------------------------------------- /博客markdown笔记/工具/maven.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/工具/maven.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/JWT.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/JWT.xmind -------------------------------------------------------------------------------- /博客markdown笔记/运维/Linux.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/运维/Linux.xmind -------------------------------------------------------------------------------- /博客xmind笔记/BIO、NIO、AIO.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/BIO、NIO、AIO.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Element UI.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Element UI.xmind -------------------------------------------------------------------------------- /博客xmind笔记/HTML5+CSS3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/HTML5+CSS3.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Java设计模式篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Java设计模式篇章1.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Java设计模式篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Java设计模式篇章2.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Mysql高级及实战.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Mysql高级及实战.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Spring Boot.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Spring Boot.xmind -------------------------------------------------------------------------------- /博客xmind笔记/SpringCloud.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/SpringCloud.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Swagger 引言.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Swagger 引言.xmind -------------------------------------------------------------------------------- /博客xmind笔记/TypeScript.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/TypeScript.xmind -------------------------------------------------------------------------------- /博客xmind笔记/kubernetes .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/kubernetes .xmind -------------------------------------------------------------------------------- /博客xmind笔记/从前慢-谷粒商城篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/从前慢-谷粒商城篇章1.xmind -------------------------------------------------------------------------------- /博客xmind笔记/从前慢-谷粒商城篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/从前慢-谷粒商城篇章2.xmind -------------------------------------------------------------------------------- /博客xmind笔记/从前慢-谷粒商城篇章3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/从前慢-谷粒商城篇章3.xmind -------------------------------------------------------------------------------- /博客xmind笔记/从前慢-谷粒商城篇章4.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/从前慢-谷粒商城篇章4.xmind -------------------------------------------------------------------------------- /博客xmind笔记/从前慢-谷粒商城篇章5.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/从前慢-谷粒商城篇章5.xmind -------------------------------------------------------------------------------- /博客xmind笔记/各种工具的安装与卸载.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/各种工具的安装与卸载.xmind -------------------------------------------------------------------------------- /博客xmind笔记/深入理解JVM-篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/深入理解JVM-篇章1.xmind -------------------------------------------------------------------------------- /博客xmind笔记/深入理解JVM-篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/深入理解JVM-篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/中间件/Mycat.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/中间件/Mycat.xmind -------------------------------------------------------------------------------- /博客markdown笔记/中间件/Nginx.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/中间件/Nginx.xmind -------------------------------------------------------------------------------- /博客markdown笔记/中间件/Tomcat.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/中间件/Tomcat.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/CSS.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/CSS.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/HTML.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/HTML.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端小项目/前端小项目.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端小项目/前端小项目.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/Ajax.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/Ajax.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/Axios.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/Axios.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/微信小程序.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/微信小程序.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端框架/Vue2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端框架/Vue2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端框架/Vue3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端框架/Vue3.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端框架/jQuery.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端框架/jQuery.xmind -------------------------------------------------------------------------------- /博客markdown笔记/后端小项目/秒杀系统.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/后端小项目/秒杀系统.xmind -------------------------------------------------------------------------------- /博客markdown笔记/后端杂烩/网络编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/后端杂烩/网络编程.xmind -------------------------------------------------------------------------------- /博客markdown笔记/开发指南/开发问题指南.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/开发指南/开发问题指南.xmind -------------------------------------------------------------------------------- /博客markdown笔记/数据库/MySql基础.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/数据库/MySql基础.xmind -------------------------------------------------------------------------------- /博客markdown笔记/数据库/MySql高级.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/数据库/MySql高级.xmind -------------------------------------------------------------------------------- /博客markdown笔记/数据库/Redis.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/数据库/Redis.xmind -------------------------------------------------------------------------------- /博客markdown笔记/数据库/mongoDB.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/数据库/mongoDB.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Docker.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Docker.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Dubbo.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Dubbo.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Shiro .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Shiro .xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Spring.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Spring.xmind -------------------------------------------------------------------------------- /博客markdown笔记/计算机基础/UML.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/计算机基础/UML.xmind -------------------------------------------------------------------------------- /博客markdown笔记/计算机基础/操作系统.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/计算机基础/操作系统.xmind -------------------------------------------------------------------------------- /博客markdown笔记/计算机基础/计算机网络.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/计算机基础/计算机网络.xmind -------------------------------------------------------------------------------- /博客xmind笔记/ElasticSearch.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/ElasticSearch.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Git以及Github的使用.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Git以及Github的使用.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript基础.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript基础.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript高级篇.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript高级篇.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Mybatis-Plus.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Mybatis-Plus.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Sharding-JDBC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Sharding-JDBC.xmind -------------------------------------------------------------------------------- /博客xmind笔记/ssm企业权限管理系统项目.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/ssm企业权限管理系统项目.xmind -------------------------------------------------------------------------------- /博客xmind笔记/深入理解JVM-篇章3 .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/深入理解JVM-篇章3 .xmind -------------------------------------------------------------------------------- /博客xmind笔记/移动Web开发之响应式布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/移动Web开发之响应式布局.xmind -------------------------------------------------------------------------------- /博客markdown笔记/python/Python.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/python/Python.xmind -------------------------------------------------------------------------------- /博客markdown笔记/中间件/RabbitMQ.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/中间件/RabbitMQ.xmind -------------------------------------------------------------------------------- /博客markdown笔记/后端杂烩/JavaWeb.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/后端杂烩/JavaWeb.xmind -------------------------------------------------------------------------------- /博客markdown笔记/工具/Swagger 引言.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/工具/Swagger 引言.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Mybatis.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Mybatis.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/SSM整合方式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/SSM整合方式.xmind -------------------------------------------------------------------------------- /博客markdown笔记/计算机基础/计算机组成原理.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/计算机基础/计算机组成原理.xmind -------------------------------------------------------------------------------- /博客xmind笔记/SpringSecurity .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/SpringSecurity .xmind -------------------------------------------------------------------------------- /博客xmind笔记/移动WEB开发之rem适配布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/移动WEB开发之rem适配布局.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java基础/java8 新特性.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java基础/java8 新特性.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java基础/java基础篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java基础/java基础篇章1.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java基础/java基础篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java基础/java基础篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java并发/JUC并发编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java并发/JUC并发编程.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/TypeScript.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/TypeScript.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端框架/Bootstrap.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端框架/Bootstrap.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端框架/Element UI.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端框架/Element UI.xmind -------------------------------------------------------------------------------- /博客markdown笔记/开发指南/各种工具的安装与卸载.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/开发指南/各种工具的安装与卸载.xmind -------------------------------------------------------------------------------- /博客markdown笔记/数据库/Mysql高级及实战.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/数据库/Mysql高级及实战.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Spring Boot.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Spring Boot.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/SpringCloud.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/SpringCloud.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/SpringMVC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/SpringMVC.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Zookeeper.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Zookeeper.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/kubernetes .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/kubernetes .xmind -------------------------------------------------------------------------------- /博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章1.xmind -------------------------------------------------------------------------------- /博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章3.xmind -------------------------------------------------------------------------------- /博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章4.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章4.xmind -------------------------------------------------------------------------------- /博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章5.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/谷粒商城/从前慢-谷粒商城篇章5.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java并发/BIO、NIO、AIO.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java并发/BIO、NIO、AIO.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/Java数据结构和算法.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/Java数据结构和算法.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/Java设计模式篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/Java设计模式篇章1.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/Java设计模式篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/Java设计模式篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/深入理解JVM-篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/深入理解JVM-篇章1.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/深入理解JVM-篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/深入理解JVM-篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/中间件/Sharding-JDBC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/中间件/Sharding-JDBC.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/HTML5+CSS3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/HTML5+CSS3.xmind -------------------------------------------------------------------------------- /博客markdown笔记/工具/Git以及Github的使用.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/工具/Git以及Github的使用.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/ElasticSearch.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/ElasticSearch.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/Mybatis-Plus.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/Mybatis-Plus.xmind -------------------------------------------------------------------------------- /博客xmind笔记/移动WEB开发之百分比布局及flex布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/移动WEB开发之百分比布局及flex布局.xmind -------------------------------------------------------------------------------- /博客markdown笔记/Java进阶/深入理解JVM-篇章3 .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/Java进阶/深入理解JVM-篇章3 .xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript基础.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript基础.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript高级篇.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript高级篇.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/移动Web开发之响应式布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/移动Web开发之响应式布局.xmind -------------------------------------------------------------------------------- /博客markdown笔记/后端小项目/ssm企业权限管理系统项目.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/后端小项目/ssm企业权限管理系统项目.xmind -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/SpringSecurity .xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/服务框架/SpringSecurity .xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript之Web API-篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript之Web API-篇章1.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript之Web API-篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript之Web API-篇章2.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript之Web API-篇章3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript之Web API-篇章3.xmind -------------------------------------------------------------------------------- /博客xmind笔记/JavaScript之Web API-篇章4.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/JavaScript之Web API-篇章4.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/移动WEB开发之rem适配布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/移动WEB开发之rem适配布局.xmind -------------------------------------------------------------------------------- /博客xmind笔记/Node+Gulp+Promise+Express.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客xmind笔记/Node+Gulp+Promise+Express.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/移动WEB开发之百分比布局及flex布局.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/移动WEB开发之百分比布局及flex布局.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章1.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章1.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章2.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章2.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章3.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章3.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章4.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端三大剑客/JavaScript之Web API-篇章4.xmind -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/Node+Gulp+Promise+Express.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaBigWorld/unique_perfect_csdn/HEAD/博客markdown笔记/前端杂烩/Node+Gulp+Promise+Express.xmind -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # unique_perfect-csdn 2 | 3 | * 该仓库博客地址: 4 | * csdn:https://blog.csdn.net/unique_perfect 5 | * 个人博客:https://yxjcongqianman.com 6 | * 微信公众号:Java大世界 7 | 8 | ![微信公众号](https://img-blog.csdnimg.cn/a0cd593d72a1410e80a957f4c4c166e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAdW5pcXVlX3BlcmZlY3Q=,size_20,color_FFFFFF,t_70,g_se,x_16) 9 | 10 | 项目描述:该项目记录了博主的全部博客学习笔记。欢迎大家fork、star、watch一下。该项目长期维护 11 | 12 | ,伙伴们也可以及时收到通知。现在免费开源出去。希望大家一起学习呀。 13 | 14 | 整理博客学习笔记不易。赠人玫瑰,手有余香。有能力的支持博主一波。感谢你们的支持!!! 15 | 16 | **微信支付** 17 | 18 | ![微信支付](https://img-blog.csdnimg.cn/a4c18670123f4d72a2303e8e2eab6cc4.png) 19 | 20 | **支付宝支付** 21 | 22 | ![支付宝支付](https://img-blog.csdnimg.cn/27ce617c540b416aa9bdc0c183bfc300.png) 23 | 24 | -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/从前慢-SEO.md: -------------------------------------------------------------------------------- 1 | # SEO 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709231208294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 3 | 4 | ## 1 广告 5 | ```markdown 6 | 商家给相应公司钱,就有了广告,每点击一下,就会耗费商家的钱, 7 | 这里的广告也叫SEM 8 | ``` 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200602082552166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 10 | ## 2 百度快照 11 | ```markdown 12 | 符合SEO标准,被百度收录,显示百度快照。 13 | 这里的百度快照也叫SEO 14 | ``` 15 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200602082729787.png) 16 | ## 3 搜索引擎概述 17 | ```markdown 18 | 搜索引擎是指根据一定的策略、运用特定的计算机程序,从 19 | 互联网上搜集信息,在对信息进行组织和处理后,为用户 20 | 提供检索服务,将用户检索相关的信息展示给用户的系统。 21 | ``` 22 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613104708856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 23 | ## 4 SEO概述 24 | ```markdown 25 | SEO概述(Search Engine Optimization) 26 | 中文翻译成搜索引擎优化是指在了解搜索引擎自然排名机制的基础上, 27 | 对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的 28 | 自然排名,获得更多流量,吸引更多目标客户,从而达到网络营销及 29 | 品牌建设的目标。 30 | ``` 31 | ### 4.1 搜索引擎工作原理 32 | ```markdown 33 | "蜘蛛"程序通过搜集信息,并对信息进行组织和处理,最后 34 | 展示给用户,分为四个步骤:抓取-收录建库预处理-分析搜索内容 35 | -对结果排序 36 | ``` 37 | #### 4.1.1 抓取 38 | ```markdown 39 | 蜘蛛程序抓取网页 40 | ``` 41 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613111243515.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 42 | #### 4.1.2 收录建库预处理 43 | ```markdown 44 | 把抓取的网页放到网页数据库跟索引数据库.先把网页放到网页数据库 45 | 中,然后经过分析处理后在分门别类到不同的索引数据库中。 46 | ``` 47 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613111650177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 48 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613112503784.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 49 | #### 4.1.3 分析搜索内容 50 | ```markdown 51 | 分析用户所要搜索的内容,然后从索引数据库拿出来 52 | ``` 53 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613112816327.png) 54 | ```markdown 55 | 对结果排序 56 | 把从索引数据库中拿出来的网页经过一定的算法进行排序, 57 | 然后显示给用户 58 | ``` 59 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613113342285.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 60 | #### 4.1.4 搜索引擎收录 61 | ```markdown 62 | 网页被搜索引擎蜘蛛爬行并保存索引数据库,能被我们检索到时就 63 | 算网页被收录了。 64 | ``` 65 | ##### 4.1.4.1 收录查询 66 | ```markdown 67 | 使用site命令查询网站收录 68 | 命令格式:site:+站点域名 69 | ``` 70 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613114000587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 71 | ##### 4.1.4.2 搜索引擎营销策略 72 | ```markdown 73 | 短期营销-SEM竞价推广 74 | 长期发展-SEO优化 75 | 如果企业要求在近期内取得效果,并且是季节性短期营销, 76 | 建议使用SEM。 77 | 如果长期发展来说,SEO是比较合理的选择,提高自身网 78 | 站的竞争力才是网络营销的根本。 79 | 80 | SEM 81 | 优点 82 | 见效快 83 | 操作简单 84 | 范围广 85 | 86 | 缺点 87 | 高昂的价格 88 | 排名波动大 89 | 恶意点击 90 | 91 | SEO 92 | 优点 93 | 价格低廉 94 | 排名的相对稳定 95 | 无须担心恶意点击 96 | 97 | 缺点 98 | 见效慢 99 | 数量限制 100 | 排名永远在竞价排行之后 101 | ``` 102 | #### 4.1.5 站长工具 103 | ```markdown 104 | http://seo.chinaz.com/ 105 | https://www.aizhan.com 106 | ``` 107 | #### 4.1.6 搜索引擎官方平台工具 108 | ```markdown 109 | 如果你的网站没被搜索引擎收录,说明你网站的内容质量还 110 | 不够高。手动也可以提交到搜索引擎让其收录. 111 | ``` 112 | #### 4.1.7 关键词定义及分类 113 | ```markdown 114 | 关键词,就是输入搜索框中的文字,也就是命令搜索引擎寻 115 | 找的相关信息。 116 | 分为核心关键词、长尾关键词 117 | 118 | 核心关键词 119 | 指用以描述网站的核心内容、主要服务等方面特征的词汇。 120 | 网站的核心关键词代表一个网站的主题,可以是服务,也 121 | 可以是产品,或者产品+服务 122 | 123 | 长尾关键词 124 | 是指与目标关键词相关的任何有搜索量、有人关注的关键词。 125 | 126 | 127 | 核心词 128 | 白内障治疗、白内障手术 129 | 长尾词 130 | 白内障的早期症状、眼睛干涩是怎么回事?、白内障手术大概多少钱? 131 | ``` 132 | ##### 4.1.7.1 关键词的选取 133 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200616102118486.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 134 | ##### 4.1.7.2 关键词挖掘工具的使用 135 | ```markdown 136 | 百度推广-关键词规划师 137 | 站长工具、爱站关键词挖掘 138 | 百度指数 139 | ``` 140 | ##### 4.1.7.3 URL的修改 141 | ```markdown 142 | URL结构对于SE0很重要,URL长度层级尽量控制在3层内。 143 | ``` 144 | ##### 4.1.7.4 TDK 145 | ```markdown 146 | 标题 Title 147 | 网页标题 148 | SEO作用:突出本页面核心关键词,在页面内部优化工作中非常重要。 149 | title标签注意事项 150 | 字符限制建议控制在80字符内 151 | 应添加本页面核心关键词,不要超过5个 152 | 传智播客官网-好口碑IT培训机构,一样的教育,不一样的品质 153 | 154 | 155 | 描述 Description 156 | SEO作用:对核心关键词的重要补充,对目标关键词相关搜 157 | 索有排名辅助作用。 158 | description属性的注意事项 159 | 字符限制建议控制在200字符以内,并且description的内容 160 | 要包括title里面的内容 161 | 166 | 167 | 关键词 Keyword 168 | keywords网友访问是看不到的,通过査看源代码可以看到。 169 | 主要作用是告诉搜索引擎,这个网站内容是什么。因为, 170 | 好多站长在 keywords堆砌关键词,所以好多搜索引擎重视 171 | keywords降低了。建议大家还是认真填写 keywords,有的 172 | 搜索引擎还是很重视的。keywords-般不超过100个字符。 173 | 177 | ``` 178 | ##### 4.1.7.5 SEO站内优化 179 | ```markdown 180 | 布局:以F型布局 181 | 关键词密度( Keyword Density)与关键词频 182 | 率( Keyword Frequency)所阐述的实质上是 183 | 同一个概念,用来量度关键词在网页上出现的 184 | 总次数与其他文字的比例,一般用百分比表示。 185 | 相对于页面总字数而言,关键词出现的频率越高, 186 | 关键词密度也就越大。 187 | 188 | 查询平台:http://tooikchinaz.com/tools/DenSity.aspx 189 | 对于搜索引擎来说,一个页面上的关键字密度最好在2%-8%之间 190 | 太少了起不到优化的效果,太多了会被搜索引擎认为是堆砌关键 191 | 字,被当做作弊进行处罚 192 | ``` 193 | ##### 4.1.7.6 网站内部结构优化 194 | ```markdown 195 | 一般原则 196 | 用户在进行3次点击,可以到达网站的任何页面 197 | 搜索引擎抓取3级,抓取到网站的所有页面 198 | 网页收录的容易与否取决于该网页离主页有 199 | 几次点击,而不是它的物理位置 200 | ``` 201 | ##### 4.1.7.7 内链优化与页面优化 202 | ```markdown 203 | 内链:就是在同一网站域名下的内容页面之间的互相链接。 204 | 页面优化 205 | 从连接上可以实现整个网站的有效衔接,进而 206 | 实现用户体验和搜索引擎优化; 207 | 从文章质量上,可以有效的提高文章的用户体 208 | 验度,进而提高用户粘度。 209 | 210 | 内页关键词优化四处一词 211 | 简单而言,就是某个网页关键词的布局,网站优化人员对关 212 | 键词在页面四个方面的铺设。分别为:标题 title 关键 213 | 词 keywords和描述description 214 | 内容(头部底部、正文)锚文本(超链接) 215 | ``` 216 | ###### 4.1.7.7.1 h标签 217 | ```markdown 218 | 标签SEO作用 219 |

和(h2>标签能很好的突出显示页面重要标题(标题含关键词) 220 | 有助于关键词的排名提升 221 | 注:标签是网站中表示着重强调的最重要的标签之一 222 | 223 | 标签使用注意事项 224 | 为了突出目标关键词,在使用h标签时应该注意 225 |

标签和

标签,不建议同时使用 226 |

标签和

标签在使用的时候建议包含关键词 227 |

标签和

标签在使用的时候建议只出现一次 228 | 标签SEO作用较小,建议不要乱用 229 | 标签注意事项 235 | 页面内不要有大量的加粗文字 236 | 页面内非关键词文本少用此标签 237 | 一般网站标题都需要用此标签 238 | 常用来标注文章小标题 239 | ``` 240 | ###### 4.1.7.7.3 img标签 241 | ```markdown 242 | 图片标签中的alt属性优化 243 | 让百度更好的识别图片信息,从而使图片有收录和排名。 244 | 可以用来调整关键词的密度,用来保持关键词密度在2%-8% 245 | 注意事项 246 | alt描述要和图片内容相符 247 | alt描述控制在100字符内极限 248 | ``` 249 | ###### 4.1.7.7.4 301重定向 250 | ```markdown 251 | 页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。 252 | ``` 253 | ###### 4.1.7.7.5 404页面 254 | ```markdown 255 | 404页面是网站必备的一个页面,它承载着用户体验与SE0优化的重任。 256 | 404页面通常为用户访问了网站上不存在或已删除的页面,服务器返 257 | 回的404错误。如果站长没有设置404页面,会出现死链接,蜘蛛爬 258 | 行这类网址时,不利于搜索引擎收录。 259 | ``` 260 | ###### 4.1.7.7.6 外部链接的概念 261 | ```markdown 262 | 外部链接又叫“反向链接”或“导入链接”,是指其他网站的链接指向 263 | 你的网站。 264 | 外部链接包括:单向外链和双向外链(友情链接) 265 | 外部链接形式有关键词链接、图片链接、直接链接,建议使用关键 266 | 词链接。 267 | 268 | 外部链接的作用 269 | 增加网站的权重 270 | 提高网站关键词排名 271 | 提高网站流量 272 | ``` 273 | ###### 4.1.7.7.7 查询外链 274 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200617222905659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 275 | ###### 4.1.7.7.8 链轮 276 | ```markdown 277 | SEO链轮是指通过在互联网上建立大量的独立站点或是在各大门户网站 278 | 上开设博客,这些独立站点或是博客群通过单向的、有策略、有计划紧 279 | 密的链接,并都指向要优化的目标网站,以达到提升目标网站在搜索引 280 | 擎结果中的排名。 281 | ``` 282 | ```markdown 283 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 284 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 285 | seo即可获取笔记获取方式。 286 | ``` 287 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 288 | -------------------------------------------------------------------------------- /博客markdown笔记/前端杂烩/从前慢-Axios.md: -------------------------------------------------------------------------------- 1 | # Axios 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071221563926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 Axios的引言 5 | 6 | ```markdown 7 | # axios的引言 8 | Axios 是一个 异步请求 技术 9 | 10 | # 异步请求 11 | 基于XMLHttpRequest对象发起的请求都是异步请求 12 | 13 | # 异步请求特点 14 | 请求之后页面不动,响应回来更新的是页面的局部, 15 | 多个请求之间互不影响,并行执行 16 | ajax确实用来发送异步请求,ajax过气 17 | 系统架构 前后端分离架构系统 ---- 异步请求技术 -----> Vue 全家桶系列 前端技术端 Vue 淘汰了jQuery 18 | ``` 19 | 20 | ## 2 Axios基本入门 21 | 22 | ### 2.1 下载Axios 23 | ```markdown 24 | 下载地址: https://unpkg.com/axios/dist/axios.min.js 25 | ``` 26 | 27 | 28 | ### 2.2 Axios的案例 29 | #### 2.2.1 GET方式请求 30 | 31 | ```html 32 | 33 | 34 | 46 | ``` 47 | 48 | #### 2.2.2 POST方式的请求 49 | 50 | ```html 51 | 52 | 53 | 61 | ``` 62 | 63 | ```markdown 64 | # 总结 65 | 1. axios在发送post方式的请求时传递的参数如果为对 66 | 象类型,axios会自动将对象转为json格式的字符串使用 67 | application/json的请求头向后端服务接口传递参数 68 | 69 | 70 | 71 | 2. axios的post请求传递参数的两种方式: 72 | 第一种使用字符串进行参数传递: "name=zhangsan&age=23" 73 | 这种形式 74 | 第二种方式后端接口直接使用@RequestBody注解形式接收参数: 75 | 3. 发送get跟post时,发送参数名称要跟接受参数名称 76 | 保持一致(如果是对象的话,则跟对象属性的名称保持一致) 77 | ``` 78 | 79 | 80 | ## 3 Axios的并发请求 81 | ```markdown 82 | 并发请求: 在同一时间发送多个不同的请求到后端 83 | 服务,最后同一处理不同服务的响应结果 84 | ``` 85 | 86 | ```javascript 87 | 88 | 89 | 105 | ``` 106 | 107 | ```markdown 108 | # 总结 109 | 1.针对于并发请求需要用到axios.all()函数来完成并发请求的处理 110 | 2.针对于并发请求的结果汇总需要使用axios.spread()函数来统一 111 | 汇总请求结果 112 | ``` 113 | ## 4 Axios的Restful风格的API 114 | 115 | ```js 116 | # Axios的API总结 117 | axios.request(config) 118 | axios.get(url[, config]) 119 | axios.delete(url[, config]) 120 | axios.head(url[, config]) 121 | axios.post(url[, data[, config]]) 122 | axios.put(url[, data[, config]]) 123 | axios.patch(url[, data[, config]]) 124 | 125 | NOTE: 126 | 在使用别名方法时, url、method、data 这些属 127 | 性都不必在配置中指定。 128 | ``` 129 | 130 | ## 5 Axios的高级使用配置对象 131 | 132 | ### 5.1 配置对象 133 | 134 | ```json 135 | { 136 | // `url` 是用于请求的服务器 URL 137 | url: '/user', 138 | 139 | // `method` 是创建请求时使用的方法 140 | method: 'get', // 默认是 get 141 | 142 | // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。 143 | // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL 144 | baseURL: 'htt ps://some-domain.com/api/', 145 | 146 | // `transformRequest` 允许在向服务器发送前,修改请求数据 147 | // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法 148 | // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream 149 | transformRequest: [function (data) { 150 | // 对 data 进行任意转换处理 151 | 152 | return data; 153 | }], 154 | 155 | // `transformResponse` 在传递给 then/catch 前,允许修改响应数据 156 | transformResponse: [function (data) { 157 | // 对 data 进行任意转换处理 158 | 159 | return data; 160 | }], 161 | 162 | // `headers` 是即将被发送的自定义请求头 163 | headers: {'X-Requested-With': 'XMLHttpRequest'}, 164 | 165 | // `params` 是即将与请求一起发送的 URL 参数 166 | // 必须是一个无格式对象(plain object)或 URLSearchParams 对象 167 | params: { 168 | ID: 12345 169 | }, 170 | 171 | // `paramsSerializer` 是一个负责 `params` 序列化的函数 172 | // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) 173 | paramsSerializer: function(params) { 174 | return Qs.stringify(params, {arrayFormat: 'brackets'}) 175 | }, 176 | 177 | // `data` 是作为请求主体被发送的数据 178 | // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH' 179 | // 在没有设置 `transformRequest` 时,必须是以下类型之一: 180 | // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams 181 | // - 浏览器专属:FormData, File, Blob 182 | // - Node 专属: Stream 183 | data: { 184 | firstName: 'Fred' 185 | }, 186 | 187 | // `timeout` 指定请求超时的毫秒数(0 表示无超时时间) 188 | // 如果请求话费了超过 `timeout` 的时间,请求将被中断 189 | timeout: 1000, 190 | 191 | // `withCredentials` 表示跨域请求时是否需要使用凭证 192 | withCredentials: false, // 默认的 193 | 194 | // `adapter` 允许自定义处理请求,以使测试更轻松 195 | // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)). 196 | adapter: function (config) { 197 | /* ... */ 198 | }, 199 | 200 | // `auth` 表示应该使用 HTTP 基础验证,并提供凭据 201 | // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头 202 | auth: { 203 | username: 'janedoe', 204 | password: 's00pers3cret' 205 | }, 206 | 207 | // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' 208 | responseType: 'json', // 默认的 209 | 210 | // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称 211 | xsrfCookieName: 'XSRF-TOKEN', // default 212 | 213 | // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称 214 | xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的 215 | 216 | // `onUploadProgress` 允许为上传处理进度事件 217 | onUploadProgress: function (progressEvent) { 218 | // 对原生进度事件的处理 219 | }, 220 | 221 | // `onDownloadProgress` 允许为下载处理进度事件 222 | onDownloadProgress: function (progressEvent) { 223 | // 对原生进度事件的处理 224 | }, 225 | 226 | // `maxContentLength` 定义允许的响应内容的最大尺寸 227 | maxContentLength: 2000, 228 | 229 | // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte 230 | validateStatus: function (status) { 231 | return status >= 200 && status < 300; // 默认的 232 | }, 233 | 234 | // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目 235 | // 如果设置为0,将不会 follow 任何重定向 236 | maxRedirects: 5, // 默认的 237 | 238 | // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项: 239 | // `keepAlive` 默认没有启用 240 | httpAgent: new http.Agent({ keepAlive: true }), 241 | httpsAgent: new https.Agent({ keepAlive: true }), 242 | 243 | // 'proxy' 定义代理服务器的主机名称和端口 244 | // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据 245 | // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。 246 | proxy: { 247 | host: '127.0.0.1', 248 | port: 9000, 249 | auth: : { 250 | username: 'mikeymike', 251 | password: 'rapunz3l' 252 | } 253 | }, 254 | 255 | // `cancelToken` 指定用于取消请求的 cancel token 256 | // (查看后面的 Cancellation 这节了解更多) 257 | cancelToken: new CancelToken(function (cancel) { 258 | }) 259 | } 260 | ``` 261 | 262 | ### 5.2 使用配置对象形式发送请求 263 | 264 | ```js 265 | var instance = axios.create({ 266 | method:"GET", 267 | baseURL:"http://localhost:8888", 268 | data:{ //作为请求体发送的数据,只适用于这些请求方法 'PUT', 'POST', 和 'PATCH' 269 | 270 | } 271 | }); 272 | 273 | instance.get("/axios/findAll?username=zhangsan"); 274 | ``` 275 | ## 6 在脚手架中使用axios 276 | 277 | ### 6.1 安装axios 278 | 279 | ```js 280 | # 1.安装axios 281 | npm install axios --save-dev 282 | 283 | # 2.配置main.js中引入axios 284 | import axios from 'axios'; 285 | 286 | Vue.prototype.$http=axios; 287 | 288 | # 3.使用axios 289 | 在需要发送异步请求的位置:this.$http.get("url").then((res)=>{}) this.$http.post("url").then((res)=>{}) 290 | ``` 291 | ```markdown 292 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 293 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 294 | Axios即可获取笔记获取方式。 295 | ``` 296 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 297 | -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/从前慢-移动WEB开发之rem适配布局.md: -------------------------------------------------------------------------------- 1 | # 移动WEB开发之rem适配布局 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210714020211196.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1.1 rem 基础 5 | ```markdown 6 | rem (root em)是一个相对单位,类似于em,em是父元素字体大小。 7 | 8 | 不同的是rem的基准是相对于html元素的字体大 9 | ``` 10 | ```html 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Document 19 | 42 | 43 | 44 | 45 |
46 |

47 |
48 | 49 | 50 | 51 | 52 | ``` 53 | ## 1.2 媒体查询 54 | ```markdown 55 | 媒体查询(Media Query)是CSS3新语法。 56 | 使用 @media查询,可以针对不同的媒体类型定义不同的样式 57 | @media 可以针对不同的屏幕尺寸设置不同的样式 58 | 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和 59 | 高度重新渲染页面 60 | 目前针对很多苹果手机、Android手机,平板等设备都用得到 61 | 多媒体查询 62 | ``` 63 | ```css 64 | @media mediatype and|not|only (media feature) { 65 | CSS-Code; 66 | } 67 | ``` 68 | 69 | ```html 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Document 78 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | ``` 103 | ## 1.3 mediatype 查询类型 104 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509134258592.png) 105 | ## 1.4 关键字 106 | ```markdown 107 | 关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件。 108 | 109 | and:可以将多个媒体特性连接到一起,相当于“且”的意思。 110 | not:排除某个媒体类型,相当于“非”的意思,可以省略。 111 | only:指定某个特定的媒体类型,可以省略. 112 | 113 | ``` 114 | ## 1.5 媒体特性 115 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509134644344.png) 116 | ## 1.6 媒体查询案例修改背景颜色 117 | ```html 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | Document 126 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | ``` 165 | ## 1.7 媒体查询+rem实现元素动态变化 166 | ```html 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | Document 175 | 206 | 207 | 208 | 209 |
购物车
210 | 211 | 212 | 213 | ``` 214 | ## 1.8 引入资源 215 | ```html 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | Document 224 | 230 | 231 | 232 | 233 | 234 | 235 |
1
236 |
2
237 | 238 | 239 | 240 | ``` 241 | ## 1.9 less 基础 242 | ```markdown 243 | Less中文网址:http://lesscss.cn/ 244 | 需要安装node.js再安装less 245 | npm install -g less 246 | ``` 247 | ### 1.9.1 变量 248 | ```markdown 249 | 必须有@为前缀 250 | 不能包含特殊字符 251 | 不能以数字开头 252 | 大小写敏感 253 | ``` 254 | ```css 255 | // 定义一个粉色的变量 256 | @color: pink; 257 | // 错误的变量名 @1color @color~@# 258 | // 变量名区分大小写 @color 和 @Color 是两个不同的变量 259 | // 定义了一个 字体为14像素的变量 260 | @font14: 14px; 261 | body { 262 | background-color: @color; 263 | } 264 | div { 265 | color: @color; 266 | font-size: @font14; 267 | } 268 | a { 269 | font-size: @font14; 270 | } 271 | 272 | ``` 273 | ### 1.9.2 Less 嵌套 274 | ```css 275 | .header { 276 | width: 200px; 277 | height: 200px; 278 | background-color: pink; 279 | // 1. less嵌套 子元素的样式直接写到父元素里面就好了 280 | a { 281 | color: red; 282 | // 2. 如果有伪类、交集选择器、 伪元素选择器 我们内层选择器的前面需要加& 283 | &:hover { 284 | color: blue; 285 | } 286 | } 287 | } 288 | .nav { 289 | .logo { 290 | color: green; 291 | } 292 | &::before { 293 | content: ""; 294 | } 295 | } 296 | ``` 297 | ### 1.9.3 Less 运算 298 | ```markdown 299 | 任何数字、颜色或者变量都可以参与运算。就是Less提供 300 | 了加(+)、减(-)、乘(*)、除(/)算术运算。 301 | ``` 302 | ```css 303 | @baseFont: 50px; 304 | html { 305 | font-size: @baseFont; 306 | } 307 | @border: 5px + 5; 308 | div { 309 | width: 200px - 50; 310 | height: (200px + 50px ) * 2; 311 | border: @border solid red; 312 | background-color: #666 - #222; 313 | } 314 | img { 315 | width: 82rem / @baseFont; 316 | height: 82rem / @baseFont; 317 | } 318 | // 1. 我们运算符的左右两侧必须敲一个空格隔开 319 | // 2. 两个数参与运算 如果只有一个数有单位,则最后的结果就以这个单位为准 320 | // 3. 两个数参与运算,如果2个数都有单位,而且不一样的单位 最后的结果以第一个单位为准 321 | 322 | ``` 323 | ## 1.10 rem适配方案 324 | ```markdown 325 | 1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时 326 | 候,等比例适配当前设备。 327 | 328 | 2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页 329 | 面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发 330 | 生变化,从而达到等比缩放的适配。 331 | ``` 332 | ### 1.10.1 rem 适配方案1 333 | ```markdown 334 | 1.less+rem+媒体查询 335 | 336 | 2.flexible.js+rem 337 | github地址:[https://github.com/amfe/lib-flexible] 338 | ``` 339 | ### 1.10.2 rem实际开发适配方案 340 | ```markdown 341 | 1 假设设计稿是750px 342 | 343 | 2 假设我们把整个屏幕划分为15等份(划分标准不一可以是20份也 344 | 可以是10等份) 345 | 346 | 3 每一份作为html字体大小,这里就是50px 347 | 348 | 4 那么在320px设备的时候,字体大小为320/15就是 21.33px 349 | 350 | 5 用我们页面元素的大小除以不同的 html字体大小会发现他们比例 351 | 还是相同的 352 | 353 | 6 比如我们以750为标准设计稿 354 | 355 | 7 一个100*100像素的页面元素在 750屏幕下, 356 | 就是 100/ 50 转换为rem 是 2rem*2rem 比例是1比1 357 | 358 | 8 320屏幕下, html字体大小为21.33 359 | 则 2rem= 42.66px 此时宽和高都是 42.66 360 | 但是宽和高的比例还是 1比1 361 | 362 | 9 但是已经能实现不同屏幕下 页面元素盒子等比例缩放的效果 363 | ``` 364 | ### 1.10.3 总结 365 | ```markdown 366 | 1 最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数) 367 | 368 | 2 屏幕宽度/划分的份数就是 html:font-size 的大小 369 | 370 | 3 或者:页面元素的rem值 = 页面元素值(px) / html: font-size 字体大小 371 | ``` 372 | ### 1.10.4 rem 适配方案2 373 | ```markdown 374 | 手机淘宝团队出的简洁高效 移动端适配库 375 | 376 | 我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理 377 | 378 | 它的原理是把当前设备划分为10等份,但是不同设备下,比 379 | 例还是一致的。 380 | 381 | 我们要做的,就是确定好我们当前设备的html 文字大小就可以了 382 | 比如当前设计稿是 750px, 那么我们只需要把 html 文字大小设置 383 | 为 75px(750px / 10) 就可以 384 | 里面页面元素rem值: 页面元素的px 值 / 75 385 | 剩余的,让flexible.js来去算 386 | ``` 387 | ```markdown 388 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 389 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 390 | rem即可获取笔记获取方式。 391 | ``` 392 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 393 | -------------------------------------------------------------------------------- /博客markdown笔记/工具/从前慢-git以及github的使用.md: -------------------------------------------------------------------------------- 1 | # Git以及Github的使用 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210712230107555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1.1 Git 5 | ```markdown 6 | Git是一个版本管理控制系统(缩写VCS),它可以在任何时间点, 7 | 将文档的状态作为更新记录保存起来,也可以在任何时间点, 8 | 将更新记录恢复回来。 9 | ``` 10 | ## 1.2 查看Git的版本 11 | ```markdown 12 | git --verson 13 | ``` 14 | ## 1.3 Git 基本工作流程 15 | 16 | | git仓库 | 暂存区 | 工作目录 | 17 | | ---------------- | ------------------ | ------------------- | 18 | | 用于存放提交记录 | 临时存放被修改文件 | 被Git管理的项目目录 | 19 | ## 1.4 Git 使用前配置 20 | ```markdown 21 | 在使用 git 前,需要告诉 git 你是谁,在向 git 仓库中提 22 | 交时需要用到。 23 | ``` 24 | ```markdown 25 | 1. 配置提交人姓名:git config --global user.name “提交人姓名” # (对当前系统用户有效) 26 | 2. 配置提交人姓名:git config --global user.email “提交人邮箱” # (对当前系统用户有效) 27 | 作用:识别开发人员,与登良github的账户无关 28 | 3. 查看git配置信息:git config --list 29 | 30 | 注意 31 | 1.如果要对配置信息进行修改,重复上述命令即可。 32 | 2. 配置只需要执行一次。 33 | ``` 34 | 35 | ## 1.5 常用提交步骤 36 | ```markdown 37 | 1 git init # 初始化git仓库 38 | 39 | 2 git status # 查看文件状态 40 | 41 | 3 git add 文件列表 # 追踪文件 42 | 43 | 4 git commit -m “提交信息” # 向仓库中提交代码(全部文件) 44 | vs: git commit -m "提交信息" 文件 # 提交某个文件 45 | 46 | 5 git log # 显示所有提交记录 47 | vs: git log --pretty=oneline # 一行显示版本信息 48 | 补充: 49 | git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac # 会显示所有关于这个id以及之前的修改记录 50 | git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac -1 # 加上-1参数表示我们只想看到一行记录 51 | 而如果想要查看这条提交记录具体修改了什么内容,可以在命令中加入p参数,命令如下: 52 | git log Ifa380b502a00b82bfc8d84c5ab5el5b8fbf7dac -1 -p 53 | 54 | 6 git reset --hard 版本id # 回退版本 55 | 56 | 7 git reflog # 查看所有版本信息 57 | 58 | 8 git diff # 表示未使用add命令时的修改 59 | 60 | 这样可以查看到所有文件的更改内容, 61 | 如果你只想查看MainActivity.java这个文件的更改内容, 62 | 可以使用如下命令: 63 | git diff app/src/main/java/com/example/providertest/MainActivity.java 64 | 65 | vs:git log 表示最近的改变,git reflog可以看到所有的改变 66 | 如果文件未被跟踪,即没有使用git add这个命令时,文 67 | 件为红色,如果使用这个命令,则文件变为绿色. 68 | ``` 69 | ```bash 70 | Administrator@E3J6CI1HV76DS4U MINGW32 /d/360MoveData/Users/Administrator/Desktop/test 71 | $ git init 72 | Initialized empty Git repository in D:/360MoveData/Users/Administrator/Desktop/test/.git/ 73 | 74 | Administrator@E3J6CI1HV76DS4U MINGW32 /d/360MoveData/Users/Administrator/Desktop/test (master) 75 | $ git status 76 | On branch master 77 | 78 | No commits yet 79 | 80 | Untracked files: 81 | (use "git add ..." to include in what will be committed) 82 | 83 | index.html 84 | 85 | nothing added to commit but untracked files present (use "git add" to track) 86 | 87 | Administrator@E3J6CI1HV76DS4U MINGW32 /d/360MoveData/Users/Administrator/Desktop/test (master) 88 | $ git add index.html 89 | 90 | Administrator@E3J6CI1HV76DS4U MINGW32 /d/360MoveData/Users/Administrator/Desktop/test (master) 91 | $ git status 92 | On branch master 93 | 94 | No commits yet 95 | 96 | Changes to be committed: 97 | (use "git rm --cached ..." to unstage) 98 | 99 | new file: index.html 100 | 101 | 102 | Administrator@E3J6CI1HV76DS4U MINGW32 /d/360MoveData/Users/Administrator/Desktop/test (master) 103 | $ git commit -m 第一次提交 104 | [master (root-commit) 23db606] 第一次提交 105 | 1 file changed, 0 insertions(+), 0 deletions(-) 106 | create mode 100644 index.html 107 | 108 | ``` 109 | ## 1.6 撤销 110 | ```markdown 111 | 1 git checkout 文件 112 | 不过这种撤销方式只适用于那些还没有执行过add命令 113 | 的文件,如果某个文件已经被添加过了,这种方式就无 114 | 法撤销其更改的内容. 115 | 这种情况我们应该先对其取消添加,然后才可以撤回提交。 116 | 取消添加使用的是reset命令,用法如下所示: 117 | git reset HEAD app/src/main/java/com/example/providertest/MainActivity.java 118 | 然后再运行一遍git status命令,你就会发现MainActivity.java这个文件重新变回了未添加状态,此时就可以使用checkout命令来将修改的内容进行撤销了。 119 | 120 | 2 用暂存区中的文件覆盖工作目录中的文件: git checkout 文件 121 | 应用场景:如果开发过程中不满意当前的内容,想要后悔药,那么可以 122 | 使用这个命令从暂存区取相应的文件来恢复,使用后文件的状态依然 123 | 为绿色. 124 | 125 | 3 将文件从暂存区中删除: git rm --cached 文件 126 | 应用场景:开发过程中,不是每个文件都是有必要交给git管 127 | 理的,使用这个命令可以从暂存区删除没用的文件,不交 128 | 给git管理,此时文件在工作目录依然存在,只是没在 129 | 暂存区而已. 130 | 131 | 4 将 git 仓库中指定的更新记录恢复出来,并且覆盖暂存区和工 132 | 作目录:git reset --hard commitID 133 | 应用场景:开发过程中,如果想要利用某次记录覆盖暂存区和工 134 | 作目录,则可以使用 上面那个命令. 135 | ``` 136 | ## 1.7 Git进阶 137 | ### 1.7.1 分支 138 | ```markdown 139 | 为了便于理解,大家暂时可以认为分支就是当前工作目 140 | 录中代码的一份副本。 141 | 使用分支,可以让我们从开发主线上分离 142 | 出来,以免影响开发主线。 143 | ``` 144 | ### 1.7.2 分支细分 145 | ```markdown 146 | 主分支(master):第一次向 git 仓库中提交更新记录时自动 147 | 产生的一个分支。 148 | 开发分支(develop):作为开发的分支,基于 master 分支创建。 149 | 功能分支(feature):作为开发具体功能的分支,基于开发分支创建 150 | 功能分支 -> 开发分支 -> 主分支 151 | 解析:实际开发中,主分支一般来发布源码之类,要保持稳定,所以 152 | 就出现了开发分支,当开发分支弄好后在合并到主分支. 153 | 功能分支是作为开发具体功能的分支,为了保持开发分支 154 | 的稳定,当功能分支弄好后在合并到开发分支.所以路线就是 155 | 功能分支 -> 开发分支 -> 主分支 156 | ``` 157 | ### 1.7.3 分支命令 158 | ```markdown 159 | git branch # 查看分支 160 | 161 | git branch 分支名称 # 创建分支 162 | 163 | git checkout 分支名称 # 切换分支 164 | 注意:在切换分支的时候一定要保证当前的内容处于提 165 | 交状态,即有使用git commit这个命令,否则切换到其 166 | 他分支的时候会把切换前的分支内容带过去,这不是我们想要的 167 | 168 | git merge 来源分支 # 合并分支 169 | 170 | git branch -d 分支名称` # 删除分支(分支被合并后才允许删除)(-D 强制删除) 171 | 注意:如果某分支没有合并,则该分支不可以直接被删除,解决办法就是把小d改为大D即可。 172 | ``` 173 | ### 1.7.4 暂时保存更改 174 | ```markdown 175 | 在git中,可以暂时提取分支上所有的改动并存储,让开发人 176 | 员得到一个干净的工作副本,临时转向其他工作。 177 | 使用场景:分支临时切换 178 | 存储临时改动:git stash 179 | 恢复改动:git stash pop 180 | ``` 181 | ```markdown 182 | 应用场景(分支临时切换);开发过程中,如果老板说 183 | 以前的内容存在bug,那么你得切换分支去修改, 184 | 但你当前的分支尚未完成,不想提交上去.即不要 185 | git commit这个命令的需求,但是又不想把切换前 186 | 的分支内容带过去,此时可以利用git stash(存储 187 | 临时改动)这个命令,这个命令的作用就是把你当 188 | 前分支的内容剪切到剪贴板上,然后就可以切换 189 | 分支了,虽然没有git commit这个命令,但状态已 190 | 处于工作清空状态(即暂存区跟工作目录没有内容了)。 191 | 当处理好bug之后切换到原来的分支,使用 192 | git stash pop(恢复改动)这个命令从剪贴板复制过 193 | 来,此时又恢复之前的状态了。 194 | ``` 195 | ## 1.8 github 196 | ```markdown 197 | 在版本控制系统中,大约90%的操作都是在本地 198 | 仓库中进行的:暂存,提交,查看状态或者历史 199 | 记录等等。除此之外,如果仅仅只有你一个人在 200 | 这个项目里工作,你永远没有机会需要设置一个远程仓库。 201 | 202 | 只有当你需要和你的开发团队共享数据时,设置一 203 | 个远程仓库才有意义。你可以把它想象成一个 204 | “文件管理服务器”,利用这个服务器可以与开发 205 | 团队的其他成员进行数据交换。 206 | ``` 207 | ### 1.8.1 github解释名词 208 | ```markdown 209 | 仓库(Repository) 210 | 有多少个开源项目,就有多少个仓库 211 | 212 | 收藏(Star) 213 | 即收藏人数 214 | 215 | fork(克隆) 216 | 复制项目到自己的仓库 217 | 218 | pull request 219 | 请求把改变的内容更改到被克隆的那个远程仓库中 220 | 221 | watch(关注) 222 | 通知你关注项目的改变 223 | 224 | issue(事务卡片) 225 | 发现bug,把bug通知上去,讨论协商 226 | ``` 227 | ### 1.8.2 多人协作开发流程 228 | ```markdown 229 | 同队开发 230 | 一开始: 231 | ``` 232 | 233 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200518162037633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 234 | ```markdown 235 | A在自己的计算机中创建本地仓库 236 | A在github中创建远程仓库 237 | A将本地仓库推送到远程仓库 238 | B克隆远程仓库到本地进行开发 239 | B将本地仓库中开发的内容推送到远程仓库 240 | A将远程仓库中的最新内容拉去到本地 241 | ``` 242 | ```markdown 243 | 后来: 244 | ``` 245 | 246 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020051816225761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 247 | 跨团队开发 248 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200313083955847.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 249 | #### 1.8.2.1 合作流程 250 | ```markdown 251 | 同队开发 252 | 1.首先A方创建远程仓库,将本地仓库推送到远程仓库 253 | (我们本地仓库的版本必须大于远程仓库的版本,否则push失败。), 254 | 采用git push 远程仓库地址 分支名称。 255 | git push https://github.com/yxjgithub-png/git-demo.git master # 将master分支推送到远程仓库。但是这里地址麻烦,可以采用步骤2添加别名 256 | 257 | 2. git remote add 远程仓库地址别名(可以自定义,一般为origin) 远程仓库地址 # (查看当前远程地址的别名 258 | git remote -v ) 259 | git remote add origin https://github.com/yxjgithub-png/git-demo.git # 如果不想使用地址形式,可以采用别名来代替。如果想直接使用git push,则可以采用步骤3 260 | 261 | 3. git push -u 远程仓库地址别名 分支名称 262 | git push origin master # 推送远程分支 263 | git push -u origin master # -u 记住推送地址及分支,下次推送只需要输入git push即可.B方想加入团队进行开发,则需要步骤4. 264 | 解析:第一次输入需要用户名和密码,以后不用,window系统会帮助我们记住用户名和密码,在那个控制面板的凭据管理器中。 265 | 266 | 4.git clone 仓库地址 267 | git clone 远程仓库地。B方想推送自己修改的内容,则需要步骤5 268 | 效果:1.下载内容到本地 2.克隆别人远程仓库的别名 3.初始化仓库 269 | 270 | 当我们需要clone后想把内容推送到别人的远程仓库时,不可以直接推送,而是需要别人在相应的远程仓库的settings里面操作,填写邀请队友的账号。当我们用git clone的时候,不仅将对方的东西复制过来,而且连对方远程仓库的别名也复制过来。 271 | 5. git push 远程仓库地址 推送的分支 272 | git push origin master # B方想把内容推送给A方,然后A方可以采用步骤6进行版本的更新 273 | 274 | git push <远程主机名> <本地分支名>:<远程分支名> 275 | 注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。 276 | 277 | 278 | 6.git pull 279 | 拉取远程仓库中最新的版本:git pull 远程仓库地址 远程地址分支名称 280 | git pull origin master # 拉取origin主机的master分支,与本地当前分支合并 281 | 282 | 比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样 git pull origin next:master 283 | 如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:git pull origin next 284 | 285 | 286 | git clone 跟 git pull的区别 287 | git clone是在没有本地仓库的基础上clone别人的东西,而git pull则是在有本地仓库的基础上拉取代码到本地。git clone 288 | 只是第一次参与开发时用,以后都是用git pull命令 289 | 290 | 解决冲突 291 | 在多人同时开发一个项目时,如果两个人修改了同一个文件的同一个地方,就会发生冲突。冲突需要人为解决。 292 | 先把远程仓库pull下来,然后删除冲突的标记,再做相应的修改即可。然后git add,git commit,git push上去。 293 | 294 | 跨团队协作 295 | 1. 程序员 C fork仓库:把对方远程仓库的内容复制到自己的远程仓库 296 | 2. 程序员 C 将远程仓库克隆在本地进行修改 297 | 3. 程序员 C 将仓库推送到自己的远程仓库 298 | 4. 程序员 C如果想要把修改内容发给对方,则需要点击pull request命令 299 | 5. 然后等待原远程仓库作者审核 300 | 6. 原远程仓库作者合并代码即可 301 | ``` 302 | ### 1.8.3 ssh免登陆 303 | ```markdown 304 | 生成秘钥:ssh-keygen 305 | 秘钥存储目录:C:\Users\用户\\.ssh 306 | 公钥名称:id_rsa.pub 307 | 私钥名称:id_rsa 308 | 解析:使用ssh-keygen命令,然后生成秘钥,私钥 309 | 保存在自己的电脑中,公钥发布在自己的远程仓库 310 | 中(在settings中找到设置ssh的地方,将公钥的 311 | 内容复制到那里),然后复制相应仓库的ssh地址, 312 | 然后正常操作就可以实现免密码登录。 313 | ``` 314 | ### 1.8.4 GIT忽略清单 315 | ```markdown 316 | 将不需要被git管理的文件名字添加到.gitignore中, 317 | 在执行git命令的时候,git就会忽略这些文件。 318 | 将工作目录中的文件全部添加到暂存区:git add . 319 | ``` 320 | ### 1.8.5 bug 321 | ~~~markdown 322 | idea提交项目到github 323 | 提交到远程库错误:Push to origin/master was rejected 324 | 解决方案:git pull origin(远程仓库的地址) master --allow-unrelated-histories 325 | ~~~ 326 | ### 1.8.6 Github搜索技巧 327 | ```markdown 328 | in:name Vue # 搜索项目名包含Vue的项目 329 | in:name Vue stars:>5000 # 搜索Vue项目的star数大于5000 330 | in:name Vue stars:>5000 forks:>5000 # 搜索Vue项目的star数大于5000 并且 forks:>5000 331 | in:readme Vue # 搜索README.md里面包含Vue的项目 332 | in:descrition Vue # 搜索项目描述包含Vue的项目 333 | language:java # 搜索语言为java的项目 334 | pushed:>2020-01-02 # 搜索项目最后更新时间大于2020-01-02的项目 335 | ``` 336 | 337 | ## 1.9 图片总结 338 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217100241959.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 339 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217100301167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 340 | 341 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217100310917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 342 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217102028766.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 343 | 344 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217102041839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 345 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217102052835.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 346 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217102107185.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 347 | ```markdown 348 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 349 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复git 350 | 即可获取笔记获取方式。 351 | ``` 352 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 353 | -------------------------------------------------------------------------------- /博客markdown笔记/工具/从前慢-Swagger.md: -------------------------------------------------------------------------------- 1 | # Swagger 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210710164336218.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 3 | 4 | ```markdown 5 | 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。 6 | 前端经常抱怨后端给的接口文档和实际情况不一致。 7 | 后端又觉得编写及维护接口文档会耗费不少精力, 8 | 经常来不及更新。其实无论是前端调用后端, 9 | 还是后端调用前端,都期望有一个好的接口文档。 10 | 但是这个接口文档对于程序员来说,就跟注释一样, 11 | 经常还会抱怨别人写的代码没有写注释,然而自己写 12 | 起代码来,最讨厌的也是写注释。所以仅仅只听过强制 13 | 了来规范大家是不够的,随着时间推移,版本迭代, 14 | 接口文档往往很容易就跟不上代码了。 15 | ``` 16 | 17 | 18 | ## 1 什么是 Swagger 19 | ```markdown 20 | 发现了痛点就要去找解决方案。解决方案用的人多了, 21 | 就成了标准的规范,这就是 Swagger 的由来。通过 22 | 这套规范,你只需要按照它的规范去定义接口及接口 23 | 相关信息。再通过 Swagger 衍生出来的一系列项目 24 | 和工具,就可以做到生成各种格式的接口文档,生 25 | 成多做语言的客户端和服务端的代码,以及在线接口 26 | 调试页面等等。这样,如果按照新的开发方式,在开 27 | 发新版本或者迭代版本的时候,只需要更新 Swagger 28 | 描述文件,就可以自动生成接口文档和客户端代码,做到调用端代码、 29 | 服务端代码以及接口文档的一致性。 30 | 但即便如此,对于许多开发来说,编写这个 yml 或 json 31 | 格式的描述文件,本身也是有一定负担的工作,特别是在 32 | 后面持续迭代开发的时候,往往会忽略更新这个描述文件, 33 | 直接更改代码。久而久之,这个描述文件也和实际项目渐 34 | 行渐远,基于该描述文件生成的接口文档也失去了参考意义。 35 | 所以作为 Java 界服务端的大一统框架 Spring,迅速将Swagger 36 | 规范纳入自身的标准,建立了 Spring-swagger 项目,后面改 37 | 成了现在的 Springfox。通过在项目中引入 Springfox,可以扫 38 | 描相关的代码,生成该描述文件,进而生成与代码一致的接 39 | 口文档和客户端代码。这种通过代码生成接口文档的形式, 40 | 在后面需求持续迭代的项目中,显得尤为重要和高效。 41 | ``` 42 | 43 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210710161346361.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 44 | 45 | ```markdown 46 | 总结:Swagger 就是一个用来定义接口标准,接口规范,同时 47 | 能根据你的代码自动生成接口说明文档的一个工具。 48 | ``` 49 | ## 2 官方提供的工具 50 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210710161427675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 51 | 52 | ```markdown 53 | Swagger Codegen:通过Codegen 可以将描述文件生成 html 54 | 格式和 cwiki 形式的接口文档,同时也能生成多种语言的服务 55 | 端和客户端代码。支持通过 jar 包、docker、node 等方式在 56 | 本地化执行生成。也可以在后面的 Swagger Editor 中在线生成。 57 | 58 | Swagger UI:提供了一个可视化的 UI 页面展示描述文件。 59 | 接口的调用方、测试、项目经理等都可以在该页面中对相 60 | 关接口进行查阅和做一些简单的接口请求。该项目支持在 61 | 线导入描述文件和本地部署 UI 项目。 62 | 63 | Swagger Editor:类似于 Markdown 编辑器的编辑 Swagger 64 | 描述文件的编辑器,该编辑器支持实时预览描述文件的更新 65 | 效果,也提供了在线编辑器和本地部署器俩种方式。 66 | 67 | Swagger Inspector:感觉和 Postman 差不多,是一个可以对 68 | 接口进行测试的在线版的 postman。比如在 Swagger UI 里面 69 | 做接口请求,会返回更多的信息,也会保存你请求的实际请求 70 | 参数等数据。 71 | 72 | Swagger Hub:集成了上面所有项目的各个功能,你可以以项目 73 | 和版本为单位,将你的描述文件上传到 Swagger Hub 中。在 74 | Swagger Hub 中可以完成上面项目的所有工作,需要注册账号, 75 | 分免费版和收费版。 76 | 77 | Springfox Swagger:Spring 基于 Swagger 规范,可以将基于 78 | SpringMVC 和 Spring Boot 项目的项目代码,自动生成 JSON 79 | 格式的描述文件。本身不是属于 Swagger 官网提供的,在这 80 | 里列出来做个说明,方便后面作一个使用的展开。 81 | ``` 82 | ## 3 构建 Swagger 与 Spring Boot 环境 83 | ### 3.1 引入依赖 84 | 85 | ```xml 86 | 87 | 88 | io.springfox 89 | springfox-swagger2 90 | 2.9.2 91 | 92 | 93 | 94 | io.springfox 95 | springfox-swagger-ui 96 | 2.9.2 97 | 98 | ``` 99 | 100 | ### 3.2 编写 Swagger 配置类 101 | ```markdown 102 | 这个配置类基本都是不变的。 103 | ``` 104 | 105 | ```java 106 | import org.springframework.context.annotation.Bean; 107 | import org.springframework.context.annotation.Configuration; 108 | import springfox.documentation.builders.ApiInfoBuilder; 109 | import springfox.documentation.builders.PathSelectors; 110 | import springfox.documentation.builders.RequestHandlerSelectors; 111 | import springfox.documentation.service.Contact; 112 | import springfox.documentation.spi.DocumentationType; 113 | import springfox.documentation.spring.web.plugins.Docket; 114 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 115 | 116 | @Configuration 117 | @EnableSwagger2 118 | public class SwaggerConfig { 119 | 120 | @Bean 121 | public Docket createRestApi(){ 122 | return new Docket(DocumentationType.SWAGGER_2) 123 | .pathMapping("/") 124 | .select() 125 | // 扫描哪个接口的包 126 | .apis(RequestHandlerSelectors.basePackage("com.baiyi.controller")) 127 | .paths(PathSelectors.any()) 128 | .build().apiInfo(new ApiInfoBuilder() 129 | .title("标题: SpringBoot 整合 Swagger 使用") 130 | .description("详细信息: SpringBoot 整合 Swagger,详细信息......") 131 | // 版本信息 132 | .version("1.1") 133 | // 开发文档的联系人 134 | .contact(new Contact("baiyi", "http://www.baidu.com","1101293873@qq.com")) 135 | .license("This Baidu License") 136 | .licenseUrl("http://www.baidu.com") 137 | .build()); 138 | } 139 | } 140 | ``` 141 | 142 | ### 3.3 启动 SpringBoot 项目 143 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160315912.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 144 | 145 | 146 | ### 3.4 访问 Swagger 的 UI 界面 147 | ```markdown 148 | 访问 Swagger 提供的 UI 界面:http://localhost:8080/swagger-ui.html 149 | ``` 150 | 151 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210710161539594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 152 | 153 | ## 4 使用 Swagger 构建 154 | 155 | ### 4.1 开发 Controller 接口 156 | 157 | ```java 158 | import org.springframework.web.bind.annotation.GetMapping; 159 | import org.springframework.web.bind.annotation.RequestMapping; 160 | import org.springframework.web.bind.annotation.RestController; 161 | 162 | import java.util.HashMap; 163 | import java.util.Map; 164 | 165 | @RestController 166 | @RequestMapping("/user") 167 | public class HelloController { 168 | 169 | @GetMapping("/findAll") 170 | public Map findAll(){ 171 | Map map = new HashMap<>(); 172 | map.put("success", "查询所有数据成功"); 173 | map.put("status", true); 174 | return map; 175 | } 176 | } 177 | ``` 178 | 179 | ### 4.2 重启项目访问接口界面 180 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160528547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 181 | 182 | ## 5 Swagger 注解 183 | ### 5.1 @Api 184 | ```markdown 185 | 作用:用来指定接口的描述文字 186 | 修饰范围:用在类上 187 | ``` 188 | 189 | 190 | ```java 191 | @RequestMapping("/user") 192 | @Api(tags = "用户服务相关接口描叙") 193 | public class HelloController { 194 | 195 | .... 196 | } 197 | ``` 198 | 199 | ### 5.2 @ApiOperation 200 | ```markdown 201 | 作用:用来对接口中具体方法做描叙 202 | 修饰范围:用在方法上 203 | ``` 204 | ```java 205 | @GetMapping("/findAll") 206 | @ApiOperation(value = "查询所有用户接口", 207 | notes = "描叙:  用来查询所有用户信息的接口") 208 | public Map findAll(){ 209 | Map map = new HashMap<>(); 210 | map.put("success", "查询所有数据成功"); 211 | map.put("status", true); 212 | return map; 213 | } 214 | ``` 215 | 216 | ### 5.3 @ApiImplicitParams 217 | ```markdown 218 | 作用:用来接口中参数进行说明 219 | 修饰范围:用在方法上 220 | ``` 221 | 222 | #### 5.3.1 普通参数使用 223 | ```java 224 | @PostMapping("save") 225 | @ApiOperation(value = "保存用户信息接口", 226 | notes = "描叙:  用来保存用户信息的接口") 227 | @ApiImplicitParams({ 228 | @ApiImplicitParam(name = "id", value = "用户 id", dataType = "String", defaultValue = "21"), 229 | @ApiImplicitParam(name = "name", value = "用户姓名", dataType = "String", defaultValue = "白衣") 230 | }) 231 | public Map save(String id, String name) { 232 | System.out.println("id = " + id); 233 | System.out.println("name = " + name); 234 | Map map = new HashMap<>(); 235 | map.put("id", id); 236 | map.put("name", name); 237 | return map; 238 | } 239 | ``` 240 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160622895.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 241 | 242 | #### 5.3.2 RestFul 风格使用 243 | ```markdown 244 | 如果使用的是 RestFul 风格进行传参,必须再添加一个 245 | paramType="path" 246 | ``` 247 | 248 | ```java 249 | @PostMapping("save/{id}/{name}") 250 | @ApiOperation(value = "保存用户信息接口", 251 | notes = "描叙:  用来保存用户信息的接口") 252 | @ApiImplicitParams({ 253 | @ApiImplicitParam(name = "id", value = "用户 id", dataType = "String", defaultValue = "21", paramType = "path"), 254 | @ApiImplicitParam(name = "name", value = "用户姓名", dataType = "String", defaultValue = "白衣", paramType = "path") 255 | }) 256 | public Map save(@PathVariable("id") String id,@PathVariable("name") String name) { 257 | System.out.println("id = " + id); 258 | System.out.println("name = " + name); 259 | Map map = new HashMap<>(); 260 | map.put("id", id); 261 | map.put("name", name); 262 | return map; 263 | } 264 | ``` 265 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160716695.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 266 | 267 | #### 5.3.3 JSON 格式使用 268 | ```markdown 269 | 如果是 RequestBody 的方式,需要定义一个对象进行接收。 270 | ``` 271 | ```markdown 272 | 1. 定义一个 User 对象 273 | ``` 274 | ```java 275 | @Data 276 | @AllArgsConstructor 277 | @NoArgsConstructor 278 | public class User { 279 | private String id; 280 | private String name; 281 | } 282 | ``` 283 | ```markdown 284 | 2. 编写 Controller 285 | ``` 286 | ```java 287 | @PostMapping("save2") 288 | public Map save2(@RequestBody User user) { 289 | System.out.println("id = " + user.getId()); 290 | System.out.println("name = " + user.getName()); 291 | Map map = new HashMap<>(); 292 | map.put("id", user.getId()); 293 | map.put("name", user.getName()); 294 | return map; 295 | } 296 | ``` 297 | ```markdown 298 | 3. 重启项目,打开 UI 界面 299 | ``` 300 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160752184.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 301 | ```markdown 302 | 测试: 303 | ``` 304 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160817381.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 305 | ### 5.4 @ApiResponses 306 | ```markdown 307 | 作用:用在请求的方法上,表示一组响应 308 | 修饰范围:用在方法上 309 | ``` 310 | 311 | 312 | ```java 313 | @PostMapping("save2") 314 | @ApiResponses({ 315 | @ApiResponse(code = 404, message = "请求路径不对"), 316 | @ApiResponse(code = 400, message = "程序不对") 317 | }) 318 | public Map save2(@RequestBody User user) { 319 | System.out.println("id = " + user.getId()); 320 | System.out.println("name = " + user.getName()); 321 | Map map = new HashMap<>(); 322 | map.put("id", user.getId()); 323 | map.put("name", user.getName()); 324 | return map; 325 | } 326 | ``` 327 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022160847125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 328 | ```markdown 329 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 330 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复swagger 331 | 即可获取笔记获取方式。 332 | ``` 333 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 334 | 335 | -------------------------------------------------------------------------------- /博客markdown笔记/中间件/从前慢-Nginx.md: -------------------------------------------------------------------------------- 1 | # Nginx 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210717012536214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 Nginx概述 5 | 6 | ```markdown 7 | Nginx (engine ) 是一个高性能的 HTTP 和 反向代理服务器,特点是占 8 | 有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页 9 | 服务器中表现较好,中国大陆使用 nginx 10 | 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等 11 | ``` 12 | ### 1.1 Nginx 作为 web 服务器 13 | 14 | ```markdown 15 | Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议 16 | 的动态语言,比如 perl、php等。但是不支持 java。Java 程序只 17 | 能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 18 | 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的 19 | 考验,有报告表明能支持高达 50,000 个并发连接数。 20 | ``` 21 | ### 1.2 正向代理 22 | 23 | ```markdown 24 | 需要在客户端配置代理服务器进行指定网站访问 25 | ``` 26 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210305130937652.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 27 | 28 | 29 | ### 1.3 反向代理 30 | 31 | ```markdown 32 | 暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。 33 | ``` 34 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127095707958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 35 | ### 1.4 负载均衡 36 | 37 | ```markdown 38 | 增加服务器的数量,然后将请求分发到各个服务器上,将原先请 39 | 求集中到单个服务器上的情况改为将请求分发到多个服务器上,将 40 | 负载分发到不同的服务器,也就是我们所说的负载均衡 41 | ``` 42 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112710001694.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 43 | ### 1.5 动静分离 44 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127100050210.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 45 | ## 2 nginx常用的命令和配置文件 46 | 47 | ```bash 48 | 在 windows 系统中访问 linux 中 nginx, 49 | 默认不能访问的,因为防火墙问题 50 | (1)关闭防火墙 51 | (2)开放访问的端口号,80 端口 52 | 查看开放的端口号 53 | firewall-cmd --list-all 54 | 设置开放的端口号 55 | firewall-cmd --add-service=http --permanent 56 | firewall-cmd --add-port=80/tcp --permanent 57 | 重启防火墙 58 | firewall-cmd –reload 59 | 60 | 61 | 进入 nginx 目录中 62 | cd /usr/local/nginx/sbin 63 | 1、查看 nginx 版本号 64 | ./nginx -v 65 | 2、启动 nginx 66 | ./nginx 67 | 3、停止 nginx 68 | ./nginx -s stop 69 | 4、重新加载 nginx 70 | ./nginx -s reload 71 | 72 | ``` 73 | ### 2.1 Nginx的配置文件 74 | 75 | ```markdown 76 | 第一部分:全局块 77 | (1)全局块:配置服务器整体运行的配置指令 78 | 比如 worker_processes 1;处理并发数的配置 79 | 80 | (2)events 块:影响 Nginx 服务器与用户的网络连接 81 | 比如 worker_connections 1024; 支持的最大连接数为 1024 82 | 83 | 84 | (3)http 块 85 | 还包含两部分:http 全局块、server 块 86 | ``` 87 | ### 2.2 Nginx配置实例- 反向代理实例1 88 | 89 | ```markdown 90 | 1、实现效果 91 | (1)打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页 92 | 面中 93 | 2、准备工作 94 | (1)在 liunx 系统安装 tomcat,使用默认端口 8080 95 | tomcat 安装文件放到 liunx 系统中,解压 96 | 进入 tomcat 的 bin 目录中,./startup.sh 启动 tomcat 服务器 97 | (2)对外开放访问的端口 98 | firewall-cmd --add-port=8080/tcp --permanent 99 | firewall-cmd –reload 100 | 查看已经开放的端口号 101 | firewall-cmd --list-all 102 | (3)在 windows 系统中通过浏览器访问 tomcat 服务器 103 | 104 | ``` 105 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127102813718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 106 | ```markdown 107 | 访问过程的分析 108 | ``` 109 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127102248517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 110 | ```markdown 111 | 4、具体配置 112 | 第一步 在 windows 系统的 host 文件进行域名和 ip 对应关系的配置 113 | (1)添加内容在 host 文件中 114 | ``` 115 | 116 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127102940485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 117 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127103016993.png#pic_center) 118 | ```markdown 119 | 在 nginx 进行请求转发的配置( 反向代理配置) 120 | ``` 121 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127103102573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 122 | ```markdown 123 | 5、最终测试 124 | ``` 125 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127103136919.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 126 | ### 2.3 Nginx配置实例-反向代理实例2 127 | ```markdown 128 | 1、实现效果 129 | 使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 130 | nginx 监听端口为 9001, 131 | 访问 http://192.168.17.129:9001/edu/ 直接跳转到 127.0.0.1:8080 132 | 访问 http:// 192.168.17.129:9001/vod/ 直接跳转到 127.0.0.1:8081 133 | 2、准备工作 134 | (1)准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口 135 | (2)创建文件夹和测试页面 136 | 3、具体配置 137 | (1)找到 nginx 配置文件,进行 反向代理配置 138 | ``` 139 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127103440920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 140 | ```markdown 141 | (2)开放对外访问的端口号 9001 8080 8081 142 | ``` 143 | ```markdown 144 | 4、最终测试 145 | ``` 146 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112710355138.png#pic_center) 147 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127103600892.png#pic_center) 148 | ## 3 Nginx 配置实例-负载均衡 149 | ```markdown 150 | 1、实现效果 151 | (1)浏览器地址栏输入地址 http://192.168.17.129/edu/a.html, 152 | 负载均衡效果,平均 8080 153 | 和 8081 端口中 154 | 2、准备工作 155 | (1)准备两台 tomcat 服务器,一台 8080,一台 8081 156 | (2)在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹, 157 | 在 edu 文件夹中创建页面 a.html,用于测试 158 | 3、在 nginx 的配置文件中进行负载均衡的配置 159 | ``` 160 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127104719438.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 161 | ```markdown 162 | 4、nginx 分配服务器策略 163 | 1、轮询(默认) 164 | 每个请求按时间顺序逐一分配到不同的后端服务器, 165 | 如果后端服务器 down 掉,能自动剔除。 166 | 2、weight 167 | weight 代表权,重默认为 1,权重越高被分配的客户端越多 168 | 指定轮询几率,weight 和访问比率成正比,用于后端服务器性 169 | 能不均的情况。 例如: 170 | ``` 171 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127104904601.png#pic_center) 172 | ```markdown 173 | 3、ip_hash 174 | 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个 175 | 后端服务器,可以解决 session 的问题。 例如: 176 | ``` 177 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127104937470.png#pic_center) 178 | ```markdown 179 | 4、fair(第三方) 180 | 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 181 | ``` 182 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127105007348.png#pic_center) 183 | ## 4 Nginx 配置实例-动静分离 184 | ### 4.1 什么是动静分离 185 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127105125442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 186 | 187 | ```markdown 188 | 通过 location 指定不同的后缀名实现不同的请求转发。通过expires 189 | 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求 190 | 和流量。具体 Expires 定义:是给一个资源 191 | 设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器 192 | 自身确认是否过期即可,所以不会产生额外的流量。此种方法非常 193 | 适合不经常变动的资源。(如果经常更新的文件,不建议使用 194 | Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这 195 | 个 URL,发送一个请求,比对服务器该文件最后更新时间没 196 | 有变化,则不会从服务器抓取,返回状态码 304, 197 | 如果有修改,则直接从服务器重新下载,返回状态码 200。 198 | ``` 199 | ### 4.2 准备工作 200 | ```markdown 201 | (1)在 liunx 系统中准备静态资源,用于进行访问 202 | ``` 203 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127105717954.png#pic_center) 204 | ```markdown 205 | 2、具体配置 206 | (1)在 nginx 配置文件中进行配置 207 | ``` 208 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127105927921.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 209 | 210 | ```markdown 211 | 3、最终测试 212 | (1)浏览器中输入地址 213 | http://192.168.17.129/image/01.jpg 214 | ``` 215 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127110027863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 216 | 217 | ```markdown 218 | 因为配置文件 autoindex on 219 | ``` 220 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127110326171.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 221 | 222 | ```markdown 223 | (2)在浏览器地址栏输入地址 224 | http://192.168.17.129/www/a.html 225 | ``` 226 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127110855931.png#pic_center) 227 | ## 5 Nginx配置高可用的集群 228 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127112547527.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 229 | 230 | ```markdown 231 | 1、什么是 nginx 高可用 232 | (1)需要两台 nginx 服务器 233 | (2)需要 keepalived 234 | (3)需要虚拟 ip 235 | 236 | 237 | 2、配置高可用的准备工作 238 | (1)需要两台服务器 192.168.17.129 和 192.168.17.131 239 | (2)在两台服务器安装 nginx 240 | (3)在两台服务器安装 keepalived 241 | 242 | 243 | 3、在两台服务器安装 keepalived 244 | (1)使用 yum 命令进行安装 245 | yum install keepalived –y 246 | (2)安装之后,在 etc 里面生成目录 keepalived, 247 | 有文件 keepalived.conf 248 | ``` 249 | ```markdown 250 | 4、完成高可用配置(主从配置) 251 | (1)修改/etc/keepalived/keepalivec.conf 配置文件 252 | global_defs { 253 | notification_email { 254 | acassen@firewall.loc 255 | failover@firewall.loc 256 | sysadmin@firewall.loc 257 | } 258 | notification_email_from Alexandre.Cassen@firewall.loc 259 | smtp_server 192.168.17.129 260 | smtp_connect_timeout 30 261 | router_id LVS_DEVEL 262 | } 263 | vrrp_script chk_http_port { 264 | script "/usr/local/src/nginx_check.sh" 265 | interval 2 #(检测脚本执行的间隔) 266 | weight 2 267 | } 268 | vrrp_instance VI_1 { 269 | state BACKUP # 备份服务器上将 MASTER 改为 BACKUP 270 | interface ens33 //网卡 271 | virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 272 | priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 273 | advert_int 1 274 | authentication { 275 | auth_type PASS 276 | auth_pass 1111 277 | } 278 | virtual_ipaddress { 279 | 192.168.17.50 // VRRP H 虚拟地址 280 | } 281 | } 282 | (2)在/usr/local/src 添加检测脚本 283 | #!/bin/bash 284 | A=`ps -C nginx –no-header |wc -l` 285 | if [ $A -eq 0 ];then 286 | /usr/local/nginx/sbin/nginx 287 | sleep 2 288 | if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 289 | killall keepalived 290 | fi 291 | fi 292 | 293 | (3)把两台服务器上 nginx 和 keepalived 启动 294 | 启动 nginx:./nginx 295 | 启动 keepalived:systemctl start keepalived.service 296 | 5、最终测试 297 | (1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50 298 | ``` 299 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127114234623.png#pic_center) 300 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127114252211.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 301 | 302 | ```markdown 303 | (2)把主服务器(192.168.17.129)nginx 和 keepalived 停止, 304 | 再输入 192.168.17.50 305 | ``` 306 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127114351483.png#pic_center) 307 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127114400582.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 308 | ## 6 Nginx 的原理 309 | ```markdown 310 | 1、mater 和 worker 311 | ``` 312 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112711495190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 313 | 314 | ```markdown 315 | 2、worker 如何进行工作的 316 | ``` 317 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127115017298.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 318 | ```markdown 319 | 3、一个 master 和多个 woker 有好处 320 | (1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作 321 | (2)每个 woker 是独立的进程,如果有其中的一个woker出现问题, 322 | 其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服 323 | 务中断 324 | 4、设置多少个 woker 合适 325 | worker 数和服务器的 cpu 数相等是最为适宜的 326 | 5、连接数 worker_connection 327 | 第一个:发送请求,占用了 woker 的几个连接数? 328 | 答案:2 或者 4 个 329 | 第二个:nginx 有一个 master,有四个woker,每个woker支持最大 330 | 的连接数 1024,支持的 331 | 最大并发数是多少? 332 | 普通的静态访问最大并发数是: worker_connections * worker_processes /2, 333 | 而如果是HTTP作为反向代理来说最大并发数量应该是 334 | worker_connections *worker_processes/4。 335 | ``` 336 | ```markdown 337 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 338 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复nginx 339 | 即可获取笔记获取方式。 340 | ``` 341 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 342 | -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/从前慢-移动Web开发之响应式布局.md: -------------------------------------------------------------------------------- 1 | # 移动Web开发之响应式布局 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210714021122428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1.1 响应式布局 5 | ```markdown 6 | 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置, 7 | 从而适配不同设备的目的。 8 | ``` 9 | ### 1.1.1 设备的划分情况: 10 | ```markdown 11 | 小于768的为超小屏幕(手机) 12 | 768~992之间的为小屏设备(平板) 13 | 992~1200的中等屏幕(桌面显示器) 14 | 大于1200的宽屏设备(大桌面显示器) 15 | ``` 16 | ### 1.1.2 响应式开发 17 | ```markdown 18 | 响应式布局容器 19 | 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 20 | 原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小, 21 | 再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到 22 | 不同的页面布局和样式变化。 23 | 24 | 超小屏幕(手机,小于 768px):设置宽度为 100% 25 | 小屏幕(平板,大于等于 768px):设置宽度为 750px 26 | 中等屏幕(桌面显示器,大于等于 992px):宽度设置为 970px 27 | 大屏幕(大桌面显示器,大于等于 1200px):宽度设置为 1170px 28 | ``` 29 | 30 | ```html 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Document 39 | 74 | 75 | 76 | 77 | 78 |
79 | 80 | 81 | 82 | ``` 83 | ### 1.1.3 响应式导航 84 | ```markdown 85 | 1 当我们屏幕大于等于800像素,我们给nav宽度为800px,因 86 | 为里面子盒子需要浮动,所以nav需要清除浮动。 87 | 2 nav里面包含8个小li 盒子,每个盒子的宽度定为 100px, 高 88 | 度为 30px,浮动一行显示。 89 | 3 当我们屏幕缩放,宽度小于800像素的时候, nav盒子宽度修 90 | 改为 100% 宽度。 91 | nav里面的8个小li,宽度修改为 33.33%,这样一行就只能显示 92 | 3个小li ,剩余下行显示。 93 | ``` 94 | ```html 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | Document 103 | 134 | 135 | 136 | 137 |
138 |
    139 |
  • 导航栏
  • 140 |
  • 导航栏
  • 141 |
  • 导航栏
  • 142 |
  • 导航栏
  • 143 |
  • 导航栏
  • 144 |
  • 导航栏
  • 145 |
  • 导航栏
  • 146 |
  • 导航栏
  • 147 |
148 |
149 | 150 | 151 | 152 | ``` 153 | ## 1.2 bootstrap的介绍 154 | ### 1.2.1 创建html骨架结构 155 | ```html 156 | 157 | 158 | 159 | 160 | 162 | 163 | 164 | 165 | 166 | ``` 167 | ### 1.2.2 引入相关样式文件 168 | ```css 169 | 170 | 171 | ``` 172 | ### 1.2.3 栅格系统使用 173 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714085343230.png) 174 | ```html 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 186 | 187 | 188 | Document 189 | 198 | 199 | 200 | 201 |
202 |
203 |
1
204 |
2
205 |
3
206 |
4
207 |
208 | 209 |
210 |
1
211 |
2
212 |
3
213 |
4
214 |
215 | 216 |
217 |
1
218 |
2
219 |
3
220 |
4
221 |
222 | 223 | 224 |
225 |
1
226 |
2
227 |
3
228 |
4
229 |
230 | 231 | 232 |
233 | 234 | 235 | 236 | ``` 237 | ### 1.2.4 布局容器 238 | ```markdown 239 | Bootstrap 需要为页面内容和栅格系统包裹一个 .container 容 240 | 器,它提供了两个作此用处的类 241 | ``` 242 | ```markdown 243 | 1. container 类 244 | 响应式布局的容器 固定宽度 245 | 大屏 ( >=1200px) 宽度定为 1170px 246 | 中屏 ( >=992px) 宽度定为 970px 247 | 小屏 ( >=768px) 宽度定为 750px 248 | 超小屏 (100%) 249 | 2. container-fluid 类 250 | 流式布局容器 百分百宽度 251 | 占据全部视口(viewport)的容器。 252 | ``` 253 | ### 1.2.5 bootstrap栅格系统 254 | ```markdown 255 | Bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着 256 | 屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。 257 | 258 | 栅格系统用于通过一系列的行(row)与列(column)的组合来创 259 | 建页面布局,你的内容就可以放入这些创建好的布局中。 260 | 261 | 按照不同屏幕划分为1~12 等份 262 | 行(row) 可以去除父容器作用15px的边距 263 | xs-extra small:超小; sm-small:小; md-medium:中等; lg-large:大; 264 | 列(column)大于 12,多余的“列(column)”所在的元素将被作为一个整体另起一行排列 265 | 每一列默认有左右15像素的 padding 266 | 可以同时为一列指定多个设备的类名,以便划分不同份数 例如 class="col-md-4 col-sm-6" 267 | 268 | 栅格嵌套 269 | 栅格系统内置的栅格系统将内容再次嵌套。简单理解就是一个列内再分成若干份小列。我们可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-* 270 | 元素内。 271 | 272 | 列嵌套 273 | 274 |
275 |
276 |
小列
277 |
小列
278 |
279 |
280 | 281 | 列偏移 282 | 283 | 使用 .col-md-offset-* 类可以将列向右侧偏移。这些类实际是通过使用 *选择器为当前元素增加了左侧的边距(margin)。 284 |
285 |
1
286 |
2
287 |
288 | 289 | 290 | 列排序 291 | 通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序。 292 | 293 | 294 |
295 |
左侧
296 |
右侧
297 |
298 | 299 | ``` 300 | ### 1.2.6 栅格系统列嵌套 301 | ```html 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 313 | 314 | 315 | Document 316 | 323 | 324 | 325 | 326 |
327 |
328 |
329 | 330 |
331 |
a
332 |
b
333 |
334 |
335 |
2
336 |
3
337 |
338 |
339 | 340 | 341 | 342 | ``` 343 | ### 1.2.7 栅格系统列偏移 344 | ```html 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 356 | 357 | 358 | Document 359 | 365 | 366 | 367 | 368 |
369 |
370 |
左侧
371 | 372 |
右侧
373 |
374 |
375 | 376 |
中间盒子
377 |
378 | 379 |
380 | 381 | 382 | 383 | ``` 384 | ### 1.2.8 栅格系统列排序 385 | ```html 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 397 | 398 | 399 | Document 400 | 406 | 407 | 408 | 409 |
410 |
411 |
左侧
412 |
右侧
413 |
414 |
415 | 416 | 417 | 418 | ``` 419 | ### 1.2.9 响应式工具 420 | ```markdown 421 | 为了加快对移动设备友好的页面开发工作,利用媒体查询功 422 | 能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容。 423 | ``` 424 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509220358653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 425 | ```html 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 437 | 438 | 439 | Document 440 | 455 | 456 | 457 | 458 |
459 |
460 |
461 | 我会显示哦 462 |
463 |
2
464 | 465 |
4
466 |
467 | 468 |
469 | 470 | 471 | 472 | ``` 473 | ```markdown 474 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 475 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 476 | 响应式即可获取笔记获取方式。 477 | ``` 478 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 479 | -------------------------------------------------------------------------------- /博客markdown笔记/开发指南/从前慢-开发问题指南.md: -------------------------------------------------------------------------------- 1 | # 开发问题指南 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/202107152223398.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 mysql 5 | ### 1.1 如何创建一个mysql用户 6 | ```sql 7 | 如何创建一个mysql用户 8 | 首先以root身份登录到MySQL服务器中。 9 | $ mysql -u root -p 10 | 当验证提示出现的时候,输入MySQL的root帐号的密码。 11 | 创建一个MySQL用户 12 | 使用如下命令创建一个用户名和密码分别为"myuser"和"mypassword"的用户。 13 | mysql> CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword'; 14 | 一旦用户被创建后,包括加密的密码、权限和资源限制在内的 15 | 所有帐号细节都会被存储在一个名为user的表中,这个表则存在 16 | 于mysql这个特殊的数据库里。 17 | 运行下列命令,验证帐号是否创建成功 18 | mysql> SELECT host, user, password FROM mysql.user WHERE user='myuser'; 19 | 赋予MySQL用户权限 20 | 一个新建的MySQL用户没有任何访问权限,这就意味着你不能 21 | 在MySQL数据库中进行任何操作。你得赋予用户必要的权限。 22 | 以下是一些可用的权限: 23 | ALL: 所有可用的权限 24 | CREATE: 创建库、表和索引 25 | LOCK_TABLES: 锁定表 26 | ALTER: 修改表 27 | DELETE: 删除表 28 | INSERT: 插入表或列 29 | SELECT: 检索表或列的数据 30 | CREATE_VIEW: 创建视图 31 | SHOW_DATABASES: 列出数据库 32 | DROP: 删除库、表和视图 33 | 运行以下命令赋予"myuser"用户特定权限。 34 | mysql> GRANT ON . TO 'myuser'@'localhost'; 35 | 以上命令中, 代表着用逗号分隔的权限列表。 36 | 如果你想要将权限赋予任意数据库(或表),那么使用 37 | 星号(*)来代替数据库(或表)的名字。 38 | 例如,为所有数据库/表赋予 CREATE 和 INSERT 权限: 39 | mysql> GRANT CREATE, INSERT ON *.* TO 'myuser'@'localhost'; 40 | 验证给用户赋予的全权限: 41 | mysql> SHOW GRANTS FOR 'myuser'@'localhost'; 42 | 将全部的权限赋予所有数据库/表: 43 | mysql> GRANT ALL ON *.* TO 'myuser'@'localhost'; 44 | 你也可以将用户现有的权限删除。 45 | 使用以下命令废除"myuser"帐号的现有权限: 46 | mysql> REVOKE ON .
FROM 'myuser'@'localhost'; 47 | 为用户添加资源限制 48 | 在MySQL中,你可以为单独的用户设置MySQL的资源使用限制。 49 | 可用的资源限制如下: 50 | MAX_QUERIES_PER_HOUR: 允许的每小时最大请求数量 51 | MAX_UPDATES_PER_HOUR: 允许的每小时最大更新数量 52 | MAX_CONNECTIONS_PER_HOUR: 允许的每小时最大连接(LCTT译注:其与 MySQL全局变量: max_user_connections 共同决定用户到数据库的同时连接数量)数量 53 | MAX_USER_CONNECTIONS: 对服务器的同时连接量 54 | 使用以下命令为"myuser"帐号增加一个资源限制: 55 | mysql> GRANT USAGE ON .
TO 'myuser'@'localhost' WITH ; 56 | 在 中你可以指定多个使用空格分隔开的资源限制。 57 | 例如,增加 MAXQUERIESPERHOUR 和 MAXCONNECTIONSPERHOUR 资源限制: 58 | mysql> GRANT USAGE ON *.* TO 'myuser'@'localhost' WITH MAX_QUERIES_PER_HOUR 30 MAX_CONNECTIONS_PER_HOUR 6; 59 | 验证用户的资源限制: 60 | mysql> SHOW GRANTS FOR 'myuser'@'localhost; 61 | 创建和设置一个MySQL用户最后的一个重要步骤: 62 | mysql> FLUSH PRIVILEGES; 63 | 如此一来更改便生效了。现在MySQL用户帐号就可以使用了。 64 | ``` 65 | 66 | ### 1.2 如何用mysql远程连接数据库 67 | ```sql 68 | 1 连接Mysql (连接方式:mysql -u 你设置的用户名 -p你设置的密码 ) 69 | 2 查看数据库:show databases;我们会看到有一个叫做"mysql"的数 70 | 据库,这里我们输入: use mysql 进入'mysql'数据库中 71 | 3 执行 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你设置的密码' WITH GRANT OPTION; 72 | 4 刷新, FLUSH PRIVILEGES; 73 | 5 退出,此时就可以进行远程连接了。 74 | 75 | 注意:‘%’ 指所有ip都可远程连接此电脑。如果%变成ip 76 | 仅指定该ip可以远程连接至此电脑。 77 | grant all privileges on *.* to 'root'@'ip' identified by 'password' with grant option; 78 | all privileges:表示将所有权限授予给用户。 79 | 也可指定具体的权限,如:SELECT、CREATE、DROP等。 80 | on:表示这些权限对哪些数据库和表生效,格式:数 81 | 据库名.表名,这里写.表示所有数据库,所有表。如果 82 | 我要指定将权限应用到test库的user表中,可以这么写:test.user 83 | to:将权限授予哪个用户。格式:”用户名”@”登录IP或主机名”。 84 | %表示没有限制,在任何主机都可以登录。 85 | 比如:”zhyd”@”192.168.1.%”,表示zhyd这个用户只能 86 | 在192.168.1IP段登录。为了安全起见,请使用指定ip 87 | 或者主机进行授权 88 | identified by:指定用户的登录密码 89 | with grant option:表示允许用户将自己的权限授权给其它用户 90 | 刷新权限 91 | flush privileges; 92 | ``` 93 | ### 1.3 报错 94 | ```markdown 95 | Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support 96 | authentication protocol requested by serv 97 | 98 | 99 | mysql> use mysql; 100 | mysql> select user,host from user; 101 | 102 | +------------------+-----------+ 103 | | user | host | 104 | +------------------+-----------+ 105 | | root | % | 106 | | admin | localhost | 107 | | mysql.infoschema | localhost | 108 | | mysql.session | localhost | 109 | | mysql.sys | localhost | 110 | | zhangj | localhost | 111 | +------------------+-----------+ 112 | 113 | 注意我的root,host是'%' 114 | 115 | 你可能执行的是: 116 | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123'; 117 | 118 | 改成: 119 | ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123'; 120 | flush privileges; 121 | ``` 122 | ## 2 跨域问题 123 | ```markdown 124 | 前后端都可以解决 125 | ``` 126 | ### 2.1 前端解决 127 | ```js 128 | vue-cli开启跨域 129 | 解决思路 130 | 服务器之间不存在跨域问题。所以就利用代理服务器完成跨域问题 131 | 假设我的项目启动端口是8080,则启动的访问地址是http://localhost:8080/ 132 | 133 | 其中有一个请求地址是:以下地址会被拦截 134 | axios.get("/api").then((response) => { 135 | console.log(response.data) 136 | }) 137 | 138 | 注释: /api代表http://localhost:8080/api 139 | 在项目根目录下建立vue.config.js文件内容如下 140 | module.exports = { 141 | devServer: { 142 | host: 'localhost', 143 | port: 8080, # 项目启动端口,这里可以随意指定。那么启动服务时就会以这个端口启动。 144 | proxy: { 145 | '/api' : { # 拦截/api的请求 146 | target: 'https://www.baidu.com/aaa # 请求的真实地址 147 | changeOrigin: true, # 允许跨域 148 | pathRewrite: { 149 | '^/api': '' //通过pathRewrite重写地址,将前缀/api转为/ 150 | } 151 | 152 | } 153 | } 154 | // https: true # 如果想要以https启动项目的话,可以配置此参数 155 | } 156 | } 157 | 158 | 过程如下: 159 | 第一步 160 | http://localhost:8080/api # 此请求被/api拦截 161 | 第二步 重写目标地址 162 | http://localhost:8080/api 被替换成https://www.baidu.com/aaa/api 163 | 第三步 改写请求路径 164 | https://www.baidu.com/aaa/api 改写成https://www.baidu.com/aaa 165 | ``` 166 | ### 2.2 后端解决 167 | ```java 168 | 第一种办法: 169 | import org.springframework.context.annotation.Configuration; 170 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 171 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 172 | @Configuration 173 | public class CorsConfig implements WebMvcConfigurer { 174 | @Override 175 | public void addCorsMappings(CorsRegistry registry) { 176 | registry.addMapping("/**") 177 | .allowedOrigins("*") // http://localhost:9000,则代表是这个域名可以跨域 178 | .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") 179 | .allowCredentials(true) 180 | .maxAge(3600) 181 | .allowedHeaders("*"); 182 | } 183 | } 184 | 185 | 第二种办法: 186 | import org.springframework.context.annotation.Configuration; 187 | import javax.servlet.*; 188 | import javax.servlet.annotation.WebFilter; 189 | import javax.servlet.http.HttpServletResponse; 190 | import java.io.IOException; 191 | @WebFilter(filterName = "CorsFilter ") 192 | @Configuration 193 | public class CorsFilter implements Filter { 194 | @Override 195 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 196 | HttpServletResponse response = (HttpServletResponse) res; 197 | response.setHeader("Access-Control-Allow-Origin","*"); 198 | response.setHeader("Access-Control-Allow-Credentials", "true"); 199 | response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT"); 200 | response.setHeader("Access-Control-Max-Age", "3600"); 201 | response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 202 | chain.doFilter(req, res); 203 | } 204 | } 205 | 206 | 207 | 第三种办法: 208 | public class GoodsController { 209 | @CrossOrigin(origins = "http://localhost:4000") 210 | @GetMapping("goods-url") 211 | public Response queryGoodsWithGoodsUrl(@RequestParam String goodsUrl) throws Exception {} 212 | } 213 | 214 | ``` 215 | ## 3 Git 216 | ### 3.1 git提交远程仓库失败 217 | ```markdown 218 | 1 window本身凭证的原因:以前有用过git,账户密码被记 219 | 录到凭证里面。所以登录上去不用密码。所以你如果提交仓库,用的是凭 220 | 证里面的账号跟密码。如果账号密码不对的话,自然也就提交不上去。解决办 221 | 法就是删掉凭证,重新输入账号跟密码 222 | ``` 223 | ### 3.2 git乱码问题 224 | ```markdown 225 | 修改 Git 的安装目录下的bash.bashrc文件, 226 | 我的目录是:D:Git\etc,在该文件最后添加以下代码 227 | [gui] 228 | encoding = utf-8 # 代码库统一使用utf-8 229 | [i18n] 230 | commitencoding = utf-8 # log编码 231 | [svn] 232 | pathnameencoding = utf-8 # 支持中文路径 233 | ``` 234 | ### 3.3 git推送失败 235 | ~~~markdown 236 | idea提交项目到github 237 | 提交到远程库错误:Push to origin/master was rejected 238 | 解决方案:git pull origin(远程仓库的地址) master --allow-unrelated-histories 239 | ~~~ 240 | 241 | ## 4 Tomcat 242 | ### 4.1 Tomcat乱码问题 243 | ```markdown 244 | idea中解决tomcat乱码问题: 245 | 在 tomcat / conf 目录下,设置 logging.properties , 246 | 增加参数 java.util.logging.ConsoleHandler.encoding = GBK, 247 | 248 | 1catalina.org.apache.juli.AsyncFileHandler.encoding = GBK 249 | 2localhost.org.apache.juli.AsyncFileHandler.encoding = GBK 250 | 重启后终于可以了 251 | ``` 252 | ## 5 windows 253 | ### 5.1 在DOS命令窗口中怎么复制内容 254 | ```markdown 255 | win7: 256 | 任意位置点击右键-->标记-->选中要复制的内容-->点击右键-->此时 257 | 就到剪贴板里面了 258 | win10: 259 | 左键直接选中,然后右键单击一下就到剪贴板里面了。 260 | ``` 261 | ### 5.2 windows常见命令 262 | ~~~markdown 263 | exit 退出窗口 264 | cls 清屏 265 | dir 列出当前目录的文件以及目录 266 | cd . 当前目录 267 | cd .. 上一级目录 268 | cd \ 回到根目 269 | ~~~ 270 | ### 5.3 文本通用快捷键 271 | ```markdown 272 | 常用的组合键都有哪些? 273 | 复制 ctrl + c 274 | 粘贴 ctrl + v 275 | 剪切 ctrl + x 276 | 保存 ctrl + s 277 | 278 | 撤销 ctrl + z 279 | 重做 ctrl + y 280 | 281 | 回到行首:home键 282 | 回到行尾:end键 283 | 284 | 当光标在行尾,怎么选中一行? 285 | shift + home键 286 | 当光标在行首,怎么选中一行? 287 | shift + end键 288 | 289 | 回到文件头:ctrl + home 290 | 回到文件尾:ctrl + end 291 | 292 | 全选:ctrl + a 293 | 294 | 查找:ctrl + f 295 | 296 | 搜狗输入法如何敲代码标点进行中英文切换:Ctrl+. 297 | ``` 298 | ### 5.4 window如何杀死进程 299 | ```markdown 300 | 首先查看端口被那个进程占用 301 | netstat -p tcp -ano | findstr :8888 302 | 找到pid,如图就是8860 303 | ``` 304 | 305 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200622072316549.png) 306 | ```markdown 307 | 查看8860进程的进程名 308 | tasklist | findstr 8860 309 | ``` 310 | 311 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200622072328303.png) 312 | ```markdown 313 | 最后强制终止进程 314 | taskkill -PID 8860 –F 315 | ``` 316 | 317 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200622072335800.png) 318 | ## 6 IDEA 319 | ### 6.1 将cmd改为bash 320 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020031110302125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 321 | ### 6.2 忽略大小写 322 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200921095207812.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 323 | ### 6.3 自动导包 324 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200921095620824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 325 | ### 6.4 集成idea中git自带的bash.exe乱码问题 326 | ```markdown 327 | 集成idea中git自带的bash.exe乱码问题 328 | 修改 Git 的安装目录下的bash.bashrc文件,我的目录 329 | 是:D:Git\etc,在该文件最后添加以下代码 330 | [gui] 331 | encoding = utf-8 #代码库统一使用utf-8 332 | [i18n] 333 | commitencoding = utf-8 #log编码 334 | [svn] 335 | pathnameencoding = utf-8 #支持中文路径 336 | ``` 337 | ### 6.5 windows端口占用问题 338 | ```markdown 339 | 1.查看该端口被哪些进程占用 340 | 341 | netstat -ano|findstr [端口号] 342 | 343 | 2.查看进程信息 344 | 345 | tasklist | findstr [pid] 346 | 347 | 3.根据进程ID或进程名称杀进程 348 | 349 | taskkill /f /pid [pid] 350 | 351 | taskkill /f /im [进程名] 352 | ``` 353 | ### 6.6 Jrebel and XRebel for Intellij的使用 354 | ```markdown 355 | 生成 GUID 的网址 356 | https://www.guidgen.com/ 357 | 用这个网址 + 生成的 GUID 激活 358 | https://jrebel.qekang.com/ 359 | demo@123.com 360 | ``` 361 | 362 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004182637631.png#pic_center) 363 | ### 6.7 idea解决不能上网问题 364 | ```markdown 365 | 选择 File—>Setting—>Appearance&Behavior—> 366 | System Settings—>HTTP Proxy 进行配置, 367 | 地址除了用http://127.0.0.1:1080,也可以配 368 | 置 https://plugins.jetbrains.com/ 369 | ``` 370 | ### 6.8 idea编译报错问题 371 | ```markdown 372 | Error:java: Compilation failed: internal java compiler error 373 | 解决办法 374 | 错误原因 375 | 导致这个错误的原因主要是因为jdk版本问题,此处 376 | 有两个原因,一个是编译版本不匹配,一个是当前项 377 | 目jdk版本不支持。 378 | 379 | 查看项目的jdk 380 | File ->Project Structure->Project Settings 381 | ->Project或使用快 382 | 捷键Ctrl+Alt+shift+S打开项目的jdk配置: 383 | ``` 384 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210315082331673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 385 | ```markdown 386 | 查看此两处是否与目标jdk一致。 387 | 388 | 查看工程的jdk 389 | 点击上图中Modules查看对应jdk版本: 390 | ``` 391 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210315082404157.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 392 | 393 | ```markdown 394 | 查看java编译器版本 395 | ``` 396 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210315082417753.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 397 | 398 | ```xml 399 | 导入java项目时此处处问题的概率比较多。 400 | 401 | 针对此问题,重新打开或修改pom文件(maven项目)中 402 | 的内容很可能导致jdk版本重新变为1.5。如果是maven项 403 | 目,可在pom文件中指定jdk相关信息 404 | 405 | 406 | 407 | 408 | org.apache.maven.plugins 409 | maven-compiler-plugin 410 | 411 | 1.7 412 | 1.7 413 | 414 | 415 | 416 | 417 | ``` 418 | ### 6.9 idea无法识别maven中的pom.xml 419 | ```markdown 420 | 在pom.xml右键add as maven project 421 | ``` 422 | ### 6.10 idea解析jsp 423 | ```markdown 424 | 名字为webapp 425 | ``` 426 | ### 6.11 idea自动生成序列化版本号 427 | ```markdown 428 | 凡是一个类实现了Serializable接口,建议给该类提供一个 429 | 固定不变的序列化版本号。以后这个类即使代码修改了,但 430 | 是版本号不变,java虚拟机认为是同一个类。(区分类的) 431 | ``` 432 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210316080610736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 433 | ```markdown 434 | Alt+Enter:自动生成 435 | ``` 436 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210316080644217.png) 437 | 438 | ### 6.12 常用插件 439 | ```markdown 440 | Translation 翻译插件 441 | RestfulTool 测试接口工具 442 | GsonFormatPlus 443 | Free Mybatis plugin 从xml跟接口类之间的跳转 444 | AceJump 快速跳转代码 445 | Grep Console 日志输出调整 446 | Maven Helper 调试maven依赖 447 | Easy Code 生成dao、service、controller层代码 448 | Iedis redis 可视化工具 449 | Mongo Plugin 可视化工具 450 | Lombok 生成getter、setter方法 451 | stackoverflow 452 | Vue 453 | SequenceDiagram 454 | Properties to YAML Converter 将Properties格式转化为yaml 455 | LeetCode 刷题软件 456 | Mybatis Log Plugin 日志输出 457 | Key Promoter X 快捷键提示 458 | google-java-format 459 | Alibaba Java Coding Guidelines 460 | Jrebel and XRebel for Intellij 热部署 461 | Idea QAPlug 462 | MybatisCodeHelperPro 463 | Codota 464 | ``` 465 | ### 6.13 常用快捷键 466 | ```markdown 467 | xxx.for 468 | psvm 469 | xxx.var 470 | iter+tab 471 | alt+enter 472 | itar + tab 473 | soutv 474 | ctrl+shift+f12 # 窗口最大化跟最小化 475 | alt+1 # 快速打开项目面板 476 | ctrl+alt+s # 快速打开配置面板 477 | double shift 搜索文件 478 | ctrl + i 实现接口 479 | ctrl + o 覆盖父类中方法 480 | alt + insert 快速创建方法或者新建类 481 | 后退 ctrl + z 482 | 前进 ctrl + y 483 | ctril + H 常看类的层次结构 484 | alt+ / 代码补全,需修改idea快捷键 485 | ``` 486 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200921094605218.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 487 | ## 7 vscode 488 | ### 7.1 如何设置目录分开出来 489 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200924202016854.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 490 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200924202148413.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 491 | ### 7.2 常用插件 492 | ```markdown 493 | 1 Auto Close Tag # 自动补全没打完的半边标签,比如
就变成 494 | `
` 495 | 496 | 2 Auto Rename Tag # 自动完成另一侧标签的同步修改 497 | 498 | 3 Chinese # vscode中文化 499 | ``` 500 | 501 | 502 | 503 | ### 7.3 code runner出现乱码问题 504 | ```markdown 505 | 在code runner中的setting.json文件中添加"code-runner.runInTerminal": true 506 | ``` 507 | 508 | 509 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200928202115385.png#pic_center) 510 | ### 7.4 vscode集成bash 511 | ```markdown 512 | 1 打开vscode 513 | 2 文件->首选项->设置,打开设置 514 | 3 搜索terminal.integrated.shell.windows, 515 | 打开settings.json编辑 516 | 4 在里面输入你的bash路径 517 | 如:“terminal.integrated.shell.windows”:“D:\app\Git\bin\bash.exe” 518 | 5 保存重启vscode,按ctrl+~键打开终端,看是否生效 519 | 6 实现cmd跟bash之间的切换 520 | 输入cmd切换成cmd,输入bash切换成bash 521 | ``` 522 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201006135315959.png#pic_center) 523 | 524 | ### 7.5 解决乱码问题 525 | ```markdown 526 | 1 针对单个文件 527 | 点击右下角的编码按钮(图中为UTF-8),然后选择操作, 528 | 通过编码重新打开(Reopen with Encoding) 529 | 之后选择一种编码进行文件打开并保存。 530 | ``` 531 | 532 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120101526924.png) 533 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120101538878.png) 534 | ```markdown 535 | 2 全局设置 536 | 文件->首选项->设置->输入settings.json 537 | ->在setting.json中加入files.autoGuessEncoding": true,并保存 538 | ->重新查看乱码文件看看是否设置成功。 539 | ``` 540 | 541 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120101808537.png) 542 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210120101911772.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 543 | 544 | ```markdown 545 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 546 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 547 | 开发即可获取笔记获取方式。 548 | ``` 549 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 550 | -------------------------------------------------------------------------------- /博客markdown笔记/服务框架/从前慢-Zookeeper.md: -------------------------------------------------------------------------------- 1 | # Zookeeper 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210717005844525.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 Zookeeper简介 5 | ```markdown 6 | ZooKeeper(动物园管理者)一个分布式的,开放源码的分布式 7 | 应用程序协调服务,是Google的Chubby一个开源的实现, 8 | 是Hadoop和Hbase的重要组件 9 | ZooKeeper使用Java所编写,但是支持 Java和C 两种编 10 | 程语言。 11 | 12 | Zk 提供的功能: 13 | 1. 分布式锁: 解决分布式环境中数据一致性问题 14 | 2. 集群管理: 负载均衡容灾处理 15 | ``` 16 | 17 | ## 2 Zookeeper的数据模型 18 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201029153841423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 19 | ## 3 Zookeeper中数据模型的特点 20 | ```markdown 21 | 每个子目录如/node1都被称作一个znode(节点)。这个znode 22 | 是被它所在的路径唯一标识 23 | 24 | znode可以有子节点目录,并且每个znode可以存储数据 25 | 26 | znode是有版本的,每个znode中存储的数据可以有多个版本, 27 | 也就是一个访问路径中可以存储多份数据 28 | 29 | znode可以被监控,包括这个目录节点中存储的数据的修改, 30 | 子节点目录的变化等,一旦变化可以通知设置监控的客户端 31 | ``` 32 | 33 | ## 4 Zookeeper中节点的分类 34 | ```markdown 35 | 持久节点(PERSISTENT) 36 | 是指在节点创建后,就一直存在,直到有删除操作来主动删除这个 37 | 节点——不会因为创建该节点的客户端会话失效而消失 38 | 39 | 持久顺序节点(PERSISTENT_SEQUENTIAL) 40 | 这类节点的基本特性和上面的节点类型是一致的。额外的特性是, 41 | 在ZK中,每个父节点会为他的第一级子节点维护一份时序,会 42 | 记录每个子节点创建的先后顺序。基于这个特性,在创建子节 43 | 点的时候,可以设置这个属性,那么在创建节点过程中,ZK会 44 | 自动为给定节点名加上一个数字后缀,作为新的节点名。这个 45 | 数字后缀的范围是整型的最大值。 46 | 47 | 临时节点(EPHEMERAL) 48 | 和持久节点不同的是,临时节点的生命周期和客户端会话绑定。 49 | 也就是说,如果客户端会话失效,那么这个节点就会自动被清 50 | 除掉。注意,这里提到的是会话失效,而非连接断开。另外, 51 | 在临时节点下面不能创建子节点。 52 | 53 | 临时顺序节点(EPHEMERAL_SEQUENTIAL) 54 | ``` 55 | 56 | ## 5 Zookeeper中节点的监听 57 | ```markdown 58 | 客户端可以监测znode节点的变化。Zonode节点的变化触发相 59 | 应的事件,然后清除对该节点的监测。当监测一个znode节点时 60 | 候,Zookeeper会发送通知给监测节点。 61 | 62 | watch机制说明:一个Watch事件是一个一次性的触发器,当被 63 | 设置了Watch的数据发生了改变的时候,则服务器将这个改变 64 | 发送给设置了Watch的客户端,以便通知它们。 65 | 66 | 通过这个特性可以实现的功能包括配置的集中管理,集群管理, 67 | 分布式锁等等。 68 | ``` 69 | 70 | ## 6 zookeeper的安装 71 | ```markdown 72 | a) 下载zookeeper的安装包 73 | ``` 74 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020122607485331.png) 75 | ```markdown 76 | b) 上传至linux系统中 并使用 tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz 解压缩 77 | tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz 78 | c) 解压缩zookeeper的tar包 重命名为zk便于操作,(可省略) 79 | mv apache-zookeeper-3.6.2-bin zk 80 | d) 修改zk的conf目录下的zoo_simple.cfg,修改完后,重命名为zoo.cfg 81 | tickTime=2000 82 | initLimit=10 83 | syncLimit=5 84 | dataDir=/usr/local/zkData ----保存snapshot文件的路径 85 | clientPort=2181 86 | 87 | 各项参数说明: 88 | tickTime:配置单元时间。单元时间是ZooKeeper的时间计算单元, 89 | 其他的时间间隔都是使用tickTime的倍数来表示的。 90 | 91 | 92 | initLimit:节点的初始化时间。该参数用于Follower(从节点)的启动, 93 | 并完成与Leader(主节点)进行数据同步的时间。Follower节点在启 94 | 动过程中,会与Leader节点建立连接并完成对数据的同步,从而确 95 | 定自己的起始状态。Leader节点允许Follower节点在initLimit时 96 | 间内完成这项工作。该参数默认值为10,表示是参数tickTime值的10倍。 97 | 98 | 99 | syncLimit:心跳最大延迟周期。该参数用于配置Leader节点和 100 | Follower节点之间进行心跳检测的最大延时时间。在ZK集群运 101 | 行的过程中,Leader节点会通过心跳检测来确定Follower节点是 102 | 否存活。如果Leader节点在syncLimit时间内无法获取到Follower 103 | 节点的心跳检测响应,那么Leader节点就会认为该Follower节点已 104 | 经脱离了和自己的同步。该参数默认值为5,表示是参数tickTime值 105 | 的5倍。 106 | 107 | 108 | dataDir:是zookeeper持久化数据存放的目录。 109 | myid文件处于此目录下。 110 | 111 | 112 | dataLogDir:日志目录选项,如果没有设置该参数, 113 | 默认将使用和dataDir相同的设置。 114 | 115 | 116 | clientPort:zookeeper监听客户端连接的端口,默认是2181。 117 | 118 | 119 | e) 启动zk,在zk的bin目录下,运行zkServer.sh 120 | ./zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg 121 | ps: ./zkServer.sh help 可以查看服务器端所有可以执行的指令 122 | 123 | 补充: 124 | # 启动服务端 125 | $ bin/zkServer.sh start 126 | 127 | # 查看状态 128 | $ bin/zkServer.sh status 129 | 130 | # 停止 131 | $ bin/zkServer.sh stop 132 | 133 | # 重启 134 | $ bin/zkServer.sh restart 135 | f) 使用jps查看启动是否成功 136 | 46193 QuorumPeerMain # 表示成功 137 | g) 启动客户端连接到zk 138 | ./zkCli.sh -server 192.168.0.220:2181 139 | ps: 可以通过 ./zkCli.sh help 查看客户端所有可以执行的指令 140 | ``` 141 | 142 | 143 | ## 7 客户端基本指令 144 | ### 7.1 对 znode 进行增删改查等命令 145 | ```markdown 146 | 1.创建节点 create 注意: 默认是持久性节点 147 | create [-s] [-e] [-c] [-t ttl] path [data] [acl] 148 | -s 创建有序节点 149 | 如果在创建znode时,我们使用排序标志的话,ZooKeeper会在我们 150 | 指定的 znode 名字后面增加一个数字。我们继续加入相同名字 151 | 的znode时,这个数字会不断增加。这个序号的计数器是由这些排 152 | 序znode的父节点来维护的。 153 | 154 | -e 创建临时节点 155 | znode有两种类型:ephemeral 和 persistent。当创建znode的 156 | 客户端的session结束后,ephemeral类型的znode将被删除。 157 | persistent类型的znode在创建以后,就与客户端没什么联系了, 158 | 除非主动去删除它,否则他会一直存在。Ephemeral znode没有任 159 | 何子节点。 160 | 161 | acl 在下面的《ACL操作》中详细介绍。 162 | 163 | 普通节点 164 | [zk: localhost:2181(CONNECTED) 3] create /mynode hello 165 | Created /mynode 166 | [zk: localhost:2181(CONNECTED) 4] create /mynode/subnode world 167 | Created /mynode/subnode 168 | 169 | [zk: localhost:2181(CONNECTED) 9] get /mynode 170 | hello 171 | [zk: localhost:2181(CONNECTED) 10] get /mynode/subnode 172 | world 173 | 174 | 有序节点 175 | [zk: localhost:2181(CONNECTED) 4] create -s /mynode hello 176 | Created /mynode0000000004 177 | [zk: localhost:2181(CONNECTED) 6] create -s /mynode world 178 | Created /mynode0000000005 179 | 180 | 临时节点 181 | [zk: localhost:2181(CONNECTED) 7] create -e /temp hello 182 | Created /temp 183 | 退出 zkCli(quit或者直接退出连接终端工具),然后再重新打开它,/temp 节点已经被删除了(如果打开多个客户端,则所有客户端都退出节点才被删除)。 184 | 185 | 2.列出节点 ls 186 | ls [-s] [-w] [-R] path 187 | -w 添加一个 watch(监视器),如果该节点发生变化,watch 可以使客 188 | 户端得到通知。watch只能被触发一次。如果要一直获得 znode 的创 189 | 建和删除的通知,那么就需要不断的在znode上开启观察模式。如果 190 | 在该path下节点发生变化,会产生NodeChildrenChanged事件, 191 | 删除节点,会产生 NodeDeleted 事件。 192 | 193 | [zk: localhost:2181(CONNECTED) 12] ls / 194 | [mynode, mynode0000000003, mynode0000000004, test, zookeeper] 195 | [zk: localhost:2181(CONNECTED) 13] ls -s / 196 | [mynode, mynode0000000003, mynode0000000004, test, zookeeper] 197 | cZxid = 0x0 198 | ctime = Thu Jan 01 08:00:00 CST 1970 199 | mZxid = 0x0 200 | mtime = Thu Jan 01 08:00:00 CST 1970 201 | pZxid = 0x300000053 202 | cversion = 7 203 | dataVersion = 0 204 | aclVersion = 0 205 | ephemeralOwner = 0x0 206 | dataLength = 0 207 | numChildren = 5 208 | 209 | [zk: localhost:2181(CONNECTED) 2] ls /mynode 210 | [subnode] 211 | 212 | 使用 -w 查看 /mynode 节点,然后在它下面添加(删除)子节点, 213 | 就会触发该 watch。在其他节点下创建子节点,不会触发该 watch。 214 | 215 | [zk: localhost:2181(CONNECTED) 20] ls -w /mynode 216 | [subnode] 217 | [zk: localhost:2181(CONNECTED) 21] create /mynode/subnode2 218 | 219 | WATCHER:: 220 | 221 | WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/mynode 222 | Created /mynode/subnode2 223 | 224 | # 监听父节点,删除子节点,产生 NodeChildrenChanged事件 225 | [zk: localhost:2181(CONNECTED) 22] ls -w /mynode 226 | [subnode, subnode2] 227 | [zk: localhost:2181(CONNECTED) 23] delete /mynode/subnode2 228 | 229 | WATCHER:: 230 | 231 | WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/mynode 232 | 233 | # 监听子节点,删除子节点,产生 NodeDeleted 事件 234 | [zk: localhost:2181(CONNECTED) 51] create /mynode/subnode2 235 | Created /mynode/subnode2 236 | [zk: localhost:2181(CONNECTED) 52] ls -w /mynode/subnode2 237 | [] 238 | [zk: localhost:2181(CONNECTED) 53] delete /mynode/subnode2 239 | 240 | WATCHER:: 241 | 242 | WatchedEvent state:SyncConnected type:NodeDeleted path:/mynode/subnode2 243 | 244 | 从上面的操作可以看到,在 /mynode 下添加了subnode2节点之后, 245 | 触发了watch,WatchedEvent的类型是NodeChildrenChanged。 246 | 之后再删除 subnode2 节点,也出发了 watch。 247 | 248 | 3. 获取节点信息 get 249 | get [-s] [-w] path 250 | 251 | -w 添加一个 watch(监视器),如果节点内容发生改变,会产生 NodeDataChanged 事件;如果删除节点,会产生 NodeDeleted 事件。 252 | 253 | [zk: localhost:2181(CONNECTED) 33] get /mynode 254 | helloo 255 | [zk: localhost:2181(CONNECTED) 34] get -s /mynode 256 | helloo 257 | cZxid = 0x30000004c 258 | ctime = Sun Apr 05 15:48:14 CST 2020 259 | mZxid = 0x30000005d 260 | mtime = Sun Apr 05 16:05:56 CST 2020 261 | pZxid = 0x30000005c 262 | cversion = 7 263 | dataVersion = 1 264 | aclVersion = 0 265 | ephemeralOwner = 0x0 266 | dataLength = 6 267 | numChildren = 1 268 | 269 | # 监听节点内容,发生变化后,产生 NodeDataChanged 事件 270 | [zk: localhost:2181(CONNECTED) 35] get -w /mynode 271 | helloo 272 | [zk: localhost:2181(CONNECTED) 36] set /mynode hello 273 | 274 | WATCHER:: 275 | 276 | WatchedEvent state:SyncConnected type:NodeDataChanged path:/mynode 277 | 278 | # 删除节点,产生 NodeDeleted 事件 279 | [zk: localhost:2181(CONNECTED) 43] get -w /mynode/subnode 280 | world 281 | [zk: localhost:2181(CONNECTED) 44] delete /mynode/subnode 282 | 283 | WATCHER:: 284 | 285 | WatchedEvent state:SyncConnected type:NodeDeleted path:/mynode/subnode 286 | 287 | 每一个对znode树的更新操作,都会被赋予一个全局唯一的ID,我们称之为zxid 288 | (ZooKeeper Transaction ID)。更新操作的ID按照发生的时间顺序升序排序。 289 | 例如,z1大于z2,那么z1的操作就早于z2操作。 290 | 291 | 292 | 每个 znode 的状态信息包含以下内容: 293 | czxid,创建(create)该 znode 的 zxid 294 | mzxid,最后一次修改(modify)该znode的zxid 295 | pzxid,最后一次修改该znode子节点的 zxid 296 | ctime,创建该znode的时间 297 | mtime,最后一次修改该znode的时间 298 | dataVersion,该节点内容的版本,每次修改内容,版本都会增加 299 | cversion,该节点子节点的版本 300 | aclVersion,该节点的 ACL 版本 301 | ephemeralOwner,如果该节点是临时节点(ephemeral node),会列出该节点所在客户端的 session id;如果不是临时节点,该值为 0 302 | dataLength,该节点存储的数据长度 303 | numChildren,该节点子节点的个数 304 | 305 | 4.检查状态 stat 306 | stat [-w] path 307 | 308 | -w 添加一个 watch(监视器),如果节点内容发生改变,会产生 NodeDataChanged 事件;如果删除节点,会产生 NodeDeleted 事件。 309 | 与 get 的区别是,不会列出 znode 的值。 310 | 311 | [zk: localhost:2181(CONNECTED) 56] stat /mynode 312 | cZxid = 0x30000004c 313 | ctime = Sun Apr 05 15:48:14 CST 2020 314 | mZxid = 0x30000005e 315 | mtime = Sun Apr 05 16:09:32 CST 2020 316 | pZxid = 0x300000067 317 | cversion = 16 318 | dataVersion = 2 319 | aclVersion = 0 320 | ephemeralOwner = 0x0 321 | dataLength = 5 322 | numChildren = 0 323 | 324 | 5. 修改节点 set 325 | set [-s] [-v version] path data 326 | 修改已经存在的节点的值 327 | 328 | [zk: localhost:2181(CONNECTED) 57] set /mynode hello 329 | [zk: localhost:2181(CONNECTED) 58] ls /mynode 330 | [] 331 | [zk: localhost:2181(CONNECTED) 59] stat /mynode 332 | cZxid = 0x30000004c 333 | ctime = Sun Apr 05 15:48:14 CST 2020 334 | mZxid = 0x300000068 335 | mtime = Sun Apr 05 16:20:34 CST 2020 336 | pZxid = 0x300000067 337 | cversion = 16 338 | dataVersion = 3 339 | aclVersion = 0 340 | ephemeralOwner = 0x0 341 | dataLength = 5 342 | numChildren = 0 343 | 344 | 可以看到,在修改节点值之后,mZxid、mtime、dataVersion 都发生了变化。 345 | 346 | 6.删除节点 delete、deleteall 347 | delete [-v version] path 348 | 如果要删除的节点有子节点,不能删除 349 | [zk: localhost:2181(CONNECTED) 33] create /mynode/sub sub 350 | Created /mynode/sub 351 | [zk: localhost:2181(CONNECTED) 34] delete /mynode 352 | Node not empty: /mynode 353 | 354 | deleteall path [-b batch size] 355 | [zk: localhost:2181(CONNECTED) 34] delete /mynode 356 | 删除 /mynode,不会返回任何内容。如果有子节点的时候,都会删除。 357 | 358 | 调用delete和set操作时,如果指定znode版本号,需要与当前的版本号匹配。如 359 | 果版本号不匹配,操作将会失败。失败的原因可能是在我们提交之前,该znode 360 | 已经被修改过了,版本号发生了增量变化。如果不指定版本号,就是直接操作最 361 | 新版本的 znode。 362 | 363 | 364 | 7.历史记录 history 365 | history 列出最近的10条历史记录 366 | [zk: localhost:2181(CONNECTED) 7] history 367 | 0 - history 368 | 1 - create /mynode hello 369 | 2 - ls / 370 | 3 - set /mynode worold 371 | 4 - get /mynode 372 | 5 - stat /mynode 373 | 6 - rmr /mynode 374 | 7 - history 375 | ``` 376 | ## 8 ZK的集群架构图 377 | 378 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/202010291539516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 379 | ## 9 ZK集群的搭建 380 | ```markdown 381 | 1、在每台机器zookeeper/conf目录下创建三个zk配置文件, 382 | 为 zoo.cfg(可以将zookeeper里面的zoo_sample.cfg改为zoo.cfg,zookeeper 383 | 会按这个文件进行启动) 384 | 各个内容为(每个文件都是这个内容): 385 | tickTime=2000 386 | initLimit=10 387 | syncLimit=5 388 | dataDir=/usr/local/zookeeper/zkdata 389 | clientPort=2181 390 | server.1=192.168.42.129:2888:3888 391 | server.2=192.168.42.130:2888:3888 392 | server.3=192.168.42.131:2888:3888 393 | server.4=192.168.42.132:2888:3888 394 | server.5=192.168.42.133:2888:3888 395 | 396 | 397 | 2、在每台机器上创建数据存放的目录,存放的路径为 398 | dataDir=/usr/local/zookeeper/zkdata(跟你上面写的内容一样) 399 | 400 | 3、分别在每台机器上(dataDir=/usr/local/zookeeper/zkdata) 401 | 创建myid文件myid的内容分别是 402 | server.1=192.168.42.129:2888:3888中的数字1, 403 | server.2=192.168.42.130:2888:3888中的数字2, 404 | server.3=192.168.42.131:2888:3888中的数字3, 405 | server.4=192.168.42.132:2888:3888中的数字4, 406 | server.5=192.168.42.133:2888:3888中的数字5 407 | 408 | 409 | ps: server.X :x为服务器的唯一标识。 410 | 192.168.42.129:服务器所在的ip地址 411 | 2888:数据同步使用的端口号 412 | 3888:选举使用的端口号 413 | 414 | 4、分别启动各个zk服务器(进入zookeeper的bin目录) 415 | ./zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg (这里可以省略 /usr/local/zookeeper/conf/zoo.cfg) 416 | 417 | 5、查看各个zk服务器的角色信息(进入zookeeper的bin目录) 418 | ./zkServer.sh status /usr/local/zookeeper/conf/zoo.cfg (这里可以省略 /usr/local/zookeeper/conf/zoo.cfg) 419 | 420 | 6、客户端连接任意zk服务器进行节点操作(进入zookeeper的bin目录) 421 | ./zkCli.sh -server 192.168.42.129:2181(ip地址加端口)(连接本机则./zkCli.sh也行) 422 | 423 | 7.停止zk服务器(进入zookeeper的bin目录) 424 | ./zkServer.sh stop ./usr/local/zookeeper/conf/zoo.cfg (这里可以省略 /usr/local/zookeeper/conf/zoo.cfg) 425 | ``` 426 | 427 | ## 10 java操作ZK 428 | ```xml 429 | 项目中引入如下依赖: 430 | 431 | junit 432 | junit 433 | 4.12 434 | 435 | 436 | 437 | 438 | com.101tec 439 | zkclient 440 | 0.10 441 | 442 | ``` 443 | ### 10.1 通过zkClient创建节点 444 | ```java 445 | private ZkClient zkClient; 446 | 447 | /** 448 | * 获取zk客户端连接 449 | */ 450 | @Before 451 | public void Before(){ 452 | //参数1:服务器的ip和端口,多台机器之间使用“,”,隔开 453 | //参数2:会话的超时时间,sessionTimeout 毫秒 454 | //参数3:回话的连接时间 connectionTimeout 毫秒 455 | //参数4:序列化方式 456 | zkClient = new ZkClient("192.168.28.132:2181,192.168.28.132:2181",30000,60000,new SerializableSerializer()); 457 | } 458 | 459 | 460 | /** 461 | * 创建节点 462 | c */ 463 | @Test 464 | public void testCreateNode(){ 465 | //第一中创建方式 返回创建节点的名称 466 | String nodeName = zkClient.create("/node5","lisi", CreateMode.PERSISTENT); 467 | zkClient.create("/node6","zhangsan", CreateMode.PERSISTENT_SEQUENTIAL); 468 | zkClient.create("/node7","王五",CreateMode.EPHEMERAL); 469 | zkClient.create("/node8","xiaozhang",CreateMode.EPHEMERAL_SEQUENTIAL); 470 | //第二种创建方式 不会返回创建节点的名称 471 | zkClient.createPersistent("/node1","持久数据"); 472 | zkClient.createPersistentSequential("/node1/aa","持久数据顺序节点"); 473 | zkClient.createEphemeral("/node2","临时节点"); 474 | zkClient.createEphemeralSequential("/node1/bb","临时顺序节点"); 475 | } 476 | /** 477 | * 关闭资源 478 | */ 479 | @After 480 | public void after(){ 481 | zkClient.close(); 482 | } 483 | ``` 484 | ### 10.2 删除节点 485 | ```java 486 | /** 487 | * 删除节点 488 | */ 489 | @Test 490 | public void testDeleteNode(){ 491 | //删除没有子节点的节点 返回值:是否删除成功 492 | boolean delete = zkClient.delete("/node1"); 493 | //递归删除节点信息 返回值:是否删除成功 494 | boolean recursive = zkClient.deleteRecursive("/node1"); 495 | } 496 | 497 | ``` 498 | ### 10.3 查看节点的子节点 499 | ```java 500 | /** 501 | * 查询节点 502 | */ 503 | @Test 504 | public void testFindNodes(){ 505 | //获取指定路径的节点信息 //返回值: 为当前节点的子节点信息 506 | List children = zkClient.getChildren("/"); 507 | for (String child : children) { 508 | System.out.println(child); 509 | } 510 | } 511 | ``` 512 | 513 | ### 10.4 查看当前节点的数据 514 | ```java 515 | /** 516 | * 获取节点的数据 517 | * 518 | */ 519 | @Test 520 | public void testFindNodeData(){ 521 | Object readData = zkClient.readData("/node3"); 522 | System.out.println(readData); 523 | } 524 | 注意: 525 | 如果出现:org.I0Itec.zkclient.exception.ZkMarshallingError: 526 | java.io.StreamCorruptedException: invalid stream header: 61616161 527 | 异常的原因是: 在shell中的数据序列化方式 和java代码 528 | 中使用的序列化方式不一致导致 因此要解决这个问题只需要 529 | 保证序列化一致即可都使用相同端操作即可 530 | ``` 531 | 532 | ### 10.5 查看当前节点的数据并获取状态信息 533 | ```java 534 | /** 535 | * 获取数据以及当前节点的状态信息 536 | */ 537 | @Test 538 | public void testFindNodeDataAndStat(){ 539 | Stat stat = new Stat(); 540 | Object readData = zkClient.readData("/node60000000024",stat); 541 | System.out.println(readData); 542 | System.out.println(stat); 543 | } 544 | ``` 545 | ### 10.6 修改节点的数据 546 | ```java 547 | /** 548 | * 修改节点数据 549 | */ 550 | @Test 551 | public void testUpdateNodeData(){ 552 | zkClient.writeData("/node60000000024", new User("121","name","xxx")); 553 | } 554 | ``` 555 | 556 | ### 10.7 监听节点数据的变化 557 | ```java 558 | /** 559 | * 监听节点数据的变化 560 | */ 561 | @Test 562 | public void testOnNodeDataChange() throws IOException { 563 | zkClient.subscribeDataChanges("/node60000000024", new IZkDataListener() { 564 | 565 | //当节点的值在修改时,会自动调用这个方法 将当前修改节点的名字,和节点变化之后的数据传递给方法 566 | @Override 567 | public void handleDataChange(String nodeName, Object result) throws Exception { 568 | System.out.println(nodeName); 569 | System.out.println(result); 570 | } 571 | 572 | //当节点的值被删除的时候,会自动调用这个方法,会将节点的名字已参数形式传递给方法 573 | @Override 574 | public void handleDataDeleted(String nodename) throws Exception { 575 | System.out.println("节点的名字:"+nodename); 576 | } 577 | }); 578 | //阻塞客户端 579 | System.in.read(); 580 | } 581 | 582 | ``` 583 | ### 10.8 监听节点目录变化 584 | ```java 585 | /** 586 | * 监听节点的变化 587 | */ 588 | @Test 589 | public void testOnNodesChange() throws IOException { 590 | zkClient.subscribeChildChanges("/node60000000024", new IZkChildListener() { 591 | //当节点的发生变化时,会自动调用这个方法 592 | //参数1:父节点名称 593 | //参数2:父节点中的所有子节点名称 594 | @Override 595 | public void handleChildChange(String nodeName, List list) throws Exception { 596 | System.out.println("父节点名称: "+nodeName); 597 | System.out.println("发生变更后字节孩子节点名称:"); 598 | for (String name : list) { 599 | System.out.println(name); 600 | } 601 | } 602 | }); 603 | //阻塞客户端 604 | System.in.read(); 605 | } 606 | ``` 607 | ## 11 图片总结 608 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201029155158274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 609 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020102915520625.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 610 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201029155214805.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 611 | ```markdown 612 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 613 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复zk 614 | 即可获取笔记获取方式。 615 | ``` 616 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | -------------------------------------------------------------------------------- /博客markdown笔记/计算机基础/从前慢-UML.md: -------------------------------------------------------------------------------- 1 | # UML 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703132222887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 UML与面向对象 5 | ```markdown 6 | 在结构化开发方法中: 7 | 系统分析的建模语言是数据流图,系统设计的建模语言 8 | 是模块结构图。 9 | 10 | 在面向对象开发方法中: 11 | 系统分析与设计的建模语言是UML 12 | 13 | UML仅仅是一种语言。它不是一种系统设计的方法,而是系统建模的标准。 14 | ``` 15 | ### 1.1 UML视图 16 | ```markdown 17 | 用例视图 18 | 用例是系统中的一个功能单元。用例视图是其他视图的核心, 19 | 从系统外部参与者的角度描述系统应该具有的功能。 20 | 21 | 逻辑视图 22 | 设计人员和开发人员使用逻辑视图来描述用例视图提出的系 23 | 统功能的实现,包括静态结构(类图、对象图)和动态协作 24 | 关系(状态图、时序图、协作图、活动图)。 25 | 26 | 27 | 并发视图 28 | 开发人员和系统集成人员考虑资源的有效利用、代码的并行 29 | 执行和系统环境中的异步事件的处理而使用的图形,包括状 30 | 态图、协作图、活动图。 31 | 组件视图 32 | 组件是不同类型的代码模块,是构造应用的软件单元;组件 33 | 视图是开发人员用于描述系统的实现模块以及它们之间的依 34 | 赖关系的图。 35 | 部署视图 36 | 开发人员、系统集成人员和测试人员使用的。用来显示系 37 | 统的物理部署,描述了位于节点上的运行实例的部署情况。 38 | ``` 39 | ### 1.2 UML图 40 | ```markdown 41 | UML1.x提供了九种不同的图,可以分为两大类: 42 | 静态图:用例图、类图、对象图、组件图和部署图; 43 | 动态图:序列图、协作图、状态图和活动图。 44 | 45 | UML2.0又增加了:静态图-(包图、组成结构图) 46 | 、动态图-(交互纵览图、计时图),总共13种图。 47 | ``` 48 | ## 2 用例图 49 | ~~~markdown 50 | 用例图有参与者、用例、系统、关系组成 51 | 用例需要用动宾词语表示,用例图用来描述需求场景。参与者实际上就是一个类 52 | 用例通常用普通正文描述,也可用活动图来描述。 53 | ~~~ 54 | ### 2.1 用例的描述 55 | ```markdown 56 | 用例通常用正文来描述,也可用活动图来描述 。 57 | 58 | 用例的正文描述应包括以下内容: 59 | 1 名称、标识符、参与者、状态 60 | 61 | 2 用例的目的:用例的最终目的是什么?它试图达到什么? 62 | 用例是如何启动的(前置条件):哪个执行者在什么情况 63 | 下启动用例的执行? 64 | 65 | 3 执行者和用例之间的消息流(基本操作流程):用例与执 66 | 行者之间交换什么消息或事件来通知对方改变或恢复信 67 | 息?描述系统与执行者之间的主消息流是什么?以及系 68 | 统中哪些实体被使用或修改? 69 | 70 | 4 用例中可供选择的流(可选操作流程):用例中的活动可 71 | 根据条件或异常(exception)有选择地执行。 72 | 73 | 5 如何通过给执行者一个值来结束用例(后置条件):描 74 | 述何时可认为用例已结束. 75 | 76 | 77 | 补充:事件流(flow of events)- 78 | 事件流是一系列陈述句,它是从执行者的角度 看,列出用例的各个步骤 79 | 。用例描述中可以包含条件、分支和循环。 80 | 81 | 82 | 事件流可分为两部分: 83 | 基本路径 84 | 基本路径是运转正常时的路径,是一系列没有分支和选择的简单陈述句 85 | 可选路径 86 | 可选路径是指不同于基本路径而允许不同的事件序列的路径。 87 | 对于明显有可能随时发生的事情来说,可选路径非常有效。 88 | 89 | 90 | 总结: 91 | 描述用例包括:前置条件(前提条件)/事件流(操作步骤:基本路径/可选路径 92 | (非正常情况))/后置条件 93 | ``` 94 | ### 2.2 实 例 一 95 | ```markdown 96 | 实 例 一 97 | 执行者的简要描述 98 | 客户:向公司订购商品的人 99 | 客户代表:公司处理客户请求的雇员 100 | 库存系统:记录公司库存的软件 101 | 用例的简要描述 102 | 订购货物:客户创建一个新的请求商品的订单,并为那些商品付费 103 | 取消订单:客户取消一个已经存在的订单 104 | 105 | 106 | 例如:订购货物用例的描述如下所示。 107 | 用例名称:订购货物 108 | 参与的执行者:客户、客户代表 109 | 前置条件:一个合法的客户已经登录到这个系统 110 | 事件流: 111 | 1.当客户选择订购货物时,用例开始 112 | 2.客户输入他的姓名和地址 113 | 3.如果客户只输入邮编,系统将给出州和城市名 114 | 4.当客户输入产品代码 115 | a.系统给出产品描述和价格 116 | b.系统往客户订单中添加该物品的价格 117 | 循环结束 118 | 5.客户输入信用卡支付信息 119 | 6. 客户选择提交 120 | 7.系统检验输入的信息,把该订单作为未完成的交易保存, 121 | 同时向记账系统转发支付信息。如果客户提交的信息不正 122 | 确,系统将提示客户修改。 123 | 8.当支付确认后,订单就被标记上已经确认,同时返回给 124 | 客户一个订单ID,用例也就结束了。如果支付没有被确 125 | 认,系统将提示客户改正支付信息或者取消。如果客户 126 | 选择修改信息,就回到第5步;如果选择取消,用例结束。 127 | 后置条件:如果订单没有被取消,它将保存在系统中, 128 | 并做上标记;如果订单取消则不保存。 129 | 130 | 这里也可以将事件流分出来(建议这样做): 131 | 订购货物用例的基本路径和可选路径: 132 | 基本路径 133 | 7. 当客户选择订购货物时,用例开始 134 | 8. 客户输入他的姓名和地址 135 | 9. 当客户输入产品代码时 136 | a. 系统给出产品描述和价格 137 | b. 系统往客户订单中添加该物品的价格 138 | 循环结束 139 | 10. 客户输入信用卡支付信息 140 | 11. 客户选择提交 141 | 12. 系统检验输入的信息,把该订单作为未完成的交易保存,同时 142 | 13. 向记账系统转发支付信息 143 | 14. 当支付确认后,订单就被标记上已经确认,同时返回给客户一个 144 | 15. 订单ID,用例结束 145 | 146 | 147 | 如果在订购货物用例中,客户可以在提交订单前随时取消订单,其 148 | 可选路径如下: 149 | 可选路径: 150 | 在选择提交前的任何时候,客户都可选择cancel。这次订购没有被 151 | 保存,用例结束。 152 | 在基本路径第6步,如果有任何不正确的信息,系统提示客户去修 153 | 改这些信息。 154 | 在基本路径第7步,若支付没有被确认,系统将提示客户改正支付 155 | 信息或者取消。若客户选择修改信息,就回到基本路径第4步;若 156 | 选择取消,用例结束。 157 | ``` 158 | ### 2.3 实 例 二 159 | 160 | ```markdown 161 | 本案例实现一个简化了的银行储蓄账户管理系统,该系统是在银行的柜 162 | 台上对客户办理活期储蓄业务。系统的需求陈述如下: 163 | 一个客户可以在多个银行中开设账户,一个客户也可在同一银行中开 164 | 设多个不同的账户。客户可以通过银行职员进行开户、存款、取款、 165 | 转账、注销账户等活动。其中转账指客户将自己的某个账户上的钱款 166 | 转入同一银行的不同账户(称为银行内转账)或转入不同银行 167 | 的账户(称为银行间转账)。系统管理员负责系统的账户管理 168 | 及业务报表的生成。 169 | 170 | 171 | 识别执行者 172 | 客户:到银行办理储蓄业务的人,负责输入密码 173 | 银行职员(客户代理):银行工作人员,代表客户进行储蓄业务的操作 174 | 银行职员(管理人员):银行工作人员,根据客户的储蓄业务更新账户 175 | 管理员:银行计算机的管理人员,负责账户的管理和业务报表的生成 176 | 177 | 178 | 识别用例 179 | 从系统的需求陈述可知,银行职员(客户代理)需要系统提 180 | 供开户、存款、取款、转账、注销账户等功能,这些功能都 181 | 包含了校验密码的功能。系统管理员需要系统提供账户管理和 182 | 报表生成功能。银行职员(管理人员)则参与了账户管理中的更新 183 | 账户的功能。此外,转账功能可分为银行内转账和银行间转账, 184 | 可将它们设计成三个用例,其中银行内转账用例和银行间转账 185 | 用例都继承了基本转账用例。据此分析,得到该系统的 186 | 用例图如下图所示。 187 | 188 | ``` 189 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629092622853.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 190 | ```markdown 191 | 开户用例描述 192 | 用例名称:开户 193 | 参与的执行者:银行职员(客户代理),客户 194 | 前置条件:一合法的银行职员(客户代理)已登录到该系统 195 | 事件流: 196 | 1.当选择开户功能时用例开始 197 | 2.输入客户信息(姓名、地址、身份证号等) 198 | 3.从账户管理系统获取新的账号 199 | 4.请客户输入密码 200 | 5.请客户再次输入密码 201 | 6.如果两次密码不一致则回到第4步,否则继续 202 | 7.在账户库中添加新账户 203 | 8.打印存折,用例结束 204 | 后置条件:在账户库中增加了一个新账户,得到一张新存折 205 | 206 | 207 | 取款用例描述 208 | 用例名称:取款 209 | 参与的执行者:银行职员(客户代理) 210 | 前置条件:一合法的银行职员(客户代理)已登录到该系统 211 | 事件流: 212 | 基本路径: 213 | 1.当选择取款功能时用例开始 214 | 2.当输入客户信息(姓名、账号等)后 215 | a)如果客户信息与账户不一致,显示错误信息,可以重新 216 | 输入或结束用例 217 | b)如果该账户被冻结(如因挂失而冻结),显示冻结信息 218 | 并结束用例 219 | 3.输入并校验密码 220 | 4.输入取款金额,若该账户的余款小于取款金额,显示错误信 221 | 息,要求重新输入 222 | 5.打印取款单,交客户签字 223 | 6.建立取款事件记录,更新账户信息 224 | 7. 打印存折,用例结束 225 | 可选路径: 226 | 1.在第5步客户签字之前的任何时刻,客户可以取消本次取款, 227 | 用例结束 228 | 2.第3步校验密码时,如发现密码不一致,则重新输入密码, 229 | 或用例结束 230 | 后置条件:如果取款成功,客户账户中的余额被更新(减少), 231 | 否则余额不变。 232 | ``` 233 | ### 2.4 用例之间的关系 234 | ~~~markdown 235 | 关联关系: 执行者与用例之间的关系,用 —————表示 236 | 237 | 238 | 包含关系:表示A需要用到B,需要把B给用进去(一般是把公共部分提 239 | 《include》 240 | 取出来),用A------------>B表示;(缺少了B,则A则不完整) 241 | 242 | 《extend》 243 | 扩展关系:表示A的功能可以再扩展,可以用B来补充,用B---------->A 244 | 表示(缺少了B,A仍然完整) 245 | 246 | 泛化关系:表示所谓的继承关系,比如A是子类,B是父类,则A————▷B表示 247 | 248 | 249 | 总结: 250 | 泛化:同一业务目的的不同技术实现 251 | 252 | 包含:提取公共交互,提高复用 253 | 254 | 扩展:“冻结”基用例以保持稳定,并且动态扩展基用例功能 255 | ~~~ 256 | #### 2.4.1 包含举例 257 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702230324412.png) 258 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702230330796.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 259 | 260 | #### 2.4.2 扩展举例 261 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702230440476.png) 262 | 263 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702230445616.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 264 | #### 2.4.3 包含用例与扩展用例的区别 265 | ```markdown 266 | 1 相对于基础用例,扩展用例是可选的,而包含用例则不是。 267 | 2 如果缺少扩展用例,基础用例还是完整的,而缺少包含用例, 268 | 则基础用例就不完整了。 269 | 3 扩展用例的执行需要满足某种条件,而包含用例不需要。 270 | 4 扩展用例的执行会改变基础用例的行为,而包含用例不会. 271 | ``` 272 | ## 3 类图、对象图和包图 273 | 274 | ### 3.1 类图 275 | ```markdown 276 | 在面向对象的处理中,类图处于核心地位,它提供了用于定义 277 | 和使用对象的主要规则。 278 | 类图是正向工程(将模型转化为代码)的主要资源,是逆向 279 | 工程(将代码转化为模型)的生成物。 280 | 281 | 类名必须大写 282 | 属性跟操作名必须小写。 283 | UML规范采用3个预定义分栏的图标表示类,分栏中包含的信 284 | 息有:名称、属性和操作表示。 285 | ``` 286 | ### 3.2 类和对象的表示 287 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702231427317.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 288 | 289 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702221929706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 290 | 291 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200408151033508.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 292 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020040815110279.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 293 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200408151126686.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 294 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200408151220314.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 295 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020040815125670.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 296 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200408151346833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 297 | ### 3.3 类之间的关系 298 | ![ ](https://img-blog.csdnimg.cn/20200626162114718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 299 | #### 3.3.1 关联关系 300 | ```markdown 301 | 用一条无向线段表示,是一种双向关系。例如客户和订 302 | 单的关联:从客户看,订单是他提交的;从订单看,它 303 | 有一个客户。 304 | 用一条有向线段表示,是一种单向关系. 305 | 306 | 关联的命名:可以用动词词组或名词命名。但只要这个关联的含义 307 | 明确,则可省略这个名字。 308 | ``` 309 | ##### 3.3.1.1 角色的多元性 310 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702232537569.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 311 | ##### 3.3.1.2 关联关系实例 312 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402140749867.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 313 | 3![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402141659523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 314 | 315 | ##### 3.3.1.3 聚合关系 316 | ~~~markdown 317 | 聚合关系描述的是整体和部分的关系.聚合关系是比较特殊的关联关 318 | 系,比如:一个教室当中有多个学生,教室和学生之间的关系就是整 319 | 体和部分的关系,在聚合关系中,整体的生命周期不会决定部分的生 320 | 命周期,例如:教室没了,学生还在,或者说学生走了,教室还在. 321 | ~~~ 322 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402142927327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 323 | ##### 3.3.1.4 组合关系 324 | ~~~markdown 325 | 组合关系可以看做是一种特殊的聚合关系,整体的生命周期决定部分 326 | 的生命周期,部分是依附在整体上面的,部分离开了整体是无法“存活的”。 327 | ~~~ 328 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702233704506.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 329 | #### 3.3.2 泛化关系 330 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402135955989.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 331 | #### 3.3.3 实现关系 332 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402140222441.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 333 | #### 3.3.4 依赖关系 334 | ~~~markdown 335 | 依赖关系是所有关系中最弱的一种这种关系。通常体现在类和局部变 336 | 量之间的关系. 337 | ~~~ 338 | 339 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402143928808.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 340 | 341 | ### 3.4 对象图、包图 342 | #### 3.4.1 对象图 343 | ```markdown 344 | 对象图中的建模元素有对象和链.对象是类的实例,对象之间的链是 345 | 类之间的关联的实例,对象图实质上是类图的实例 346 | 347 | UML中对象图的图标也是一个矩形,和类的图标一样,但是对象名下面 348 | 要带下划线。在左边的这个图标中,具体实例的名字位于冒号的左边, 349 | 而该实例所属的类名位于冒号的右边。实例的名字以一个小写字母开头。 350 | 也可以是一个匿名的对象,如图右边所示。这仅仅意味着指明了对象所属 351 | 的类,但并没有提供一个具体的对象名。 352 | 353 | 对象之间的关系,被称为链 354 | 355 | 对象是类的实例,链是关联的实例 356 | 357 | 对象的基本特征可以归纳为对象的属性和行为两类,对象名必须小写 358 | ``` 359 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702234832224.png) 360 | #### 3.4.2 包图 361 | ```markdown 362 | 可类比java中的包机制 363 | 包图只有依赖关系 364 | 365 | 当一个包将另一个包导入时,该包里的元素能够使用被导入包里的元 366 | 素,而不必在使用时通过包名指定其中的元素。 367 | 例如,当使用某个包中的类时,如果未将包导入,则需要使用包名加 368 | 类名的形式引用指定的类。在导入关系中,被导入的包称为目标包。 369 | 要在UML中显示导入关系,需要画一条从包连接到目标包的依赖性箭 370 | 头,再加上字符import,如图所示。 371 | 372 | A包导入B包,则可以直接使用B包中的类。如果没有的话,则是B.类表示 373 | ``` 374 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702235237173.png) 375 | ## 4 活动图 376 | ```markdown 377 | 活动图本质是上是一种流程图,但是活动图是面向对象的,而流程图是面 378 | 向过程的。 379 | ``` 380 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070300061596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 381 | ### 4.1 活动图与流程图的区别 382 | ```markdown 383 | 流程图着重描述处理过程,它的主要控制结构是顺序、分支和循环, 384 | 各个处理之间有严格的顺序和时间关系; 385 | 活动图描述的则是对象活动的顺序关系所遵循的规则,它着重表现的 386 | 是系统的行为,而非系统的处理过程。 387 | 活动图能够表示并发活动的情形; 388 | 流程图做不到。 389 | 活动图是面向对象的; 390 | 流程图是面向过程的。 391 | ``` 392 | ### 4.2 活动图实例 393 | ```markdown 394 | 用户登录系统的活动图 395 | 输入网址、显示主页、输入登录信息、验证 396 | ``` 397 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703003346374.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 398 | 399 | ```markdown 400 | 教师上传课件的活动图 401 | 上传文件、验证容量、存储文件、管理员授权、更新网页 402 | ``` 403 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070300335761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 404 | 405 | ```markdown 406 | 系统管理员维护网站的活动图 407 | 登录、更新信息、处理CAI、保存 408 | ``` 409 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070300340677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 410 | ## 5 顺序图(跟协作图,也叫做通信图等价) 411 | ```markdown 412 | 顺序图用来建模以时间顺序安排的对象交互,并且把用例行为分配给类。 413 | 顺序图与活动图具有类似的作用。其中重要的理由就是实现用例。任何用 414 | 例都可以使用顺序图进一步阐明和实现。 415 | 416 | 顺序图主要有:对象、生命线、消息和激活。 417 | 顺序图有两个主要的标记符:活动对象和这些活动对象之间的通信消息。 418 | 活动对象可以是任何在系统中扮演角色的对象,不管它是对象实例还是 419 | 参与者,如下图所示。 420 | ``` 421 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402152532645.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 422 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402152635676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 423 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402152749245.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 424 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402152934645.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 425 | ### 5.1 顺序图和协作图的区别 426 | ```markdown 427 | 顺序图 428 | 它描述对象按时间顺序的消息交换过程,它体现出系统用例的行为。 429 | 协作图 430 | 它描述对象间的组织协作关系,它也可体现出系统用例的行为。 431 | 432 | 433 | 顺序图和协作图都可以表示对象间的交互关系,但它们的侧重点不同。 434 | 顺序图用消息的几何排列关系来表达对象间交互消息的先后时间顺序。 435 | 而协作图用建模对象(或角色)间的通信关系。 436 | ``` 437 | ### 5.2 用例图、类图、顺序图对比 438 | ```markdown 439 | 用例图描述了系统必须做什么(有什么功能);类图描述了组成系统结 440 | 构各部分的各种类型。顺序图描述了对象之间传递消息的时间顺序, 441 | 它用来表示用例中的行为顺序。 442 | 顺序图是来描述对象的,所以所有顺序图中所有活动对象都要在类图 443 | 能找到。 444 | 用例跟用例之间不能直接通信。必须通过对象作为中间介进行通信。 445 | ``` 446 | ## 6 协作图 447 | ```markdown 448 | 与顺序图等价 449 | ``` 450 | ## 7 时序图 451 | ```markdown 452 | 时序图侧重于描述时间对系统交互的影响,因此时序图的一个重要的特 453 | 征是加入了时间元素。 时序图上的时间由左到右横跨页面。 454 | ``` 455 | ## 8 状态图 456 | ```markdown 457 | 一般不去描述参与者类对象的状态。要描述的是系统内部的 458 | 核心对象的状态。 459 | 460 | 需求过程,需要描述一个对象的状态跟踪的时候,比如一个表 461 | 单在不同环节审批的状态; 462 | 状态图描述的是一个对象 463 | 状态图就是一个开关,是描述状态变化的图形; 464 | ``` 465 | 466 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200625110633539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 467 | ### 8.1 活动图与状态图 468 | ```markdown 469 | 活动图描述的是用例的行为,而状态图描述的是对象。活动图可 470 | 以包含多个对象。而状态图只可以包含一个对象。 471 | ``` 472 | ## 9 构造实现方式图 473 | ```markdown 474 | 包括有组件图跟部署图 475 | ``` 476 | ### 9.1 组件图 477 | ```markdown 478 | 组件图显示软件组件的组织以及组件之间的依赖关系,包 479 | 括源代码组件、二进制代码组件以及可执行组件。 480 | 包括组件、接口、依赖关系 481 | ``` 482 | #### 9.1.1 组件图实例 483 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703012904810.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 484 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703012921670.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 485 | #### 9.1.2 组件与类的比较 486 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703013352816.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 487 | 488 | ### 9.2 部署图 489 | ```markdown 490 | 组件图用来建模软件组件,而部署图用来对部署系统时涉及到 491 | 的硬件进行建模。 492 | 节点表示一种硬件。组件表示逻辑元素的物理包装,即类的 493 | 物理包装,而节点表示组件的物理配置。 494 | 节点的种类:处理器跟设备。 495 | 处理器是能够执行软件、具有计算能力的节点。设备是没有计 496 | 算能力的节点,通常情况下都是通过其接口为外部提供某种服务。 497 | ``` 498 | #### 9.2.1 部署图实例 499 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703014700742.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 500 | 501 | 502 | 503 | ## 10 UML与数据库设计 504 | ```markdown 505 | 依赖关系强调的是类操作间的使用关系,类图到表结构的映射中并不涉及这种关系,所以下面只讨论泛化关系、关联关系到表的映射规范。 506 | 507 | 不需要画ER图,因为已经有类图了 508 | ``` 509 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703015747626.png) 510 | 511 | ### 10.1 泛化关系的映射 512 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703015920422.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 513 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703015938194.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 514 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703015949228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 515 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020001214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 516 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020018442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 517 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020031298.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 518 | ### 10.2 关联关系的映射 519 | ```markdown 520 | 关联关系:一对一关联、一对多关联和多对多关联。 521 | ``` 522 | #### 10.2.1 一对一映射 523 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020227869.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 524 | #### 10.2.2 一对多映射 525 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020319451.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 526 | #### 10.2.3 多对多映射 527 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020349288.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 528 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703020433900.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 529 | ### 10.3 数据库设计原则 530 | ```markdown 531 | 每一个类成为一个数据库表。 532 | 关系映射: 533 | 一对多的关系映射为数据库表的主外键关联(1方的主键加入n方成为外键) 534 | 一对一的关系映射为数据库表的主外键关联(1方的 主键加入另一方成为外键) 535 | 多对多的关系映射:产生第三张表,将两个多方的主键加入其中成为外键,两 536 | 个外键的组合成为主键。 537 | 利用数据库三范式检查表,从而考察类图的分析是否合理,消除冗余数据。 538 | 检查数据是否能够反映用例视图的需要;进一步与用户再次确认使用的数据。 539 | ``` 540 | ## 11 毕设 541 | ```markdown 542 | 必须:毕业设计是只要是面向对象,就一定要有用例图、类图、顺序图、组件图、部署图。 543 | 灵活采用:活动图、状态图 544 | 选用,可有可无:计时图、对象图、包图、组成结构图、交互概览图。 545 | ``` 546 | ```markdown 547 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 548 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复UML 549 | 即可获取笔记获取方式。 550 | ``` 551 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 552 | 553 | -------------------------------------------------------------------------------- /博客markdown笔记/后端杂烩/从前慢-网络编程.md: -------------------------------------------------------------------------------- 1 | # 网络编程 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210713135206470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 什么是网络编程 5 | ```markdown 6 | 网络编程的本质是两个设备之间的数据交换,当然,在计算机网 7 | 络中,设备主要指计算机。数据传递本身没有多大的难度,不 8 | 就是把一个设备中的数据发送给两外一个设备,然后接受另外 9 | 一个设备反馈的数据。 10 | 11 | 12 | 现在的网络编程基本上都是基于请求/响应方式的,也就是一个 13 | 设备发送请求数据给另外一个,然后接收另一个设备的反馈。 14 | 15 | 在网络编程中,发起连接程序,也就是发送第一次请求的程序, 16 | 被称作客户端(Client),等待其他程序连接的程序被称作服务器 17 | (Server)。客户端程序可以在需要的时候启动,而服务器为了 18 | 能够时刻响应连接,则需要一直启动。例如以打电话为例,首 19 | 先拨号的人类似于客户端,接听电话的人必须保持电话畅通 20 | 类似于服务器。 21 | 22 | 总结: 通过编码的方式让不同计算机之间通过网络相互 23 | 通信(传递数据) 24 | ``` 25 | 26 | ## 2 网络编程要解决的核心的问题 27 | ```markdown 28 | 1. 寻址: 使用ip+端口 29 | 2. 协议: 数据的传输规则|方式 30 | ``` 31 | ## 3 常见的协议有哪些 32 | ```markdown 33 | 1). UDP 协议 34 | 面向非连接的协议,传递数据时不关心连接状态直接发送,他的 35 | 传输效率高,传递的数据不安全 36 | 2). TCP/IP 协议 37 | 面向连接的协议,传递数据时关系连接的状态,连接成功才会发 38 | 送数据,他的传输效率相对于UDP协议要低,会通过三次握手机 39 | 制保证数据的完整性 40 | 3). Http 协议 41 | 属于应用层协议,层面比较高,http协议底层还是通过tcp协议传输 42 | ``` 43 | 44 | ## 4 网络中的OSI模型 45 | ```markdown 46 | OSI是Open System Interconnection的缩写,意为开放 47 | 式系统互联. OSI 七层模型通过七个层次化的结构模型使 48 | 不同的系统不同的网络之间实现可靠的通讯,因此其最主 49 | 要的功能就是帮助不同类型的主机实现数据传输 50 | 注意: 所处的层越低传输效率越高 51 | ``` 52 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020103110254028.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 53 | 54 | 55 | 56 | 57 | ## 5 常见的网络编程 58 | ```markdown 59 | 浏览器 ---------------------> 服务器 60 | chorme tomcat 61 | 62 | c/s:访问某个服务器端的时候,需要特定的客户端 63 | b/s:浏览器,是一个公共的客户端,通过浏览器可以给不同 64 | 的服务器发送数据 65 | 66 | 客户端: 67 | 1 c/s模式中对应的客户端 68 | 2 b/s中的浏览器,通用的客户端 69 | 3 通过代码实现: http-client(模拟浏览器) 70 | 4 自己书写一个客户端 71 | 72 | 服务器: 73 | 自己编写 74 | ``` 75 | 76 | ## 6 java中网络编程的实现方式 77 | ```markdown 78 | java中实现网络编程,也叫(Socket)编程,通过java实现 79 | 网络编程主要有以下几种方式 80 | 1 java BIO:基于java阻塞io实现网络编程 81 | (Block IO 同步阻塞IO) 82 | 2 java NIO:基于java的同步非阻塞IO实现网络编程 83 | (New IO 同步非阻塞IO) 84 | ``` 85 | 86 | ## 7 java中网络编程的开发思路 87 | ```markdown 88 | 使用java语言开发网络编程,主要用到其核心类:Socket,翻译 89 | 为:套接字,socket类中封装了系列网络编程的api 90 | 91 | 1 开发服务端 92 | ServerSocket:专门用来书写服务器端 93 | 1 服务器端一直活着 94 | 2 服务器端的accept()能够重复调用 95 | 2 开发客户端 96 | Socket:专门用来书写客户端 97 | ``` 98 | 99 | ## 8 网络编程的实现 100 | ### 8.1 网络编程开发服务器端 101 | ```java 102 | package com.yxj.servers; 103 | 104 | import java.io.IOException; 105 | import java.io.InputStream; 106 | import java.io.OutputStream; 107 | import java.net.ServerSocket; 108 | import java.net.Socket; 109 | 110 | /** 111 | * 创建serverScoket对象 服务端对象 112 | */ 113 | public class TestServerSocket { 114 | 115 | public static void main(String[] args) throws IOException { 116 | //创建一个服务器 117 | ServerSocket serverSocket = new ServerSocket(8989); 118 | System.out.println("服务器已经启动........"); 119 | while(true) { 120 | //让服务器接受|接收客户端 121 | Socket socket = serverSocket.accept(); 122 | 123 | //处理请求数据 124 | InputStream inputStream = socket.getInputStream(); 125 | StringBuilder builder = new StringBuilder(); 126 | int len = 0; 127 | byte[] b = new byte[1024]; 128 | while (true) { 129 | len = inputStream.read(b); 130 | if (len == -1) break; 131 | builder.append(new String(b, 0, len)); 132 | } 133 | 134 | System.out.println(builder.toString()); 135 | socket.shutdownInput();//获取请求数据 结束 136 | //处理业务 137 | //服务端响应客户端数据 138 | OutputStream outputStream = socket.getOutputStream(); 139 | outputStream.write("讲".getBytes()); 140 | socket.shutdownOutput(); 141 | } 142 | } 143 | 144 | } 145 | 146 | ``` 147 | 148 | ### 8.2 网络编程开发客户端 149 | ```java 150 | package com.yxj.client; 151 | 152 | 153 | import java.io.IOException; 154 | import java.io.InputStream; 155 | import java.io.OutputStream; 156 | import java.net.Socket; 157 | 158 | //创建客户端对象 159 | public class TestSocket { 160 | 161 | public static void main(String[] args) throws IOException { 162 | 163 | //创建socket对象 164 | Socket socket = new Socket("192.168.0.3", 8989); 165 | 166 | //向服务器发送数据 167 | OutputStream outputStream = socket.getOutputStream(); 168 | outputStream.write("hello Server".getBytes()); 169 | //代表客户端发送的数据完成 170 | socket.shutdownOutput(); 171 | 172 | 173 | //获取服务器端响应数据 174 | InputStream inputStream = socket.getInputStream(); 175 | int len = 0; 176 | byte[] b = new byte[1024]; 177 | StringBuilder builder = new StringBuilder(); 178 | while(true){ 179 | len = inputStream.read(b); 180 | if(len==-1) break; 181 | builder.append(new String(b,0,len)); 182 | } 183 | System.out.println(builder.toString()); 184 | 185 | socket.shutdownInput();//确定读取响应数据结束 186 | 187 | 188 | } 189 | 190 | } 191 | ``` 192 | 193 | ## 9 网络编程服务端之支持多客户端访问 194 | ```markdown 195 | TestSocket001 196 | ``` 197 | 198 | ```java 199 | package com.yxj.client; 200 | 201 | import java.io.*; 202 | import java.net.Socket; 203 | 204 | //创建一个客户端对象 205 | public class TestSocket001 { 206 | 207 | public static void main(String[] args) throws IOException { 208 | 209 | //创建客户端对象 210 | Socket socket = new Socket("192.168.0.3",8989); 211 | //发送数据 212 | OutputStream outputStream = socket.getOutputStream(); 213 | //封装过滤流 214 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 215 | dataOutputStream.writeUTF("abc"); 216 | dataOutputStream.flush(); 217 | socket.shutdownOutput();//请求数据发送完成 218 | 219 | 220 | //处理响应结果 221 | InputStream inputStream = socket.getInputStream(); 222 | //封装过滤流 223 | DataInputStream dataInputStream = new DataInputStream(inputStream); 224 | System.out.println(dataInputStream.readUTF()); 225 | socket.shutdownInput();//明确client处理响应完毕 226 | 227 | } 228 | 229 | } 230 | 231 | ``` 232 | ```markdown 233 | TestSocket002 234 | ``` 235 | ```java 236 | package com.yxj.client; 237 | 238 | import java.io.*; 239 | import java.net.Socket; 240 | 241 | //创建一个客户端对象 242 | public class TestSocket002 { 243 | 244 | public static void main(String[] args) throws IOException { 245 | 246 | 247 | for (int i = 0; i <100 ; i++) { 248 | //创建客户端对象 249 | Socket socket = new Socket("192.168.0.3",8989); 250 | //发送数据 251 | OutputStream outputStream = socket.getOutputStream(); 252 | //封装过滤流 253 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 254 | dataOutputStream.writeUTF("aaa"); 255 | dataOutputStream.flush(); 256 | socket.shutdownOutput();//请求数据发送完成 257 | 258 | 259 | //处理响应结果 260 | InputStream inputStream = socket.getInputStream(); 261 | //封装过滤流 262 | DataInputStream dataInputStream = new DataInputStream(inputStream); 263 | System.out.println(dataInputStream.readUTF()); 264 | socket.shutdownInput();//明确client处理响应完毕 265 | } 266 | 267 | 268 | } 269 | 270 | } 271 | ``` 272 | ```markdown 273 | TestSocket003 274 | ``` 275 | ```java 276 | package com.yxj.client; 277 | 278 | import java.io.*; 279 | import java.net.Socket; 280 | 281 | //创建一个客户端对象 282 | public class TestSocket003 { 283 | 284 | public static void main(String[] args) throws IOException { 285 | 286 | //创建客户端对象 287 | Socket socket = new Socket("192.168.0.3",8989); 288 | //发送数据 289 | OutputStream outputStream = socket.getOutputStream(); 290 | //封装过滤流 291 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 292 | dataOutputStream.writeUTF("ccc"); 293 | dataOutputStream.flush(); 294 | socket.shutdownOutput();//请求数据发送完成 295 | 296 | 297 | //处理响应结果 298 | InputStream inputStream = socket.getInputStream(); 299 | //封装过滤流 300 | DataInputStream dataInputStream = new DataInputStream(inputStream); 301 | System.out.println(dataInputStream.readUTF()); 302 | socket.shutdownInput();//明确client处理响应完毕 303 | 304 | } 305 | 306 | } 307 | ``` 308 | ```java 309 | package com.yxj.servers; 310 | 311 | import java.io.*; 312 | import java.net.ServerSocket; 313 | import java.net.Socket; 314 | 315 | //创建服务器端 316 | public class TestServerSocket001 { 317 | 318 | 319 | //操作 进程 开启多线程 进程数量有限的 系统上线 cpu 1 100000000 1 320 | public static void main(String[] args) throws IOException, InterruptedException { 321 | //创建serverSocket对象 322 | ServerSocket serverSocket = new ServerSocket(8989); 323 | System.out.println("服务器已经启动......"); 324 | while (true){ 325 | //接收客户端请求 每一个请求创建一个线程 326 | Socket socket = serverSocket.accept(); 327 | 328 | 329 | //处理请求数据 330 | InputStream inputStream = socket.getInputStream(); 331 | //封装过滤流 332 | DataInputStream dataInputStream = new DataInputStream(inputStream); 333 | String readUTF = dataInputStream.readUTF(); 334 | 335 | 336 | System.out.println(readUTF +" 线程名称:"+Thread.currentThread().getName()); 337 | socket.shutdownInput();//明确处理请求数据完毕 338 | 339 | //处理业务 340 | if(readUTF.equals("abc")){ 341 | Thread.sleep(10000); 342 | } 343 | 344 | //响应客户端对象 345 | OutputStream outputStream = socket.getOutputStream(); 346 | //封装过滤流 347 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 348 | dataOutputStream.writeUTF("我是server,我已经将你发送的请求处理完毕,没事别来找我....."); 349 | socket.shutdownOutput();//明确服务器响应完毕 350 | 351 | 352 | } 353 | } 354 | } 355 | ``` 356 | 357 | ## 10 服务端的多线程操作 358 | ### 10.1 开启多线程的方式 359 | ```java 360 | package com.yxj.threads; 361 | 362 | public class TestThread { 363 | 364 | 365 | public static void main(String[] args) { 366 | 367 | 368 | //创建多线程 方式一: 实现runnable 方式二: 继承Thread类 方式三: 线程池 369 | 370 | 371 | //方式一: 实现runnable接口 run方法 372 | /*MyRunnable myRunnable = new MyRunnable(); 373 | Thread thread = new Thread(myRunnable); 374 | thread.start();*/ 375 | /*new Thread(new Runnable() { 376 | public void run() { 377 | System.out.println("线程名称: "+Thread.currentThread().getName()); 378 | } 379 | }).start();*/ 380 | 381 | //方式二: extends Thread类 382 | MyThread myThread = new MyThread(); 383 | myThread.start(); 384 | } 385 | 386 | } 387 | ``` 388 | ```markdown 389 | TestServerSocket001 390 | ``` 391 | ```java 392 | package com.yxj.servers; 393 | 394 | import java.io.*; 395 | import java.net.ServerSocket; 396 | import java.net.Socket; 397 | 398 | //创建服务器端 399 | public class TestServerSocket001 { 400 | 401 | 402 | //操作 进程 开启多线程 进程数量有限的 系统上线 cpu 1 100000000 1 403 | public static void main(String[] args) throws IOException, InterruptedException { 404 | //创建serverSocket对象 405 | ServerSocket serverSocket = new ServerSocket(8989); 406 | System.out.println("服务器已经启动......"); 407 | while (true){ 408 | //接收客户端请求 每一个请求创建一个线程 409 | final Socket socket = serverSocket.accept(); 410 | new Thread(new Runnable() { 411 | public void run() { 412 | try { 413 | //处理请求数据 414 | InputStream inputStream = socket.getInputStream(); 415 | //封装过滤流 416 | DataInputStream dataInputStream = new DataInputStream(inputStream); 417 | String readUTF = dataInputStream.readUTF(); 418 | 419 | 420 | System.out.println(readUTF +" 线程名称:"+Thread.currentThread().getName()); 421 | socket.shutdownInput();//明确处理请求数据完毕 422 | 423 | //处理业务 424 | if(readUTF.equals("abc")){ 425 | Thread.sleep(10000); 426 | } 427 | 428 | //响应客户端对象 429 | OutputStream outputStream = socket.getOutputStream(); 430 | //封装过滤流 431 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 432 | dataOutputStream.writeUTF("我是server,我已经将你发送的请求处理完毕,没事别来找我....."); 433 | socket.shutdownOutput();//明确服务器响应完毕 434 | } catch (IOException e) { 435 | e.printStackTrace(); 436 | } catch (InterruptedException e) { 437 | e.printStackTrace(); 438 | } 439 | } 440 | }).start(); 441 | 442 | 443 | 444 | } 445 | } 446 | } 447 | ``` 448 | 449 | ## 11 线程池(Executors)的服务端 450 | ```markdown 451 | TestThreadPool 452 | ``` 453 | 454 | ```java 455 | package com.yxj.threadpools; 456 | 457 | import java.util.concurrent.*; 458 | 459 | public class TestThreadPool { 460 | 461 | public static void main(String[] args) { 462 | 463 | //创建线程池对象 464 | //参数1: 线程池中核心线程数量 465 | //参数2: 线程池中最大线程数 466 | //参数3: 线程池中线程的空闲时间 467 | //参数4: 决定线程中线程的空闲时间的单位 TimeUnit 468 | //参数5: 线程等待队列 469 | //参数6: 创建线程工厂 470 | //参数7: 用于被拒绝任务的处理程序 471 | // 策略一: 直接拒绝 new ThreadPoolExecutor.AbortPolicy() RejectedExecutionHandler 线程拒绝处理器 472 | // 策略二: 在调用execute方法的程序中执行该任务 new ThreadPoolExecutor.CallerRunsPolicy() 如果程序已经结束则丢弃任务 473 | // 策略三: new ThreadPoolExecutor.DiscardOldestPolicy() 丢弃等待队列中的请求,然后重试 execute ,除非执行程序被关闭,在这种情况下,任务被丢弃。 474 | // 策略四: new ThreadPoolExecutor.DiscardPolicy() 丢弃最后一次无法执行的任务 静默丢弃 475 | ArrayBlockingQueue workQueue = new ArrayBlockingQueue(1); 476 | ThreadFactory threadFactory = Executors.defaultThreadFactory(); 477 | ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 478 | 1, //核心线程池数量 银行窗口 3 479 | 2, //线程池最大线程数量 临时窗口 5-3 480 | 10, //空闲10 481 | TimeUnit.SECONDS, //单位 秒 482 | workQueue, //线程等待队列 银行中小板凳 2 483 | threadFactory, //创建新线程工厂 484 | new ThreadPoolExecutor.DiscardPolicy()); //拒绝处理器 485 | 486 | //调用线程池对象中execute方法执行线程任务 487 | 488 | /* for (int i = 1; i <=8 ; i++) { 489 | threadPoolExecutor.execute(new MyRunnable()); 490 | }*/ 491 | threadPoolExecutor.execute(new Runnable() { 492 | public void run() { 493 | System.out.println("任务1 "+Thread.currentThread().getName()); 494 | } 495 | }); 496 | 497 | 498 | threadPoolExecutor.execute(new Runnable() { 499 | public void run() { 500 | System.out.println("任务2 "+Thread.currentThread().getName()); 501 | } 502 | }); 503 | 504 | 505 | 506 | threadPoolExecutor.execute(new Runnable() { 507 | public void run() { 508 | System.out.println("任务3 "+Thread.currentThread().getName()); 509 | } 510 | }); 511 | 512 | threadPoolExecutor.execute(new Runnable() { 513 | public void run() { 514 | System.out.println("任务4 "+Thread.currentThread().getName()); 515 | } 516 | }); 517 | 518 | 519 | 520 | 521 | } 522 | 523 | } 524 | 525 | class MyRunnable implements Runnable{ 526 | public void run() { 527 | System.out.println("任务.......线程名称:"+Thread.currentThread().getName()); 528 | /*try { 529 | //Thread.sleep(10000); 530 | } catch (InterruptedException e) { 531 | e.printStackTrace(); 532 | }*/ 533 | } 534 | } 535 | 536 | ``` 537 | ```markdown 538 | TestThreadPool001 539 | ``` 540 | 541 | ```java 542 | package com.yxj.threadpools; 543 | 544 | import java.util.concurrent.ExecutorService; 545 | import java.util.concurrent.Executors; 546 | import java.util.concurrent.Future; 547 | 548 | public class TestThreadPool001 { 549 | 550 | public static void main(String[] args) { 551 | 552 | //无界线程池,可以进行自动线程回收 线程数目没有限制 553 | ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 554 | 555 | //固定线程池 线程池中线程数固定 556 | ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10); 557 | 558 | //单一线程池 所有任务均在一个线程中执行 559 | ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); 560 | 561 | //提交线程任务 562 | 563 | Future submit = cachedThreadPool.submit(new Runnable() { 564 | public void run() { 565 | System.out.println("==============="); 566 | } 567 | }); 568 | 569 | 570 | System.out.println(submit.isDone()); 571 | 572 | 573 | } 574 | 575 | } 576 | 577 | ``` 578 | ```markdown 579 | TestServerSocket002 580 | ``` 581 | ```java 582 | package com.yxj.servers; 583 | 584 | import java.io.*; 585 | import java.net.ServerSocket; 586 | import java.net.Socket; 587 | import java.util.concurrent.ExecutorService; 588 | import java.util.concurrent.Executors; 589 | 590 | //创建服务器端 591 | public class TestServerSocket002 { 592 | 593 | 594 | //操作 进程 开启多线程 进程数量有限的 系统上线 cpu 1 100000000 1 595 | public static void main(String[] args) throws IOException, InterruptedException { 596 | 597 | //创建线程池 598 | ExecutorService executorService = Executors.newFixedThreadPool(10); 599 | 600 | //创建serverSocket对象 601 | ServerSocket serverSocket = new ServerSocket(8989); 602 | System.out.println("服务器已经启动......"); 603 | while (true){ 604 | //接收客户端请求 每一个请求创建一个线程 605 | final Socket socket = serverSocket.accept(); 606 | 607 | executorService.submit(new Runnable() { 608 | public void run() { 609 | try { 610 | //处理请求数据 611 | 612 | InputStream inputStream = socket.getInputStream(); 613 | //封装过滤流 614 | DataInputStream dataInputStream = new DataInputStream(inputStream); 615 | String readUTF = dataInputStream.readUTF(); 616 | System.out.println(readUTF +" 线程名称:"+Thread.currentThread().getName()); 617 | socket.shutdownInput();//明确处理请求数据完毕 618 | //处理业务 619 | if(readUTF.equals("abc")){ 620 | Thread.sleep(10000); 621 | } 622 | //响应客户端对象 623 | OutputStream outputStream = socket.getOutputStream(); 624 | //封装过滤流 625 | DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 626 | dataOutputStream.writeUTF("我是server,我已经将你发送的请求处理完毕,没事别来找我....."); 627 | socket.shutdownOutput();//明确服务器响应完毕 628 | } catch (IOException e) { 629 | e.printStackTrace(); 630 | } catch (InterruptedException e) { 631 | e.printStackTrace(); 632 | } 633 | } 634 | }); 635 | 636 | 637 | 638 | 639 | } 640 | } 641 | } 642 | 643 | 644 | ``` 645 | ## 12 图片总结 646 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217083130219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 647 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217083153753.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 648 | 649 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217083203886.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 650 | 651 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217083216363.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 652 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217083226453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 653 | 654 | ```markdown 655 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 656 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复 657 | 网络编程,即可获取笔记获取方式。 658 | ``` 659 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 660 | 661 | -------------------------------------------------------------------------------- /博客markdown笔记/前端三大剑客/从前慢-JavaScript之Web API-篇章3.md: -------------------------------------------------------------------------------- 1 | # JavaScript之Web API-篇章3 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071413294450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 3 | 4 | ## 1 BOM 5 | ```markdown 6 | BOM(Browser Object Model)即浏览器对象模型,它提供了 7 | 独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。 8 | ``` 9 | ### 1.1 BOM 的构成 10 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512215143979.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 11 | ```markdown 12 | window 对象是浏览器的顶级对象,它具有双重角色。 13 | 1. 它是 JS 访问浏览器窗口的一个接口。 14 | 2. 它是一个全局对象。定义在全局作用域中的变量、函 15 | 3. 数都会变成 window 对象的属性和方法。 16 | 在调用的时候可以省略 window,前面学习的对话框都属 17 | 于 window 对象方法,如 alert()、prompt() 等。 18 | 注意:window下的一个特殊属性 window.name 19 | 20 | 4. 有了 window.onload 就可以把 JS 代码写到页面元素的 21 | 上方,因为 onload 是等页面内容全部加载完毕, 22 | 再去执行处理函数。 23 | 5. window.onload 传统注册事件方式 只能写一次,如果有多 24 | 个,会以最后一个 window.onload 为准。 25 | 6. 如果使用 addEventListener 则没有限制 26 | 7. DOMContentLoaded 事件触发时,仅当DOM加载完成,不 27 | 包括样式表,图片,flash等等。Ie9以上才支持 28 | 如果页面的图片很多的话, 从用户访问到onload触发可能需要较长 29 | 的时间, 交互效果就不能实现,必然影响用户 30 | 的体验,此时用 DOMContentLoaded 事件比较合适。 31 | ``` 32 | 33 | ### 1.2 window常见事件onload 34 | ```markdown 35 | window.onload 是窗口 (页面)加载事件,当文档内容完全 36 | 加载完成会触发该事件(包括图像、脚本文件、CSS文件等), 37 | 就调用的处理函数。 38 | 注意: 39 | 1 有了 window.onload 就可以把 JS 代码写到页面元素 40 | 的上方,因为 onload 是等页面内容全部加载完毕, 41 | 再去执行处理函数。 42 | 2 window.onload 传统注册事件方式 只能写一次,如 43 | 果有多个,会以最后一个 window.onload 为准。 44 | 3 如果使用 addEventListener 则没有限制 45 | 46 | document.addEventListener('DOMContentLoaded',function(){}) 47 | DOMContentLoaded 事件触发时,仅当DOM加载完成, 48 | 不包括样式表,图片,flash等等。 49 | Ie9以上才支持 50 | 如果页面的图片很多的话, 从用户访问到onload触发可 51 | 能需要较长的时间, 交互效果就不能实现,必然影响用 52 | 户的体验,此时用 DOMContentLoaded 事件比较合适。 53 | ``` 54 | ```html 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Document 63 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | ``` 99 | 100 | ### 1.3 调整窗口大小事件 101 | ```markdown 102 | window.onresize = function(){} 103 | window.addEventListener("resize",function(){}); 104 | 1 只要窗口大小发生像素变化,就会触发这个事件。 105 | 2 我们经常利用这个事件完成响应式布局。 window.innerWidth 106 | 当前屏幕的宽度 107 | ``` 108 | ```html 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | Document 117 | 124 | 125 | 126 | 127 | 143 |
144 | 145 | 146 | 147 | ``` 148 | ### 1.4 定时器 149 | ```markdown 150 | window 对象给我们提供了 2 个非常好用的方法-定时器。 151 | setTimeout() 152 | setInterval() 153 | ``` 154 | #### 1.4.1 定时器之setTimeout 155 | ```markdown 156 | 1 window 可以省略。 157 | 2 这个调用函数可以直接写函数,或者写函数名或者采取字 158 | 符串‘函数名()'三种形式。第三种不推荐 159 | 3 延迟的毫秒数省略默认是 0,如果写,必须是毫秒。 160 | 4 因为定时器可能有很多,所以我们经常给定时器赋值一个标识符。 161 | ``` 162 | ```markdown 163 | setTimeout() 这个调用函数我们也称为回调函数 callback 164 | 普通函数是按照代码顺序直接调用。 165 | 而这个函数,需要等待时间,时间到了才去调用这个函数, 166 | 因此称为回调函数。 167 | 简单理解: 回调,就是回头调用的意思。上一件事干完, 168 | 再回头再调用这个函数。 169 | 以前我们讲的 element.onclick = function(){} 170 | 或者 element.addEventListener(“click”, fn); 171 | 里面的 函数也是回调 172 | 函数。 173 | ``` 174 | ```html 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | Document 183 | 184 | 185 | 186 | 205 | 206 | 207 | 208 | ``` 209 | #### 1.4.2 5秒之后自定关闭的广告 210 | ```markdown 211 | 1 核心思路:5秒之后,就把这个广告隐藏起来 212 | 2 用定时器setTimeout 213 | ``` 214 | ```html 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | Document 223 | 224 | 225 | 226 | 227 | 233 | 234 | 235 | 236 | ``` 237 | #### 1.4.3 清除setTimeout定时器 238 | ```html 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | Document 247 | 248 | 249 | 250 | 251 | 261 | 262 | 263 | 264 | ``` 265 | #### 1.4.4 定时器之setInterval 266 | ```markdown 267 | 1 window 可以省略。 268 | 2 这个调用函数可以直接写函数,或者写函数名或者 269 | 采取字符串 '函数名()' 三种形式。 270 | 3 间隔的毫秒数省略默认是 0,如果写,必须是毫秒, 271 | 表示每隔多少毫秒就自动调用这个函数。 272 | 4 因为定时器可能有很多,所以我们经常给定时器赋值一个标识符。 273 | 5 第一次执行也是间隔毫秒数之后执行,之后每隔毫秒数就执行一次。 274 | ``` 275 | ```html 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | Document 284 | 285 | 286 | 287 | 297 | 298 | 299 | 300 | ``` 301 | #### 1.4.5 倒计时效果(重要) 302 | ```markdown 303 | 1 这个倒计时是不断变化的,因此需要定时器来自动 304 | 变化(setInterval) 305 | 2 三个黑色盒子里面分别存放时分秒 306 | 3 三个黑色盒子利用innerHTML 放入计算的小时分钟秒数 307 | 4 第一次执行也是间隔毫秒数,因此刚刷新页面会有空白 308 | 5 最好采取封装函数的方式, 这样可以先调用一次这个 309 | 函数,防止刚开始刷新页面有空白问 310 | 题 311 | ``` 312 | ```html 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | Document 321 | 337 | 338 | 339 | 340 |
341 | 1 342 | 2 343 | 3 344 |
345 | 369 | 370 | 371 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | Document 383 | 384 | 385 | 386 | 387 | 388 | 402 | 403 | 404 | 405 | ``` 406 | #### 1.4.7 发送短信案例 407 | ```markdown 408 | 点击按钮后,该按钮60秒之内不能再次点击,防止重复发送短信 409 | 1 按钮点击之后,会禁用 disabled 为true 410 | 2 同时按钮里面的内容会变化, 注意 button 里面的内 411 | 容通过 innerHTML修改 412 | 3 里面秒数是有变化的,因此需要用到定时器 413 | 4 定义一个变量,在定时器里面,不断递减 414 | 5 如果变量为0 说明到了时间,我们需要停止定时器, 415 | 并且复原按钮初始状态。 416 | ``` 417 | ```html 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | Document 426 | 427 | 428 | 429 | 手机号码: 430 | 454 | 455 | 456 | 457 | ``` 458 | #### 1.4.8 this指向问题 459 | ```markdown 460 | this的指向在函数定义的时候是确定不了的,只 461 | 有函数执行的时候才能确定this到底指向谁,一般情况下this 462 | 的最终指向的是那个调用它的对象 463 | 现阶段,我们先了解一下几个this指向 464 | 1. 全局作用域或者普通函数中this指向全局对象 465 | 2. window(注意定时器里面的this指向window) 466 | 3. 方法调用中谁调用this指向谁 467 | 3.构造函数中this指向构造函数的实例 468 | ``` 469 | ```html 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | Document 478 | 479 | 480 | 481 | 482 | 521 | 522 | 523 | 524 | ``` 525 | #### 1.4.9 js 执行队列 526 | ```markdown 527 | JavaScript 语言的一大特点就是单线程,也就是说, 528 | 同一个时间只能做一件事。这是因为 Javascript 这门脚 529 | 本语言诞生的使命所致——JavaScript 是为处理页面 530 | 中用户的交互,以及操作 DOM 而诞生的。比如我们对 531 | 某个 DOM 元素进行添加和删除操作,不能同时进行。 532 | 应该先进行添加,之后再删除。 533 | 4.1 JS 是单线程 534 | 单线程就意味着,所有任务需要排队,前一个任务结束, 535 | 才会执行后一个任务。这样所导致的问题是: 如果 536 | JS 执行的时间过长,这样就会造成页面的渲染不连贯, 537 | 导致页面渲染加载阻塞的感觉。 538 | ``` 539 | ```markdown 540 | 解决方案 541 | 为了解决这个问题,利用多核 CPU 的计算能力,HTML5 542 | 提出 Web Worker 标准,允许 JavaScript 脚本创建多 543 | 个线程。于是,JS 中出现了同步和异步。 544 | 同步 545 | 前一个任务结束后再执行后一个任务,程序的执行 546 | 顺序与任务的排列顺序是一致的、同步的。比如做 547 | 饭的同步做法:我们要烧水煮饭,等水开了(10分钟之后), 548 | 再去切菜,炒菜。 549 | 异步 550 | 你在做一件事情时, 因为这件事情会花费很长时间, 551 | 在做这件事的同时,你还可以去处理其他事情。比如做 552 | 饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。 553 | 他们的本质区别: 这条流水线上各个流程的执行顺序不同。 554 | ``` 555 | 556 | ```markdown 557 | js执行机制 558 | ``` 559 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512230500568.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 560 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512230543434.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 561 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512230351750.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 562 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512231727189.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 563 | 564 | ```html 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | Document 573 | 574 | 575 | 576 | 610 | 611 | 612 | 613 | ``` 614 | #### 1.4.10 location对象属性 615 | ```markdown 616 | window 对象给我们提供了一个 location 属 617 | 性用于获取或设置窗体的 URL,并且可以 618 | 用于解析 URL 。 因为这个属性返回的是一 619 | 个对象,所以我们将这个属性也称为 location 对象。 620 | ``` 621 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512232047101.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 622 | #### 1.4.11 5秒钟之后跳转页面 623 | ```markdown 624 | 1 利用定时器做倒计时效果 625 | 2 时间到了,就跳转页面。 使用 location.href 626 | ``` 627 | ```html 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | Document 636 | 637 | 638 | 639 | 640 |
641 | 659 | 660 | 661 | 662 | ``` 663 | #### 1.4.12 获取URL参数 664 | ```markdown 665 | 1 第一个登录页面,里面有提交表单, action 提交 666 | 到 index.html页面 667 | 2 第二个页面,可以使用第一个页面的参数,这 668 | 样实现了一个数据不同页面之间的传递效果 669 | 3 第二个页面之所以可以使用第一个页面的数据,是 670 | 利用了URL 里面的 location.search参数 671 | 4 在第二个页面中,需要把这个参数提取。 672 | 5 第一步去掉? 利用 substr 673 | 6 第二步 利用=号分割 键 和 值 split(‘=‘) 674 | 7 第一个数组就是键 第二个数组就是值 675 | ``` 676 | ```html 677 | index.html 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | Document 686 | 687 | 688 | 689 |
690 | 702 | 703 | 704 | 705 | 706 | login.html 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | Document 715 | 716 | 717 | 718 |
719 | 用户名: 720 | 721 | 722 | 723 | 724 | 725 | ``` 726 | 727 | #### 1.4.13 location 对象的方法 728 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716124929955.png) 729 | ```html 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | Document 738 | 739 | 740 | 741 | 742 | 752 | 753 | 754 | 755 | ``` 756 | ##### 1.4.13.1 navigator 对象 757 | ```markdown 758 | navigator 对象包含有关浏览器的信息,它有很多 759 | 属性,我们最常用的是 userAgent,该属性可以 760 | 返回由客户机发送服务器的 user-agent 头部的 761 | 值.应用场景:不同终端设备的识别 762 | ``` 763 | ```javascript 764 | if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android| 765 | Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS 766 | |Symbian|Windows Phone)/i))) { 767 | window.location.href = ""; //手机 768 | } else { 769 | window.location.href = ""; //电脑 770 | } 771 | ``` 772 | 773 | ##### 1.4.13.2 history对象 774 | ```markdown 775 | window 对象给我们提供了一个 history 对象, 776 | 与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中) 777 | 访问过的 URL。 778 | ``` 779 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512233415772.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70) 780 | ```html 781 | index.html 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | Document 790 | 791 | 792 | 793 | 点击我去往列表页 794 | 795 | 802 | 803 | 804 | 805 | 806 | list.html 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | Document 815 | 816 | 817 | 818 | 点击我去往首页 819 | 820 | 827 | 828 | 829 | 830 | ``` 831 | ```markdown 832 | 想要获取该该课程markdown笔记(脑图+笔记)。可以扫描以下 833 | 微信公众号二维码。或者搜索微信公众号-Java大世界。回复w3 834 | 即可获取笔记获取方式。 835 | ``` 836 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070416020088.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXF1ZV9wZXJmZWN0,size_16,color_FFFFFF,t_70#pic_center) 837 | --------------------------------------------------------------------------------